我是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以及除此之外的错误消息。请告诉如何。?
答案 0 :(得分:2)
几乎所有以Struts2开头的人都会遇到这个问题。
在Struts2中请求操作时,您的请求将通过through an Interceptor Stack(拦截器列表);每个拦截器都是特定的业务,然后重定向请求(如果出现错误)或继续执行到下一个拦截器,或者如果它是最后一个,则执行。
验证由验证拦截器执行。如果验证失败,它将劫持请求,并将其重定向到struts.xml中定义的输入结果。无论验证是通过 XML ,通过 注释 还是通过 验证( Action中的 方法:未达到Action!然后,execute()
方法中的所有内容或您调用的方法(如果您使用的话)一个自定义的)没有被执行;
如果execute()
方法需要加载您的List元素,则在输入结果时不会执行此操作。
避免此问题的主要方法是:
实施Preparable Interface,并将所有数据加载内容放入prepare()方法中。
该方法由准备拦截器运行,该拦截器位于验证拦截器之前;
它将始终运行,并且在验证之前运行,无论您采取何种行动方式(execute()
或其他),调用,也不会遇到验证错误;
使用JSP中的<s:action/>
标记来调用返回JSP片段的虚拟操作;
使用redirectAction
作为输入结果类型,与execute()
(或其他)方法一样,正如您所做的那样。
在重定向时,它将丢失所有请求参数(包括操作错误,字段错误,操作消息等),然后您需要通过在struts.xml中将它们声明为{{1的参数来手动复制它们结果。
第一种方式是首选,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;