用异提交时,后台通过校验规则文件,校验不通过时,跳转到INPUT视图时,前台显示错误信息的解决办法
1.第一种:
最近项目使用了struts2的校验(其实我觉得后台校验,特别是struts的校验,完全可以放在其他地方处理,比如交给js或者业务逻辑),而且系统刚好还使用了extjs,此时问题出现了:假如提交数据后,struts校验没有通过,那么struts会自动返回input,而extjs提交数据方式都是ajax,根本就不理会struts 的返回值,然后系统就会报错,页面也不可能显示校验失败的相关信息,
针对此种情况,一种处理方式是在struts.xml中增加input结果集,重定向到另一个action处理,然后给页面返回ajax请求的结果,但是页面不会显示校验失败的相关信息.如何能解决页面显示校验失败的详细信息呢?
上网查了一下,发现struts2新版本的interceptor支持返回结果集的预处理监听函数(举个例子:在action方法返回一个input后,我能在拦截器中拦截到你返回了Input视图),我们只需实现此接口,然后在拦截器中加入监听即可.
看代码:
- public class ExceptionInterceptor extends AbstractInterceptor {
 - private static final Logger logger = LoggerFactory
 - .getLogger("ExceptionInterceptor");
 - @Override
 - public String intercept(ActionInvocation invocation) {
 - try {
 - //增加监听
 - invocation.addPreResultListener(new MyStrutsListener());
 - String retString = invocation.invoke();
 - return retString;
 - } catch (Exception e) {
 - logger.error(StackTrace.getExceptionTrace(e));
 - //to-do
 - }
 - }
 - }
 - //实现接口: PreResultListener
 - class MyStrutsListener implements PreResultListener {
 - @Override
 - public void beforeResult(ActionInvocation actionInvocation, String result) {
 - // 过滤result为input视图的请求
 - if (result != null && result.equals("input")) {
 - //设置struts返回值为空
 - actionInvocation.setResultCode(null);
 - //从action中取得fieldError的错误校验信息
 - ActionContext actionContext = actionInvocation
 - .getInvocationContext();
 - ValueStack vc = actionContext.getValueStack();
 - Map<String, Object> ferrors = (Map<String, Object>) vc
 - .findValue("fieldErrors");
 - String returnMessage = null;
 - for (Map.Entry<String, Object> entry : ferrors.entrySet()) {
 - ArrayList list = (ArrayList) entry.getValue();
 - if (list != null && list.size() > 0) {
 - returnMessage = list.get(0).toString();
 - break;
 - }
 - }
 - // 页面回写json
 - try {
 - HttpServletResponse response = (HttpServletResponse) actionContext
 - .getContext().get(
 - org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
 - response.setContentType("application/json; charset=utf-8");
 - response.setHeader("cache-control", "no-cache");
 - PrintWriter writer = response.getWriter();
 - writer.print("{success:false,message:'" + returnMessage + "'}");
 - writer.flush();
 - writer.close();
 - } catch (IOException e1) {
 - logger.error(StackTrace.getExceptionTrace(e1));
 - }
 - }
 - }
 - }
 
最后在前台解析接收到的json数据,反馈给用户,效果与struts校验失败后的提示信息一模一样。^_^
简单解释:假如拦截到input,就从struts的栈中取出一个校验失败的信息,然后返回给页面,
以上为个人见解,难免有不周的地方
装载出处http://blog.csdn.net/jsjxieyang/article/details/8107547
---------------------------------------------------------------------------
第二种:
一:自己定义一个result
| 
 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的定义
| 
 1 
2 
3 
 | 
<result-types>    <result-type name="validators_json" class="result.validators_json" default="true">   </result-type></result-types> | 
使用
| 
 1 
 | 
<result name="input" type="validators_json"></result>  | 
这样 验证框架所产生的message就可以以json的方式发向客户端了,当然发送方式可以自己定义
实现了ajax+struts2验证框架异步验证数据。
用异提交时,后台通过校验规则文件,校验不通过时,跳转到INPUT视图时,前台显示错误信息的解决办法的更多相关文章
- 华为手机在开发Android调试时logcat不显示输出信息的解决办法
		
手机连接电脑RUN AS logcat 提示:Unable to open log device '/dev/log/main': No such file or directory 信息 本人华为C ...
 - 关于Action中ValidateXXX方法校验一次失败后\导致以后一直返回input视图的情况
		
问题: 使用struts2的validateXXX()进行验证,出错后自动返回之前的画面,但是Form中的数据全部丢失了,如何才能保存出错前的Form是要解决的问题. 调查: 调查后发 ...
 - Struts2的输入校验(1)——校验规则文件的编写
		
Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: ...
 - SpringMVC数据校验并通过国际化显示错误信息
		
目录 SpringMVC数据校验并通过国际化显示错误信息 SpringMVC数据校验 在页面中显示错误信息 通过国际化显示错误信息 SpringMVC数据校验并通过国际化显示错误信息 SpringMV ...
 - Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
		
Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附 ...
 - SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
		
SQLServer2005+ 附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 我们在用Sql SQLServer2005+附加数据库文件时弹出错误信息如下图的处理办法: 方案一: ...
 - [经使用有效]Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
		
sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附 ...
 - 使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法
		
使用IDEA工具整合mybatis时使用@Resource和@Autowired自动注解bean时会显示红色问题的解决办法 idea中springboot整合mybatis时,通过@Autowired ...
 - [Vue]vee-validate的使用——自定义校验规则及校验message
		
1.安装vee-validate npm install vee-validate --save 2.main.js里引用vee-validate插件 import Vue from 'vue' im ...
 
随机推荐
- Java---IO加强(3)-IO流的操作规律
			
一般写关于操作文件的读取的几个通用步骤!!! 1.明确源和目的. 源:InputStream Reader 一定是被读取的. 目的:OutputStream Writer 一定是被写入的. 2.处理的 ...
 - AOJ 0121 广度优先搜索
			
题意:7数码问题.在2×4的棋盘上,摆有7个棋子,每个棋子上标有1至7的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格(用0表示),与空格相邻(上下左右)的棋子可以移到空格中,该棋子原先位置成 ...
 - Ubuntu下配置smb服务器
			
一. samba的安装: sudo apt-get insall samba 二. 创建共享目录: mkdir /home/user/share sodu chmod 777 /home/user/s ...
 - C++编写ATM(2)
			
//上一个程序,密码不能被隐藏和该ATM可以让人取大于余额的乐币,这可定不行的.所以再次改了下,解决这两个问题. // ATM的初始.cpp : 定义控制台应用程序的入口点. // /******** ...
 - css文本超出2行就隐藏并显示省略号
			
之前在网上看到过这样的代码,感觉有的时候还是挺有用的,故留个笔记. display:-webkit-box; //将对象作为弹性伸缩盒子模型显示. -webkit-box-orient:vertica ...
 - Android 关于获取摄像头帧数据解码
			
由于Android下摄像头预览数据只能 ImageFormat.NV21 格式的,所以解码时要经过一翻周折. Camera mCamera = Camera.open(); Camera.Param ...
 - js正则表达式中的问号使用技巧总结
			
这篇文章主要介绍了js正则表达式中的问号几种用法,比如+?,*?,{2,3}?可以停止匹配的贪婪模式等例子的解析. 在表示重复的字符后面加问号,比如+?,*?,{2,3}?可以停止匹配的贪婪模式. v ...
 - 关于js跨域
			
get方式: 称为jsonp,就是js的跨域通信方式,因为知道有些标签可以跨域获取内容,例如img,script,link...,jsonp就是把动态创建一个script标签,然后配置src属性,后台 ...
 - CentOS6.3 Firefox安装FlashPlayer
			
这段时间搞搞CentOS,我自己用的版本是CentOS6.3,基本上都差不多,过程都一样,主要说一下步骤 1.从Adoble官网下载FlashPlayer插件,下载地址:http://get.adob ...
 - SoundPool 音频播放 详解 示例
			
简介 如果应用程序经常播放密集.急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了.因为MediaPlayer存在如下缺点: 1) 延时时间较长,且资源占用率高. 2) ...