gpt4 book ai didi

java - addFieldError 错误 in Struts2

转载 作者:行者123 更新时间:2023-11-30 09:21:31 26 4
gpt4 key购买 nike

我是 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 以及除此之外的错误消息。请告诉如何。?

最佳答案

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

在Struts2中请求一个Action时,你的请求会通过through an Interceptor Stack (拦截器列表);每个拦截器所做的都是特定的业务,然后重定向请求(在出现错误的情况下)或继续执行到下一个拦截器,如果是最后一个拦截器则继续执行。

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

如果要求将列表元素加载到 execute()方法,它不会在输入结果的情况下执行。

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

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

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

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

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

编辑:

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

关于java - addFieldError 错误 <s :select> in Struts2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16956217/

26 4 0