addfielderror中的错误struts2中的< s:select>

ctzwtxfj  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(392)

我对struts2还不熟悉,试着用 addFieldError 以我的形式 <s:select> 标签。我有一个窗体,在其中我必须从下拉列表中选择一个值。第一次显示这个表单时,响应来自一个action类,我在其中创建了一个列表。在我的表单中,我使用 <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.");
}

一切正常。错误条件得到满足,结果我得到“输入”。错误消息也正在打印,但下拉列表中的值已消失。列表打印为空。因为这个时间响应不是来自设置列表的action类。
然后我修改了struts.xml,将请求从 <result> 这样地:

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

“link.action”是在action类中发送请求以创建列表并打印表单的内容。
但是这一次表单只是再次打印&没有打印错误消息。
我想再次打印该列表,以及它旁边的错误消息。请告诉我怎么做。?

0s7z1bwu

0s7z1bwu1#

我认为type=“redirectaction”可以重定向到特定的操作
像这样的 <result name="input" type="redirectAction">link</result> 希望有帮助
如果我是正确的,或者您在任何地方返回这样的操作结果,那么可以在execute()方法中设置它

list=setList(newList);

return result;
ac1kyiln

ac1kyiln2#

几乎每个开始使用struts2的人都会遇到这个问题,很快或稍后。
在struts2中请求操作时,您的请求将通过一个拦截器堆栈(拦截器列表);每个拦截器所做的都是特定的业务,然后重定向请求(在出现错误的情况下)或继续执行到下一个拦截器,或者执行到最后一个拦截器的操作。
验证由验证拦截器执行。如果验证失败,它将劫持请求并将其重定向到struts.xml中定义的输入结果。无论验证是通过xml、注解还是在操作内部的validate()方法中进行:都不会到达操作!然后,里面的一切 execute() 方法,或者您正在调用的方法(如果您使用的是自定义方法)没有执行;
如果需要将列表元素加载到 execute() 方法,在输入结果的情况下不会执行。
避免此问题的主要方法是:
实现preparable接口,将所有数据加载的东西放到prepare()方法中。
该方法由prepare拦截器运行,该拦截器位于validation拦截器之前;
它将始终运行,并且它将在验证之前运行,无论您的操作采用哪种方法( execute() 或者其他)您正在呼叫,或者如果您遇到验证错误;
使用 <s:action/> 标记,以调用返回jsp片段的伪操作;
使用 redirectAction 作为输入结果类型 execute() (或其他)方法,就像你正在做的那样。
重定向时,它将丢失所有请求参数(包括操作错误、字段错误、操作消息等),然后您需要通过在struts.xml中将它们声明为 redirectAction 结果。
第一条路是首选,伊莫。
编辑:
在官方文档中也发现了:当验证失败时,我们如何重新填充控件?

相关问题