在 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" 在验证后未重新填充。

有两个问题:

  1. 您的登录操作

    <action name="login">
        <interceptor-ref name="store">
            <param name="operationMode">RETRIEVE</param>
        </interceptor-ref>
        <result>login.jsp</result>
    </action>
    

    只有 一个 拦截器,MessageStore 一个。

    它应该 至少 ModelDrivenParameters 拦截器才能正常工作。例如

    <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 之外的所有拦截器,否则 MessageStoreRETRIEVE 将使它循环,或者,如果您尚未为您的登录操作定义输入结果,抱怨缺少 input 结果。

  2. 第二个错误是您正在重定向,因此丢失了参数。您正在使用 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>