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