Почему 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>