HTTP 状态 404 - 没有映射与上下文路径 [/struts2] 关联的命名空间 [/] 和操作名称 [login] 的操作

问题描述 投票:0回答:7

我已经学习了Struts2的理论,现在正在练习。在执行项目时遇到问题。我在 Google 中搜索了很多方法但找不到结果。请帮助我。下面是代码。请朋友们帮助我...

项目结构:

Project structure

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"              xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>struts2</display-name>
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>

struts.xml

<!DOCTYPE struts PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
      "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

<constant name="resources" value="ApplicationResources" />
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
    <action name="login" class="com.practice.structs.actions.LoginAction"
        method="validateUser">
        <result name="success">pages/homepage.jsp</result>
        <result name="error">pages/login.jsp</result>
    </action>

</package>

LoginAction.java

package com.practice.structs.actions;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
private String userName;
private String password;
public String validateUser(){
    if(this.userName.equalsIgnoreCase("abc") && this.password.equalsIgnoreCase("abc"))
    {
        return "success";
    }else{
        addActionError(getText("error.login"));
        return "error";
    }
}

/**
 * @return the userName
 */
public String getUserName() {
    return userName;
}
/**
 * @param userName the userName to set
 */
public void setUserName(String userName) {
    this.userName = userName;
}
/**
 * @return the password
 */
public String getPassword() {
    return password;
}
/**
 * @param password the password to set
 */
public void setPassword(String password) {
    this.password = password;
}


}

登录.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>

<title>Login page</title>
</head>
<body>
<H1><I>Login Page</I></H1>
<s:actionerror />
<s:form action="login.action" method="post">
    <s:textfield name="uname" key="label.username" size="20"/>
    <s:password name="password" key="label.password" size="20"/>
    <s:submit method="execute" key="label.login" align="center"/>
</s:form>
</body>
</html>

主页.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Home Page</title>
</head>
<body>
<H2><I>Welcome</I></H2>
</body>
</html>
java struts2 struts2-namespace action-mapping
7个回答
2
投票

像这样更改你的代码

 <package name="default" namespace="/" extends="struts-default">
        <action name="login" class="com.practice.structs.actions.LoginAction"
            method="validateUser">
            <result name="success">pages/homepage.jsp</result>
            <result name="error">pages/![enter image description here][1]login.jsp</result>
        </action>

    </package>


<s:form action="login" method="post">
    <s:textfield name="uname" key="label.username" size="20"/>
    <s:password name="password" key="label.password" size="20"/>
    <s:submit method="execute" key="label.login" align="center"/>
</s:form>

表单中的操作名称是action.login,在struts.xml中是login,两者应该相同,并且还添加命名空间


2
投票

我知道这个问题有点过时了,但我也认为对于那些碰巧再次偶然发现这篇文章并仍然遇到该问题的人来说,这是值得一提的;假设您 100% 确定您的映射正确并且您的 web.xml 包含适当的过滤器,请尝试以下操作:

  1. 停止 Tomcat 服务器
  2. 在“WEB-INF”文件夹中创建一个“classes”文件夹
  3. 将 struts.xml 文件移至新创建的“classes”文件夹中
  4. 右键单击您的 Tomcat 服务器并选择“清理” - 不是必需的,但建议这样做。
  5. 再次启动 Tomcat,祝一切顺利 :-)

作为视觉辅助工具,您的 WEB-INF 最终应该看起来像这样:

enter image description here

如果您仍然遇到该问题,请再次仔细检查您的 struts 映射以及 web.xml


1
投票

我没有足够的积分来回应 Ryan 的评论或评价他,但他所说的是具体情况下的有效解决方案,我将告诉你原因。

有时您在项目中创建的文件夹不会被视为应用程序的资源,您必须对其进行配置。

我用一个实际的例子来解释一下,可能有些问这个问题的小伙伴也曾想到过:

当您使用 Eclipse 进行开发时,也许您选择了 Eclipse 默认的“Project Explorer”之外的另一个项目浏览器,例如“Navigator”。 使用“Navigator”视图,您可以创建文件夹,但该文件夹不是包资源(就像您使用默认的“Project Explorer”创建“包资源”时一样),因此Struts2无法找到“struts.xml”文件进行配置行动。 因此,您的项目将作为“包资源”处理的唯一文件夹是 WEB-INF 下的文件夹,就像 Eclipse 默认在“动态 Web 项目”中所做的那样。

那么,请确保将所有配置文件都放在“包资源”中。


0
投票

在您的

LoginAction.java
属性中,您获取的是

private String userName;
private String password;

但是在你

login.jsp
你写的是

<s:textfield name="uname" key="label.username" size="20"/>
    <s:password name="password" key="label.password" size="20"/>

改变

<s:textfield name="uname" key="label.username" size="20"/>

<s:textfield name="userName" key="label.username" size="20"/>

我希望这个答案能解决您的问题...


0
投票

对struts.xml文件进行修改,添加

namespace="/"
属性 喜欢
<package name="default" namespace="/" extends="struts-default">


0
投票

为了解决这个问题,我必须在

WEB-INF
中创建一个类文件夹并将
struts.xml
文件放在那里。然后我将
.jsp
文件放在 web 文件夹中,并将
'/'
放在
.jsp
文件之前,例如
/x.jsp


0
投票

我正在使用

websphere
运行Web应用程序,需要额外使用struts.xml

另外,将

<action name="">
设置为这个答案,然后url
http://localhost:port/{context root}/
就会显示欢迎文件
login.jsp

<package name="dst" extends="struts-default" namespace="/">

    <action name="">
        <result>/login.jsp</result>
    </action>
</package>
© www.soinside.com 2019 - 2024. All rights reserved.