在 Struts2 中 xml 验证后无法重新填充值
Unable to repopulate values after xml validation in Struts2
我最近在使用 Struts2 框架和验证我使用的字段的登录页面 XML Struts2 提供的验证 功能。并且字段已验证,但问题是,如果验证后任何字段不为空,则不会在相应的 field.The 示例代码中重新填充这些字段值 given.The 框架版本为 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" 在验证后未重新填充。
有两个问题:
您的登录操作
<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
拦截器总是添加错误,而工作流拦截器总是 returning "input";为避免这种情况,您应该在 struts.xml 中定义一个辅助 defaultStack ,其中包含除 Workflow
之外的所有拦截器,否则 MessageStore
和 RETRIEVE
将使它循环,或者,如果您尚未为您的登录操作定义输入结果,抱怨缺少 input
结果。
第二个错误是您正在重定向,因此丢失了参数。您正在使用 MessageStore
拦截器在重定向过程中保留操作消息、操作错误和字段错误,但所有其他参数都丢失了。如果要在 redirectAction
中保留参数,则必须显式发送它,或者将其存储在源操作的会话中并在目标操作中检索它。在你的情况下,如果 input
结果,最好简单地 return JSP,而不是重定向:
<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" >login.jsp</result>
</action>
<action name="login">
<interceptor-ref name="defaultStack" />
<result>login.jsp</result>
</action>
我最近在使用 Struts2 框架和验证我使用的字段的登录页面 XML Struts2 提供的验证 功能。并且字段已验证,但问题是,如果验证后任何字段不为空,则不会在相应的 field.The 示例代码中重新填充这些字段值 given.The 框架版本为 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" 在验证后未重新填充。
有两个问题:
您的登录操作
<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
拦截器总是添加错误,而工作流拦截器总是 returning "input";为避免这种情况,您应该在 struts.xml 中定义一个辅助 defaultStack ,其中包含除Workflow
之外的所有拦截器,否则MessageStore
和RETRIEVE
将使它循环,或者,如果您尚未为您的登录操作定义输入结果,抱怨缺少input
结果。第二个错误是您正在重定向,因此丢失了参数。您正在使用
MessageStore
拦截器在重定向过程中保留操作消息、操作错误和字段错误,但所有其他参数都丢失了。如果要在redirectAction
中保留参数,则必须显式发送它,或者将其存储在源操作的会话中并在目标操作中检索它。在你的情况下,如果input
结果,最好简单地 return JSP,而不是重定向:<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" >login.jsp</result> </action> <action name="login"> <interceptor-ref name="defaultStack" /> <result>login.jsp</result> </action>