在Struts2

时间:2016-09-02 09:34:16

标签: validation struts2

我最近使用带有 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;
    }
}

申请 - 初始运行

enter image description here

申请 - 验证后

enter image description here

验证后

值“xyz”未重新填充。

1 个答案:

答案 0 :(得分:1)

有两个问题:

  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拦截器总是添加错误而工作流拦截器始终返回“输入”,这会导致无限递归;要避免它,你应该在struts.xml中定义一个辅助defaultStack,除了Workflow之外的所有交织者,否则带有MessageStore的{​​{1}}会使它循环,或者如果你没有'为您的登录操作定义了输入结果,抱怨缺少RETRIEVE结果。

  2. 第二个错误是您正在重定向,因此丢失了参数。您正在使用input拦截器在重定向中保留操作消息,操作错误和字段错误,但每个其他参数都会丢失。如果要在MessageStore中保留参数,则必须显式发送它,或将其存储在源操作中的会话中并在目标操作中检索它。在您的情况下,最好在redirectAction结果的情况下简单地返回JSP,而不是重定向:

    input