1.第一种:

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

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

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

看代码:

  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验证框架异步验证数据。

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

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

    手机连接电脑RUN AS logcat 提示:Unable to open log device '/dev/log/main': No such file or directory 信息 本人华为C ...

  2. 关于Action中ValidateXXX方法校验一次失败后\导致以后一直返回input视图的情况

    问题:     使用struts2的validateXXX()进行验证,出错后自动返回之前的画面,但是Form中的数据全部丢失了,如何才能保存出错前的Form是要解决的问题. 调查:     调查后发 ...

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

    Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: ...

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

    目录 SpringMVC数据校验并通过国际化显示错误信息 SpringMVC数据校验 在页面中显示错误信息 通过国际化显示错误信息 SpringMVC数据校验并通过国际化显示错误信息 SpringMV ...

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

    Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附 ...

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

    SQLServer2005+ 附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 我们在用Sql SQLServer2005+附加数据库文件时弹出错误信息如下图的处理办法: 方案一: ...

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

    sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附 ...

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

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

  9. [Vue]vee-validate的使用——自定义校验规则及校验message

    1.安装vee-validate npm install vee-validate --save 2.main.js里引用vee-validate插件 import Vue from 'vue' im ...

随机推荐

  1. 【日语】アップデート(update)一吻定情OP

    ねぇ~気づいてる? nee ~ kizu iteru ?呐~注意到吗? 私はアップデートしているよwatashi ha appude^to shiteiruyo我期待更新 いつか届きますようにitsu ...

  2. javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法

    在很多人眼里,北京是一个物欲横流的社会,生活节奏之快,让你一丝都不能停下来,走在路上伴随着人群急速往前涌,或许有些人都不知道要去哪.也不知道自己想要的是什么?在一个浮躁的社会里,多了一些浮躁的人,到处 ...

  3. Codeforces Round #232 (Div. 1) A 解题报告

    A. On Number of Decompositions into Multipliers 题目连接:http://codeforces.com/contest/396/problem/A 大意: ...

  4. LANG=C是最早最简单的C语言环境(标准ASCII码)

    LANG=C是最早最简单的C语言环境(标准ASCII码)

  5. Java并发编程:并发容器ConcurrentHashMap

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  6. finally与return

    finally关键字:和try块使用,一般做资源释放操作,比如关闭流.关闭数据库连接,释放锁. return:用于返回值. finally块可保证一定执行,当逻辑处理有返回值时,会首先执行finall ...

  7. Object-C 对象 (创建/销毁 对象)-- 笔记

    创建/销毁 对象: Dog *dog = [Dog alloc]; //  通过alloc创建dog一个这样的对象, alloc相对于C语言中的new // *号既表示指针,也表示引用 初始化构造函数 ...

  8. Java字符串的最大长度

    在cpp中为了可移植性,string的长度是string::size_type,突然就想知道java允许的最大字符串长度为多少.看String的源码: public final class Strin ...

  9. JS日期格式化函数性能优化篇

    最近开发的软件中需要用到日志功能,其中有一个重要功能是显示日期和时间.于是网上搜了一把,搜到大量的日期格式化函数,不过比较了下,感觉代码都不够优雅,而且性能都不给力.对线上一些代码进行了评测,以下是一 ...

  10. 【解决】WordPress FTP连接服务器时出错,请检查设置,WordPress需要访问您网页服务器的权限

    刚装好wordpress,发现后台预装了两个插件,想删掉,结果要登录FTP,死活登不上去,提示"连接服务器时出错,请检查设置,WordPress需要访问您网页服务器的权限",网上也 ...