Почему jsp не видит атрибут по умолчанию в файле свойств?

Я делаю это учебное пособие по входу в Struts2 для начинающих, и оно работает, за исключением того, что при входе на страницу входа в систему он не находит атрибуты для ярлыков. Так что вместо:

Я получаю страницу входа:

И ошибка страницы:



Однако при успешном входе в систему он находит атрибут с помощью простого тега свойства. <s:property value="username" />

Что я здесь пропускаю?

Login.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>

login.xml включен Struts.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>

LoginAction class:

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.

Структура файла:

3 ответа

Решение

Вы можете поместить все ресурсы для всех действий в стандартный блок ресурсов 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" />

После прочтения это, похоже, проблема с файловой структурой. Очевидно, что файлы свойств должны идти под WEB-INF. Структура, которую я использовал, была такой, что когда-то указывал платформу как Struts2 после изучения учебника по среде NetBeans, в котором был пример проекта со свойствами, не относящимися к WEB-INF.

используйте

<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>
Другие вопросы по тегам