我最近使用带有 Struts2 框架的登录页面,并验证了我使用提供的 XML验证 功能的字段Struts2的即可。并验证了字段,但问题是,如果验证后任何字段不为空,那么这些字段值不会在相应的字段中重新填充。给出了示例代码。框架的版本是2.5.x.
的Login.jsp
<s:form method="post" action="authenticate">
<div class="form-group">
<span class="input-icon">
<s:textfield name="strUserName" id="strUserName" cssClass="form-control" placeholder="Username or Email"></s:textfield>
<i class="fa fa-user"></i>
</span>
<span>
<s:fielderror fieldName="strUserName"/>
</span>
</div>
<div class="form-group">
<span class="input-icon">
<s:password name="strPassword" id="strPassword" cssClass="form-control" placeholder="Password"></s:password> <i class="fa fa-lock"></i>
</span>
<span>
<s:fielderror fieldName="strPassword"/>
</span>
</div>
</s:form>
struts.xml中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.action.extension" value=",json"/>
<!-- Set to false before deploying the application -->
<constant name="struts.devMode" value="true" />
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.configuration.xml.reload" value="false" />
<!-- constant to define global resource bundle -->
<constant name="struts.custom.i18n.resources" value="globalMessages" />
<constant name="struts.ui.theme" value="simple" />
<package name="<package_name>" namespace="/" extends="struts-default">
<action name="authenticate" class="<Action_class_name>" method="<method_name>">
<interceptor-ref name="store">
<param name="operationMode">STORE</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result type="redirectAction">Successpage</result>
<result name="input" type="redirectAction">login</result>
</action>
<action name="login">
<interceptor-ref name="store">
<param name="operationMode">RETRIEVE</param>
</interceptor-ref>
<result>login.jsp</result>
</action>
</package>
</struts>
ACTION_NAME-validation.xml中
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<validator type="requiredstring">
<param name="fieldname">strUserName</param>
<param name="trim">true</param>
<message key="errors.required"></message>
</validator>
<validator type="requiredstring">
<param name="fieldname">strPassword</param>
<param name="trim">true</param>
<message key="errors.required"></message>
</validator>
</validators>
Action_name.java
public class Action_name extends ActionSupport implements ModelDriven<UserModel> {
private UserModel user;
public String method_name() {
if(success){
return SUCCESS;
}else{
return INPUT;
}
}
@Override
public UserModel getModel() {
user = new UserModel();
return user;
}
}
申请 - 初始运行
申请 - 验证后
验证后值“xyz”未重新填充。
答案 0 :(得分:1)
有两个问题:
您的登录操作
<action name="login">
<interceptor-ref name="store">
<param name="operationMode">RETRIEVE</param>
</interceptor-ref>
<result>login.jsp</result>
</action>
只有一个拦截器,MessageStore
拦截器。
它应该至少 ModelDriven
和Parameters
拦截器才能正常工作。例如
<action name="login">
<interceptor-ref name="store">
<param name="operationMode">RETRIEVE</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
<result>login.jsp</result>
</action>
但请注意,由于MessageStore
拦截器总是添加错误而工作流拦截器始终返回“输入”,这会导致无限递归;要避免它,你应该在struts.xml中定义一个辅助defaultStack,除了Workflow
之外的所有交织者,否则带有MessageStore
的{{1}}会使它循环,或者如果你没有'为您的登录操作定义了输入结果,抱怨缺少RETRIEVE
结果。
第二个错误是您正在重定向,因此丢失了参数。您正在使用input
拦截器在重定向中保留操作消息,操作错误和字段错误,但每个其他参数都会丢失。如果要在MessageStore
中保留参数,则必须显式发送它,或将其存储在源操作中的会话中并在目标操作中检索它。在您的情况下,最好在redirectAction
结果的情况下简单地返回JSP,而不是重定向:
input