存档

‘Json’ 分类的存档

Struts2+json+jQuery上传文件在Firefox和IE下返回结果截然不同

2009年10月23日 IT北瓜 4 条评论

      在Struts2中利用json格式返回数据,struts.xml文件配置如下:

<package name="struts2json" extends="json-default">
	<!-- jsonfilm -->
	<action name="jsonFilm" class="film">
		<result type="json">
			<param name="excludeProperties">.*hibernateLazyInitializer,pageBean,film</param>
		</result>
	</action>
</package>

而表单利用jquery.form.js插件提供的ajax方式来提交,javascript代码如下:

var options = {
	url: 'jsonFilm!addFilm.action',
	dataType: 'json',
	beforeSubmit: validateAddFilm,
	success: showResponseAddFilm
};
$('#film-form').submit(function() {
	$(this).ajaxSubmit(options);
	return false;
});
function validateAddFilm(formData, jqForm, options){
	//验证代码省略...
}
function showResponseAddFilm(jsonData, status){
	alert(status);//请求结果
}

由于表单中含有文件域file,并且用json格式来返回请求结果,这种情况下虽然文件能正确上传也能正确写入数据库,但是你会发现一个很让人头疼的问题——前台会弹出一个“下载对话框”。

那么我们就改用另一种方式来上传文件和返回数据,这里用到了ajax-file-upload-plugin-0.4.0.jar这个包,这个包是专门为Struts2利用ajax方式上传文件准备的,struts.xml文件配置如下:

<package name="ajaxfileupload" namespace="/" extends="ajaxfileupload-default">
	<action name="addFilm" class="film">
		<result name="success" type="httpheader">
			<param name="status">200</param>
		</result>
	</action>
</package>

action类中返回return "success";或者return SUCCESS;

      这样前台就不会弹出“下载对话框”了。但却发现一个和奇怪的问题,Firefox下能正确执行options中的success回调函数showResponseAddFilm,但IE下却不能。不过后台的文件上传和数据库操作都是成功的,没有问题。

      于是我将options中的success换成了complete,因为complete不管结果如何它都会被执行,而success只有成功时才会被执行。结果发现Firefox下返回的status值为success,而IE下返回的status值却总是error。真是搞不懂怎么回事?所以将情况记录下来,希望哪位能指出问题之所在。

jsonplugin包与Struts2包版本匹配问题

2009年9月23日 IT北瓜 4 条评论

今天做项目的时候遇到“java.lang.NoSuchMethodError: com.opensymphony.xwork2.ActionContext.get(Ljava/lang/String;)Ljava/lang/Object;”异常,导致该异常的是jsonplugin的jar包与Struts2的jar包不匹配引起的。

jsonplugin-0.33.jar     Struts 2 JSON Plugin 0.33 匹配 Struts 2.1.x Compatible
jsonplugin-0.32.jar     Struts 2 JSON Plugin 0.32 匹配 Struts 2.0.x Compatible

2009年12月16日更新

异常:java.lang.NoClassDefFoundError: com/opensymphony/xwork2/util/TextUtils

原因:jsonplugin-0.34.jar 配合 struts2-core-2.1.8.1.jar 使用的情况下报的异常,但以前的项目中jsonplugin-0.34.jar 配合 struts2-core-2.1.6.jar 使用不会出现这样的异常

解决方法:去掉jsonplugin-0.34.jar,使用struts2-json-plugin-2.1.8.1.jar 和 json-lib-2.1.jar两个包