在Struts2中使用<s:select>的addFieldError出错</s:select>

时间:2013-06-06 07:32:43

标签: java jsp struts2

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

<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,将请求发送到<result>的Action类,如下所示:

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

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

但是这次表格只是再次打印出来。没有打印错误信息。

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

2 个答案:

答案 0 :(得分:2)

几乎所有以Struts2开头的人都会遇到这个问题。

在Struts2中请求操作时,您的请求将通过through an Interceptor Stack(拦截器列表);每个拦截器都是特定的业务,然后重定向请求(如果出现错误)或继续执行到下一个拦截器,或者如果它是最后一个,则执行。

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

如果execute()方法需要加载您的List元素,则在输入结果时不会执行此操作。

避免此问题的主要方法是:

  1. 实施Preparable Interface,并将所有数据加载内容放入prepare()方法中。
    该方法由准备拦截器运行,该拦截器位于验证拦截器之前; 它将始终运行,并且在验证之前运行,无论您采取何种行动方式(execute()或其他),调用,也不会遇到验证错误;

  2. 使用JSP中的<s:action/>标记来调用返回JSP片段的虚拟操作;

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

  4. 第一种方式是首选,imho。

    编辑:

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

答案 1 :(得分:0)

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

像这样的东西

<result name="input" type="redirectAction">link</result>

希望它有所帮助

你在execute()方法中设置它,如果我是正确的,或者你在哪里返回那个动作的结果

list=setList(newList);

return result;