【问题标题】:Unable to repopulate values after xml validation in Struts2 [duplicate]在 Struts2 中进行 xml 验证后无法重新填充值 [重复]
【发布时间】:2017-01-10 09:01:29
【问题描述】:

我最近正在使用 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”。

【问题讨论】:

  • 出于安全原因,您不应重新填充该字段。
  • @RomanC 它不仅在登录表单中,而且在其他具有相同配置的表单中都不起作用。
  • 这就是为什么不工作但其他形式不相关的原因。
  • 我不知道为什么它被标记为 Duplicate。它确实有相似之处,但这不是我在这里问的。我的代码中给出了一个类型 redirectAction 这就是为什么没有已填充,您不会在其他问题中找到它。因此,请在将其标记为重复之前阅读该问题。
  • 重复问题是之前已经问过的问题。你问了几年前回答过的同一个问题,你的问题对社区没有用处。您应该知道 SO 不是 Help and Support* 网站,而是 Q&A。在将问题发布到此处之前,您应该知道how to ask 的问题。同样,您的问题已经解决了。

标签: validation struts2


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

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

【讨论】:

  • 添加 &lt;interceptor-ref name="defaultStack" /&gt; 没有改变,仍然没有重新填充。
  • 第二个解决了这个问题,谢谢你。但是正如你所说,我怎样才能在不删除redirectAction的情况下保留整个动作的参数。
  • 你对范围拦截器了解多少?我只是听说我不知道​​它是什么。这将有助于解决这个问题吗??
  • 从未使用过范围拦截器。最好的办法是去掉redirectAction,否则你需要一一指定参数,或者doing black magic like I've did here,但是说真的……不要在家里尝试这个:)
  • 太好了。在登录表单中删除redirectAction 将解决我的问题。但是还有其他形式存在更棘手的问题,我必须使用redirectAction,因为我在这些动作中有其他处理。你能在这里做一些“黑魔法”吗?:)。你从中得到了什么stackoverflow.com/questions/12773877/…
猜你喜欢
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多