2

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

项目结构:

项目结构

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>

登录操作.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>
4

6 回答 6

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 两者都应该相同并且还添加命名空间

于 2013-12-17T07:29:56.503 回答
1

我没有足够的分数来回应 Ryan 的评论,也没有给他打分,但他所说的在具体案例中是一个有效的解决方案,我将说明原因。

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

让我用一个实际的例子来解释我自己,这些例子可能是一些提出这个问题的伙伴想到的:

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

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

于 2015-02-05T12:25:12.870 回答
1

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

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

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

在此处输入图像描述

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

于 2015-02-02T01:54:50.147 回答
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"/>

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

于 2014-02-28T10:33:48.280 回答
0

对 struts.xml 文件进行更改,添加namespace="/"属性 <package name="default" namespace="/" extends="struts-default">

于 2016-07-07T07:15:04.653 回答
0

为了解决这个问题,我必须在其中创建一个类文件夹WEB-INF并将struts.xml文件放在那里。然后我将.jsp文件放在web文件夹中并放在文件'/'之前.jsp,例如/x.jsp

于 2017-07-21T22:10:34.887 回答