0

我正在做这个初学者Struts2 登录教程 并且我得到了它的工作,除了,当登录页面被访问时,它不会首先找到标签的属性。所以而不是: 在此处输入图像描述

我得到登录页面:

在此处输入图像描述 和错误页面:

在此处输入图像描述

但是,当登录成功时,它会使用简单的属性标签找到属性<s:property value="username" />
在此处输入图像描述

我在这里俯瞰什么?

登录.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Struts 2 - Login Application</title>
</head>

<body>
<h2>Struts 2 - Login Application</h2>
<s:actionerror />
<s:form action="login.action" method="post">
    <s:textfield name="username" key="label.username" size="20" />
    <s:password name="password" key="label.password" size="20" />
    <s:submit method="authenticate" key="label.login" align="center" />
</s:form>
</body>
</html>

Welcome.jsp(登录成功时)

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Welcome</title>
</head>

<body>
    <h2>Howdy, <s:property value="username" />...!</h2>
</body>
</html>

struts.xml 包含的 login.xml

<?xml version="1.0" encoding="UTF-8"?>

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

<struts>
      <constant name="struts.custom.i18n.resources"
        value="Credentials" />
    <package name="Login" namespace="/login" extends="struts-default">
        <action name="login"
    method ="authenticate"
            class="Login.LoginAction">
            <result name="success">/login/Welcome.jsp</result>
            <result name="error">/login/Login.jsp</result>
        </action>
    </package>
</struts>

登录动作类:

package Login;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
    private String username;
    private String password;

    public String authenticate() {

     if (this.username.equals("admin") 
                && this.password.equals("admin123")) {
            return "success";
        } else {
            addActionError(getText("error.login"));
            return "error";
        }
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

属性文件 Credentials.properties

label.username= Username
label.password= Password
label.login= Login
error.login= Invalid Username/Password. Please try again.

文件结构:
在此处输入图像描述

4

3 回答 3

1

看完这篇,看来是文件结构问题。显然,属性文件需要放在 WEB-INF 下。我使用的结构是在遵循NetBeans 框架教程之后将框架指定为 Struts2 时提供的,该教程有一个示例项目,其属性不在 WEB-INF 下。

于 2014-04-03T13:16:33.850 回答
0

您可以将所有动作的所有资源放在默认的 struts 资源包中,或者将每个动作资源放在自己的包中。

我建议第一种方法可以消除大量重复,您可以使用jrc-editor轻松管理所有资源包。

因此,在运行服务器后的示例中,必须将文件复制到WEB-INF/classes/resources/然后

<constant name="struts.custom.i18n.resources"
        value="resources/login/Credentials.properties" />

PS:你可以有

<constant name="struts.custom.i18n.resources"
        value="resources/login/Credentials.properties,resources/login/Otherfile.properties" />
于 2014-04-05T05:02:36.393 回答
0

使用 <s:message>

<s:form action="login.action" method="post">
    <s:message code="label.username" text="defUsername">
    <s:textfield name="username" size="20" />

    <s:message code="label.password" text="defPassword">
    <s:password name="password" size="20" />

    <s:submit method="authenticate" align="center" >
      <s:message code="label.login" var="var_lbl_login">
    </s:submit>
</s:form>
于 2017-06-29T10:37:19.633 回答