在ajax请求中,使用validateAction校验参数,这个action中遇到校验出错使用addActionError,但这时候前端请求遇到校验出错的时候就跳到了500页面(服务器错误),拿不到错误信息.经过一步步debug,发现在走workfolw拦截器之后报了一个异常:No result defined for action and result input,原来是在这个拦截器中检测到有actionError,然后就返回了input,
if (action instanceof ValidationAware) { ValidationAware validationAwareAction = (ValidationAware) action; if (validationAwareAction.hasErrors()) { if (LOG.isDebugEnabled()) { LOG.debug("Errors on action " + validationAwareAction + ", returning result name 'input'"); } String resultName = inputResultName; if (action instanceof ValidationWorkflowAware) { resultName = ((ValidationWorkflowAware) action).getInputResultName(); } InputConfig annotation = action.getClass().getMethod(invocation.getProxy().getMethod(), EMPTY_CLASS_ARRAY).getAnnotation(InputConfig.class); if (annotation != null) { if (!annotation.methodName().equals("")) { Method method = action.getClass().getMethod(annotation.methodName()); resultName = (String) method.invoke(action); } else { resultName = annotation.resultName(); } } return resultName; } }
但是这个action对应的struts配置是:
<result type="json"> <param name="root">ajaxResult</param> </result>
只有一个result配置,应该是默认的success才会使用(因为input的返回就抛错了),没有配置input的跳转,然后就会抛出No result defined for action and result input异常,如果这样配置就可以了.但是太丑陋了,拿不到actionError中的错误信息.只能再在ajaxResult中填写一遍,不推荐这样解决:
<result name="success" type="json" > <param name="root">ajaxResult</param> </result> <result name="input" type="json"> <param name="root">ajaxResult</param> </result>
还有个疑问,这个异常抛出来为什么不会被<global-exception-mappings>捕捉到呢?
<global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="exception"/> </global-exception-mappings>google:
someone写道
<exception-mapping>与<global-exception-mapping>
这两个标签都是用来配置发生异常时对应的视图信息的,一个是Action范围的,一个是包范围的,当同一类型异常在两个范围都被配置时,Action范围的优先级要高于包范围的优先级.
这两个标签都是用来配置发生异常时对应的视图信息的,一个是Action范围的,一个是包范围的,当同一类型异常在两个范围都被配置时,Action范围的优先级要高于包范围的优先级.
原来所谓global只是package范围内的!!!找不到input抛出的异常相当于struts的异常.global-exception捕获不到.struts自己处理了,跳到500页面.
解决方案:
配置拦截器,删掉default拦截器,然后在自己的拦截器堆栈中加上一些自己需要的default中的拦截器,再在validation拦截器和workflow拦截器之间加上一个拦截器:jsonValidationInterceptor.主要内容:
if (action instanceof ValidationAware) { ValidationAware validationAware = (ValidationAware) action; if (validationAware.hasErrors()) { response.setCharacterEncoding("UTF-8"); response.getWriter().print(buildResponse(validationAware));//自己组装错误信息 response.setContentType("application/json"); return Action.NONE; } }struts.xml配置:
<interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel</param> </interceptor-ref> <interceptor-ref name="jsonValidationInterceptor"/> <interceptor-ref name="workflow"/>
然后work happily...
相关推荐
在后端,我们需要创建一个Struts2 Action类,用于处理Ajax请求并返回JSON数据。例如,创建一个名为`AjaxAction.java`的类: ```java import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2....
5. **过滤器配置**:确保Struts2的`FilterDispatcher`或`StrutsPrepareAndExecuteFilter`过滤器在web.xml中正确配置,以便拦截并处理Ajax请求。 6. **安全考虑**:在处理JSON数据时,务必注意防止XSS和CSRF等安全...
这告诉Struts2框架当收到名为`struts2Action`的请求时,使用`Struts2Action`类,并返回JSON格式的结果。如果需要在Action执行后返回一个页面,可以将`result`元素的类型改为`dispatcher`。 总结来说,通过这种方式...
【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...
在Struts2中,我们可以配置Action类来处理Ajax请求,并以JSON格式返回数据。 以下是一个简单的示例步骤: 1. **前端设置**: 在HTML页面中,使用jQuery发起Ajax请求。例如: ```javascript $.ajax({ url: ...
在Struts2中,可以通过配置Action来处理Ajax请求。Action类中的方法可以返回一个值,这个值可以映射到一个视图,也可以是JSON字符串。使用`@Result`注解或struts.xml配置文件,可以指定一个结果类型为`json`,这样...
struts2下通过jquery的ajax从后台传json对象并展示在web页面上的一个小例子,所需的jar包请自己下载否则无法运行,所需的包包括struts的必须包,json的支持包和struts对json的支持包
1. **jQuery发起Ajax请求**:使用jQuery的$.ajax()或$.getJSON()方法,设置URL指向Struts2的Action,同时指定请求类型为GET或POST,以及期望接收的数据类型为'json'。 ```javascript $.ajax({ url: 'MyAction', ...
本实例展示了如何在Struts2框架下,通过Ajax发送请求获取JSON数据,并将数据返回到JSP页面,以填充下拉列表(`<s:select/>`标签)。 1. **Struts2配置**: 在`struts.xml`配置文件中,我们需要定义一个Action,...
3. **配置问题**:检查Struts2的配置文件(如struts.xml)中的配置是否正确,特别是关于JSON插件的部分。 #### 三、总结 通过以上步骤,我们可以利用Struts2框架结合jQuery与JSON轻松地实现Ajax功能。需要注意的是...
在Ajax请求的success回调中,我们可以访问并操作返回的JSON数据,实现在页面上的局部更新。 ```javascript success: function(response) { var key1 = response.key1; var key2 = response.key2; // 更新DOM...
在描述中提到的"直接部署,即可运行",意味着这个压缩包可能包含了一个已经配置好的Struts2应用实例,包含了Action类、配置文件(如struts.xml)、以及处理Ajax请求的JSP页面。部署这个应用后,用户可以直接体验到...
总的来说,"struts2+json"资源涉及到了Struts2框架中的Action设计、拦截器机制、结果类型的配置,以及AJAX和JSON在Web应用中的使用。理解这些知识点对于开发动态、交互性强的Java Web应用至关重要。
总结,Struts2和jQuery的Ajax JSON数据交换涉及以下几个关键步骤:配置Struts2的JSON插件,编写返回JSON数据的Action,使用jQuery发起Ajax请求并处理返回的JSON数据。通过这种方式,可以实现客户端与服务器之间的...
标题 "Jquery struts2 json 实现ajax" 涉及到的是在Web开发中使用jQuery库与Struts2框架结合处理JSON数据的Ajax技术。这个主题主要关注如何通过前端的jQuery实现异步请求,与后端的Struts2框架进行交互,从而更新...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它极大地简化了Java Web应用程序的开发。...在实际项目中,你可能还需要考虑错误处理、安全性和性能优化等问题,这些都是使用Struts2 Ajax和JSON时需要注意的关键点。
通过配置Struts2拦截器、使用JSON插件以及编写适当的动作类和前端页面,开发者可以轻松实现异步数据请求和更新。这种技术在现代Web应用中广泛使用,特别是在需要动态加载数据的场景下,如分页、搜索结果展示等。
Struts2的相关配置文件,如struts.xml,定义了Action的映射和结果类型,确保Ajax请求能够正确地路由到处理逻辑。 总结起来,"struts2+jquery+json+ajax"的例子展示了如何利用这些技术协同工作,实现一个无刷新的...
2. **JSON与Struts2的结合**:Struts2 Action执行后返回一个JSON字符串,这个字符串被jQuery AJAX请求接收。通过Struts2的插件,如struts2-json-plugin,可以在Action类中直接返回一个包含JSON数据的对象,Struts2会...
在本示例中,Struts2将处理来自jQuery的Ajax请求,并返回JSON格式的响应数据。 jQuery则是一个轻量级的JavaScript库,简化了DOM操作、事件处理和Ajax交互。在本例中,jQuery的`$.ajax()`方法用于发起异步请求,获取...