`
yunshu321
  • 浏览: 11535 次
社区版块
存档分类
最新评论

struts2 ajax请求使用json配置时出现500页面问题分析

阅读更多

 

在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范围的优先级要高于包范围的优先级.

 原来所谓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 ajax json使用介绍

    在后端,我们需要创建一个Struts2 Action类,用于处理Ajax请求并返回JSON数据。例如,创建一个名为`AjaxAction.java`的类: ```java import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2....

    json2+jsonplugin struts2整合ajax时,使用json时需要的jar包

    5. **过滤器配置**:确保Struts2的`FilterDispatcher`或`StrutsPrepareAndExecuteFilter`过滤器在web.xml中正确配置,以便拦截并处理Ajax请求。 6. **安全考虑**:在处理JSON数据时,务必注意防止XSS和CSRF等安全...

    AJAX和struts2传递JSON数组

    这告诉Struts2框架当收到名为`struts2Action`的请求时,使用`Struts2Action`类,并返回JSON格式的结果。如果需要在Action执行后返回一个页面,可以将`result`元素的类型改为`dispatcher`。 总结来说,通过这种方式...

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    JQuery发送Ajax请求Struts2,并返回JSON的例子

    在Struts2中,我们可以配置Action类来处理Ajax请求,并以JSON格式返回数据。 以下是一个简单的示例步骤: 1. **前端设置**: 在HTML页面中,使用jQuery发起Ajax请求。例如: ```javascript $.ajax({ url: ...

    使用struts2 和ajax进行传递json数据

    在Struts2中,可以通过配置Action来处理Ajax请求。Action类中的方法可以返回一个值,这个值可以映射到一个视图,也可以是JSON字符串。使用`@Result`注解或struts.xml配置文件,可以指定一个结果类型为`json`,这样...

    Struts2下的jQueryAjax请求(Json)

    struts2下通过jquery的ajax从后台传json对象并展示在web页面上的一个小例子,所需的jar包请自己下载否则无法运行,所需的包包括struts的必须包,json的支持包和struts对json的支持包

    JQuery发起ajax请求Struts2,并操作JSON数据的例子

    1. **jQuery发起Ajax请求**:使用jQuery的$.ajax()或$.getJSON()方法,设置URL指向Struts2的Action,同时指定请求类型为GET或POST,以及期望接收的数据类型为'json'。 ```javascript $.ajax({ url: 'MyAction', ...

    Struts2+ajax+json返回list.docx

    本实例展示了如何在Struts2框架下,通过Ajax发送请求获取JSON数据,并将数据返回到JSP页面,以填充下拉列表(`&lt;s:select/&gt;`标签)。 1. **Struts2配置**: 在`struts.xml`配置文件中,我们需要定义一个Action,...

    Struts2 + jQuery+JSON 实现ajax

    3. **配置问题**:检查Struts2的配置文件(如struts.xml)中的配置是否正确,特别是关于JSON插件的部分。 #### 三、总结 通过以上步骤,我们可以利用Struts2框架结合jQuery与JSON轻松地实现Ajax功能。需要注意的是...

    AjaxStruts2Json实例

    在Ajax请求的success回调中,我们可以访问并操作返回的JSON数据,实现在页面上的局部更新。 ```javascript success: function(response) { var key1 = response.key1; var key2 = response.key2; // 更新DOM...

    struts2_ajax_json

    在描述中提到的"直接部署,即可运行",意味着这个压缩包可能包含了一个已经配置好的Struts2应用实例,包含了Action类、配置文件(如struts.xml)、以及处理Ajax请求的JSP页面。部署这个应用后,用户可以直接体验到...

    struts2+json

    总的来说,"struts2+json"资源涉及到了Struts2框架中的Action设计、拦截器机制、结果类型的配置,以及AJAX和JSON在Web应用中的使用。理解这些知识点对于开发动态、交互性强的Java Web应用至关重要。

    Struts2 与Jquery Ajax的json数据交换的典型范例

    总结,Struts2和jQuery的Ajax JSON数据交换涉及以下几个关键步骤:配置Struts2的JSON插件,编写返回JSON数据的Action,使用jQuery发起Ajax请求并处理返回的JSON数据。通过这种方式,可以实现客户端与服务器之间的...

    Jquery struts2 json 实现ajax

    标题 "Jquery struts2 json 实现ajax" 涉及到的是在Web开发中使用jQuery库与Struts2框架结合处理JSON数据的Ajax技术。这个主题主要关注如何通过前端的jQuery实现异步请求,与后端的Struts2框架进行交互,从而更新...

    struts2 ajax json

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它极大地简化了Java Web应用程序的开发。...在实际项目中,你可能还需要考虑错误处理、安全性和性能优化等问题,这些都是使用Struts2 Ajax和JSON时需要注意的关键点。

    Ajax与Struts2异步请求数据

    通过配置Struts2拦截器、使用JSON插件以及编写适当的动作类和前端页面,开发者可以轻松实现异步数据请求和更新。这种技术在现代Web应用中广泛使用,特别是在需要动态加载数据的场景下,如分页、搜索结果展示等。

    struts2+jquery+json+ajax例子

    Struts2的相关配置文件,如struts.xml,定义了Action的映射和结果类型,确保Ajax请求能够正确地路由到处理逻辑。 总结起来,"struts2+jquery+json+ajax"的例子展示了如何利用这些技术协同工作,实现一个无刷新的...

    jquery ajax json struts2最简单例子测试成功

    2. **JSON与Struts2的结合**:Struts2 Action执行后返回一个JSON字符串,这个字符串被jQuery AJAX请求接收。通过Struts2的插件,如struts2-json-plugin,可以在Action类中直接返回一个包含JSON数据的对象,Struts2会...

    struts2+jquery执行ajax并返回json类型数据(源码)

    在本示例中,Struts2将处理来自jQuery的Ajax请求,并返回JSON格式的响应数据。 jQuery则是一个轻量级的JavaScript库,简化了DOM操作、事件处理和Ajax交互。在本例中,jQuery的`$.ajax()`方法用于发起异步请求,获取...

Global site tag (gtag.js) - Google Analytics