用异提交时,后台通过校验规则文件,校验不通过时,跳转到INPUT视图时,前台显示错误信息的解决办法

1.第一种:

最近项目使用了struts2的校验(其实我觉得后台校验,特别是struts的校验,完全可以放在其他地方处理,比如交给js或者业务逻辑),而且系统刚好还使用了extjs,此时问题出现了:假如提交数据后,struts校验没有通过,那么struts会自动返回input,而extjs提交数据方式都是ajax,根本就不理会struts 的返回值,然后系统就会报错,页面也不可能显示校验失败的相关信息,

针对此种情况,一种处理方式是在struts.xml中增加input结果集,重定向到另一个action处理,然后给页面返回ajax请求的结果,但是页面不会显示校验失败的相关信息.如何能解决页面显示校验失败的详细信息呢?

上网查了一下,发现struts2新版本的interceptor支持返回结果集的预处理监听函数(举个例子:在action方法返回一个input后,我能在拦截器中拦截到你返回了Input视图),我们只需实现此接口,然后在拦截器中加入监听即可.

看代码:

[java] view plain copy

print?

  1. public class ExceptionInterceptor extends AbstractInterceptor {
  2. private static final Logger logger = LoggerFactory
  3. .getLogger("ExceptionInterceptor");
  4. @Override
  5. public String intercept(ActionInvocation invocation) {
  6. try {
  7. //增加监听
  8. invocation.addPreResultListener(new MyStrutsListener());
  9. String retString = invocation.invoke();
  10. return retString;
  11. } catch (Exception e) {
  12. logger.error(StackTrace.getExceptionTrace(e));
  13. //to-do
  14. }
  15. }
  16. }
  17. //实现接口: PreResultListener
  18. class MyStrutsListener implements PreResultListener {
  19. @Override
  20. public void beforeResult(ActionInvocation actionInvocation, String result) {
  21. // 过滤result为input视图的请求
  22. if (result != null && result.equals("input")) {
  23. //设置struts返回值为空
  24. actionInvocation.setResultCode(null);
  25. //从action中取得fieldError的错误校验信息
  26. ActionContext actionContext = actionInvocation
  27. .getInvocationContext();
  28. ValueStack vc = actionContext.getValueStack();
  29. Map<String, Object> ferrors = (Map<String, Object>) vc
  30. .findValue("fieldErrors");
  31. String returnMessage = null;
  32. for (Map.Entry<String, Object> entry : ferrors.entrySet()) {
  33. ArrayList list = (ArrayList) entry.getValue();
  34. if (list != null && list.size() > 0) {
  35. returnMessage = list.get(0).toString();
  36. break;
  37. }
  38. }
  39. // 页面回写json
  40. try {
  41. HttpServletResponse response = (HttpServletResponse) actionContext
  42. .getContext().get(
  43. org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
  44. response.setContentType("application/json; charset=utf-8");
  45. response.setHeader("cache-control", "no-cache");
  46. PrintWriter writer = response.getWriter();
  47. writer.print("{success:false,message:‘" + returnMessage + "‘}");
  48. writer.flush();
  49. writer.close();
  50. } catch (IOException e1) {
  51. logger.error(StackTrace.getExceptionTrace(e1));
  52. }
  53. }
  54. }
  55. }

最后在前台解析接收到的json数据,反馈给用户,效果与struts校验失败后的提示信息一模一样。^_^
简单解释:假如拦截到input,就从struts的栈中取出一个校验失败的信息,然后返回给页面,

以上为个人见解,难免有不周的地方

装载出处http://blog.csdn.net/jsjxieyang/article/details/8107547

---------------------------------------------------------------------------

第二种:

一:自己定义一个result

Java code

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

package result;

import java.io.PrintWriter;

import java.util.Map;

import org.apache.struts2.ServletActionContext;

import net.sf.json.JSONObject;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.Result;

import com.opensymphony.xwork2.util.ValueStack;

public class validators_json implements Result {

    @SuppressWarnings("unchecked")

    @Override

    public void execute(ActionInvocation arg0) throws Exception {

        //获值栈中fieldErrors的值

        ValueStack vc = ActionContext.getContext().getValueStack();

        Map<String, String[]>  ferrors = (Map<String,String[]>)  vc.findValue("fieldErrors");

        //获得输出流

        ServletActionContext.getResponse().setCharacterEncoding("utf8");

        ServletActionContext.getResponse().setContentType("text/html");

        PrintWriter out = ServletActionContext.getResponse().getWriter();

        //将map转换为json

        JSONObject json =JSONObject.fromObject(ferrors);

        //想客户端输出

        System.out.println(json.toString());

        out.print(json.toString());

        out.close();

//        for (Map.Entry<String, String[]> entry : ferrors.entrySet())

//           System.out.println("key:" + entry.getKey() + "  value:" + entry.getValue());

    }

}

二,然后修改配置文件struts.xml

添加type的定义

XML/HTML code

?


1

2

3

<result-types>

    <result-type name="validators_json" class="result.validators_json" default="true">   </result-type>

</result-types>

使用

XML/HTML code

?


1

<result name="input" type="validators_json"></result

这样 验证框架所产生的message就可以以json的方式发向客户端了,当然发送方式可以自己定义
实现了ajax+struts2验证框架异步验证数据。

时间: 2024-10-06 13:31:42

用异提交时,后台通过校验规则文件,校验不通过时,跳转到INPUT视图时,前台显示错误信息的解决办法的相关文章

华为手机在开发Android调试时logcat不显示输出信息的解决办法

手机连接电脑RUN AS logcat 提示:Unable to open log device '/dev/log/main': No such file or directory 信息 本人华为C8812手机,获得ROOT权限(http://dl.vmall.com/c032h3j6dv 下载归一版,然后执行安装,按照提示操作即可) 华为C8812手机,获得root权限后 手机拨号*#*#2846579#*#*,进入projectmenu--后台设置--LOG设置--LOG开关--打开: 然

Struts2的输入校验(1)——校验规则文件的编写

Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: 客户端校验:过滤正常用户的误操作,使用JavaScript代码完成: 服务器端校验:组织非法数据的输入,是整个应用的最后防线,在应用中通过编程的方式实现. 使用Struts2的校验框架进行校验时,无须对程序的代码进行改变,只需要编写校验规则文件即可,校验规则文件制定每个表单域应该满足怎样的输入规则.

SpringMVC数据校验并通过国际化显示错误信息

目录 SpringMVC数据校验并通过国际化显示错误信息 SpringMVC数据校验 在页面中显示错误信息 通过国际化显示错误信息 SpringMVC数据校验并通过国际化显示错误信息 SpringMVC数据校验 <mvc:annotation-driven/>会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid 注解即可让Spring MVC在完成数据绑定后执行数据校验的工作. 首先,我们在实体类上标注JSR303校验注解 public c

[经使用有效]Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附加数据库文件时弹出错误信息:如下图: ,一时无解,遂求助于百度谷歌,经过各种试验,特将解决办法整理于此,希望能帮到大家,同时如果有好的意见大家多多交流啊! 方案一:切换登录方式 出现这种情况是由于用“混合验证方式”(SQL Server身份验证)登录数据库造成的,只要将登录方式改为“windows身

SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

SQLServer2005+ 附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 我们在用Sql SQLServer2005+附加数据库文件时弹出错误信息如下图的处理办法: 方案一:切换登录方式 出现这种情况是由于用"混合验证方式"(SQL Server身份验证)登录数据库造成的,只要将登录方式改为"windows身份验证方式"登录即可解决该问题,附加成功后再换用"混合验证模式"登陆就没问题了. 方案二:修改服务 选择 所有程序

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法

使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法 idea中springboot整合mybatis时,通过@Autowired注入的对象一直有下划线提示,但是项目能运行,虽然不影响运行,但是强迫症的程序员肯定看不下去. 如何去除呢?解决:改变@Autowired的检查级别即可.快捷键:Ctrl+Alt+s,进入idea设置界面,输入inspections检索,如下: 原文地址:https://www.cnblogs.com

Form组件验证之ajax提交数据并显示错误信息

前端登陆界面(重点是js操作--接收到后台发来的错误信息怎么在页面显示出来) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>用户登录</h1> <form id="f1" a

java 附件上传时后台验证上传文件的合法性

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 8

时间字段 输入空值显示为1900-1-1的解决办法,在asp.net 后台处理

string DateEndLast ="'"+ txtDateEndLast.Value+"'"; if (txtDateEndLast.Value.Trim() == "") { DateEndLast = "null"; } string sql = "update DB_****t set style='" + style + "',ClientID='" + ClientID