【问题标题】:Error in addFieldError with <s:select> in Struts2Struts2 中带有 <s:select> 的 addFieldError 错误
【发布时间】:2015-05-14 23:40:51
【问题描述】:

我是 Struts2 的新手,尝试在我的表单中使用带有 &lt;s:select&gt; 标签的 addFieldError。 我有一个表单,我必须从下拉列表中选择一个值。第一次显示此表单时,响应来自一个 Action 类,我在其中创建了一个 List。在我的表单中,我使用&lt;s:select&gt; 标签在下拉列表中打印该列表,如下所示:

<s:form action="clientselect">
  <h2>Select Client to add the case :</h2>  
  <table>
    <s:select list="list" headerKey="-1" headerValue="Select Client"
              label="Select Client" tooltip="Select the desired client" name="client">
    </s:select>

    <tr><td><s:submit value="Register Case" theme="simple" align="right"/></td>
    <td><s:reset value="Reset" theme="simple" align="right"/></td></tr>
  </table>
</s:form>

"pageinclude=ancar" 打印此表单。

struts.xml

<action name="clientselect" class="casediary.JudicialCaseRegisterValidation" method="execute">
  <result name="addcase">user.jsp?pageinclude=ncr</result>
  <result name="error">user.jsp?pageinclude=errancar</result>
  <result name="input">user.jsp?pageinclude=ancar</result>
  <result name="loggedout">index.jsp?pageinclude=relogin</result>
</action>

在 JudicialCaseRegisterValidation.java 中

public void validate()
{       
    if(client==null || client.equals("-1"))     
        addFieldError("client", "This field can not be blank.");
}

一切正常。错误条件得到满足,结果我得到“输入”。错误消息也在打印,但下拉列表中的值已消失。列表打印为空。因为这个时间响应不是来自设置 List 的 Action 类。

然后我更改了我的 struts.xml 以将请求从 &lt;result&gt; 发送到 Action 类,如下所示:

<result name="input"  type="redirect">link.action</result>

“link.action”是在 Action 类中发送请求以创建列表并打印该表单的内容。

但这次只是再次打印表单,没有打印任何错误消息。

我希望再次打印该列表以及除此之外的错误消息。请告诉如何。?

【问题讨论】:

    标签: java jsp struts2


    【解决方案1】:

    几乎所有从 Struts2 开始的人迟早都会遇到这个问题。

    在 Struts2 中请求 Action 时,您的请求将传递 through an Interceptor Stack(拦截器列表);每个 Interceptor 所做的都是特定的业务,然后将请求重定向(以防出错)或继续执行到下一个 Interceptor,如果是最后一个则执行到 Action。

    验证由验证拦截器执行。如果验证失败,它将劫持请求并将其重定向到struts.xml中定义的input结果。无论验证是通过 XMLAnnotation 还是 validate( ) Action 内的方法:Action 未到达! 然后,execute() 方法内的所有内容,或您正在调用的方法(如果您使用自定义一)不执行;

    如果execute()方法要求加载List元素,则在输入结果的情况下不会执行。

    避免这个问题的主要方法是:

    1. 实现Preparable Interface,并将所有数据加载内容放入prepare()方法中。
      该方法由 Prepare Interceptor 运行,位于 Validation Interceptor 之前;
      它将始终运行,并且它将在验证之前运行,无论您调用的是哪种操作方法(execute() 或其他),也不会如果您遇到验证错误;

    2. 使用JSP中的&lt;s:action/&gt;标签,调用返回JSP sn-ps的虚拟Action;

    3. 使用 redirectAction 作为 输入 结果类型,到 execute()(或其他)方法,就像你正在做的那样。
      在重定向时,它会丢失所有请求参数(包括操作错误、字段错误、操作消息等),然后您需要通过在 struts.xml 中将它们声明为redirectAction 结果的参数来手动复制它们.

    第一种方式是首选,恕我直言。

    编辑:

    刚刚在官方文档中也找到了:how do we repopulate controls when validation fails ?

    【讨论】:

    • 感谢安德烈的提示。你也可以回答this Question吗?
    【解决方案2】:

    我认为 type = "redirectAction" 可以重定向到特定的操作

    像这样的

    &lt;result name="input" type="redirectAction"&gt;link&lt;/result&gt;

    希望对你有帮助

    如果我是正确的,或者你在哪里像这样返回该操作的结果,你可以在你的 execute() 方法中设置它

    list=setList(newList);
    
    return result;
    

    【讨论】:

    • 我试过那个脉轮。在这种情况下,不会打印错误消息。我需要错误消息和下拉列表。
    • 我在 JudcialCaseRegisterValidation.java 中使用 setter 方法。问题是当有错误或者我选择空白时,这个类没有执行。这就是不打印该列表的原因。
    • 您只需在您的方法 execute 返回结果(即成功/错误/输入等)之前设置列表,以便您可以在 中检索它们>user.jsp 使用 struts 标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多