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. uglifyjs压缩js文件(指令压缩/ 批量压缩/ 编程方式压缩)

    一.指令压缩 1.安装node,npm——详细见nodejs安装与使用入门 2.安装 uglifyjs——npm install -g uglify-js 3.压缩例子:1)uglifyjs  mai ...

  2. Delphi TdxBarManager通过代码生成菜单

    procedure TForm6.btn1Click(Sender: TObject);var  ABar:TdxBar;  ABarItem:TdxBarItem;  ABarSubItem:Tdx ...

  3. 五子棋——C++

    最近在学C++,这个是照葫芦画瓢的五子棋C++版- - 依赖SDL_PingGe_1.3,很多实用的函数,类我都封装成DLL了调用起来真是舒服啊.. 不过一方面要对DLL做测试,一方面要开发,一个人还 ...

  4. 关于echo `git branch | grep \*`

    本来想返回一个git当前的分支.但会将这个文件夹下的所有目录与分支一起输出. 原因是  echo `git branch | grep \*`  等价于   echo * master  , 而  e ...

  5. [Design Pattern] Command Pattern 命令模式

    发现公司的代码好像有用到 Command Pattern,回顾重温下. Command Pattern 的类图结构如下: 参考 <Head First Design Patterns(英文版)& ...

  6. Aggregation Models

    这是Coursera上<机器学习技法>的课程笔记. Aggregation models: mix or combine hypotheses for better performance ...

  7. adb shell am pm 用法

    Using activity manager (am) Within an adb shell, you can issue commands with the activity manager (a ...

  8. 非常全面的Linux知识点总结

    $1 我的Linux需求 Linux博大精深.我只在此讨论一些我对线上Linux机器维护人员的基本需求,比如装机,加硬盘,配网络.只讨论CentOS 6,或者类似的RHEL,当然Ubuntu也可以此类 ...

  9. xml中不能直接添加ViewGroup

    我知道可以直接添加一个<View />的,今天想添加个容器类,然后后台动态添加SurfaceView到ViewGroup容器里,不过提示inflate报错了.难道ViewGroup不能直接 ...

  10. clang和gcc消除警告

    1. clang命令,它的作用是用来消除特定区域的clang的编译警告,-Wgnu则是消除?:警告, 例: #pragma clang diagnostic push #pragma clang di ...