返回列表 发帖

[Struts] Struts2对AJAX进行服务器端校验

我想对UI传来的JSON数据做服务器端校验,然后将校验失败信息再返回给UI。
不知道这个时候该怎么实现呢?

据我现在了解的一种方式,在Struts2的Action处理逻辑里面使用硬编码完成对数
据的服务器端校验,然后将错误信息以字段并以Struts2封装的json格式再返回。
可是这种方法的代码重用性太低。

除此之外,我发现struts-default.xml中有一个jsonValidator的校验器(拦截器),
然后查了些资料,对这个校验器了解了一下。不过还是不知道怎么使用的,请教
用过的人能给个示意程序,并稍稍说明一下。

谢谢~~

UI获得的JSON数据,可以利用一些JS库的方法进行序列化,例如:jQuery.param(obj, [traditional])

至于Struts2的验证方式,你先看过Struts2的验证框架的相关资料,再来讨论
青春是那么的耀眼,我该怎样度过?

TOP

回复 2# bruceye 的帖子

我不是要在js里面做客户端验证,而是要利用JSONValidationInterceptor来对UI发来的数据进行服务器端验证,然后将验证后的信息再返回给UI。

我在尝试使用struts2-core-2.1.8.jar中的JSONValidationInterceptor,然后将源代码中的一些在js控制开启json校验部分给去掉了,但是使用没有作用,如果你明白我的意思的话,可以查看JSONValidationInterceptor的源代码,里面写明,当Action的fieldError或actionError中有校验失败信息时,该拦截器类会将这些错误信息序列化为JSON对象,最后的逻辑视图名是Action.NONE。现在它始终不返回到none的视图,即便按照API当中的使用说明:在使用JSONValidationInterceptore前,应该先引用validation校验器,但是校验失败后,始终返回到的是input视图,我感觉JSONValidationInterceptor没有起到作用。

以下是我更改后的MyJSONValidationInterceptor源码中用于拦截的部分:
  1.         protected String doIntercept(ActionInvocation invocation) throws Exception {
  2.                 HttpServletResponse response = ServletActionContext.getResponse();
  3.                 HttpServletRequest request = ServletActionContext.getRequest();

  4.                 Object action = invocation.getAction();

  5.                 if (action instanceof ValidationAware) {
  6.                         // generate json
  7.                         ValidationAware validationAware = (ValidationAware) action;
  8.                         if (validationAware.hasErrors()) {
  9.                                 if (validationFailedStatus >= 0)
  10.                                         response.setStatus(validationFailedStatus);
  11.                                 response.setCharacterEncoding("UTF-8");
  12.                                 response.getWriter().print(buildResponse(validationAware));
  13.                                 response.setContentType("application/json");
  14.                                 return Action.NONE;
  15.                         }
  16.                 }
  17.                
  18.                 return invocation.invoke();

  19.         }
复制代码


以下是我在struts。xml中配置的自己的拦截器栈:
  1. <interceptors>
  2.         <interceptor name="myJSON" class="interceptor.MyJSONInterceptor"/>
  3.         <interceptor-stack name="myStack">
  4.                  <interceptor-ref name="servletConfig"/>
  5.                 <interceptor-ref name="i18n"/>
  6.                 <interceptor-ref name="actionMappingParams"/>
  7.                 <interceptor-ref name="params">
  8.                   <param name="excludeParams">dojo\..*,^struts\..*</param>
  9.                 </interceptor-ref>
  10.                 <interceptor-ref name="conversionError"/>
  11.                 <interceptor-ref name="validation">
  12.                     <param name="excludeMethods">input,back,cancel,browse</param>
  13.                 </interceptor-ref>
  14.                 <interceptor-ref name="myJSON" />
  15.         </interceptor-stack>
  16. </interceptors>

  17. <default-interceptor-ref name="myStack" />
复制代码


以下是API中对JSONvalidationInterceptor的使用说明:
  1. <p>If 'validationFailedStatus' is set it will be used as the Response status
  2. * when validation fails.</p>
  3. *
  4. * <p>If the request has a parameter 'struts.validateOnly' execution will return after
  5. * validation (action won't be executed).</p>
  6. *
  7. * <p>A request parameter named 'enableJSONValidation' must be set to 'true' to
  8. * use this interceptor</p>
复制代码

[ 本帖最后由 xingyu_liu 于 2010-7-28 11:54 编辑 ]

TOP

回复 2# bruceye 的帖子

补充一下,我的Action类是extends ActionSupport的,所以拦截器中的第一个if (action instanceof ValidationAware)是成立的。

[ 本帖最后由 xingyu_liu 于 2010-7-28 12:00 编辑 ]

TOP

返回列表