用异提交时,后台通过校验规则文件,校验不通过时,跳转到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 ...
随机推荐
- 【动态规划】XMU 1030 苦恼的月下老人
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1030 题目大意: 给定两个字符串的长度和内容,求最长公共子序列. 题目思路: [动态规 ...
- Delphi 多线程 “尚未调用CoInitialize错误”的解决方法
在Delphi 多线程中出现“尚未调用CoInitialize错误”的解决方法 解决方法如下: function TMyThread.ExecTimer: Boolean;begin Resul ...
- lr 增强窗格中,如何生成调试信息?
我是根据电子书来操作的, 如何生成调试信息?在测试运行的某些时候,经常需要向输出设备发送消息,指出当前位置和其他信息.这些输出消息会出现在回放日志和 Controller 的输出窗口中.可以发送标准输 ...
- Longest Palindromic Substring——LeetCode
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- 谷歌 google
google Google是搜索引擎名,也是一家美国上市公司名称.Google公司于1998年9月7日以私有股份公司的形式创立,以设计并管理一个互联网的搜索引擎.Google公司的总部称作“Googl ...
- shell中$0,$?,$!等的特殊用法【转载】
本文转载自:http://blog.sina.com.cn/s/blog_464f6dba0100psy9.html ----------------------------------------- ...
- 《SDN核心技术剖析和实战指南》3.1控制器核心技术读书笔记
在SDN的架构中,控制器可以说是SDN的核心,它负责对底层转发设备的控制以及向上层应用提供可编程性的北向接口.从实现上看,主要分三个层面来考虑,南向接口技术,北向接口技术以及东西向的可扩展性能力.下面 ...
- python network programming tutorial
关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...
- Project Euler problem 61
题意很明了. 然后我大概的做法就是暴搜了 先把每个几边形数中四位数的处理出来. 然后我就DFS回溯着找就行了. 比较简单吧. #include <cstdio> #include < ...
- [转] Makefile的条件执行
条件语句可以根据一个变量的值来控制make执行或者忽略Makefile的特定部分.条件语句可以是两个不同变量.或者变量和常量值的比较.要注意的是:条件语句只能用于控制make实际执行的makefile ...