日期:2014-05-16 浏览次数:20491 次
最近看了一些帖子,发现一些朋友在使用Ajax和Struts2的结合的时候遇到了困惑和问题。特此,我将自己在实际应用中的解决方案拿出来和大家共享。希望可以给那些还没有找到更合适的Ajax方法的朋友提供一些启发。
问题:
struts2 的书籍以及文章中,多数在Ajax应用的时候,要求在struts.xml文件中需要对ajax的返回类型进行配置。如:
type="json"。使用这个配置的时候,必须使用struts2的json插件的jar包。
解决方案:
我给出的方案是:
???? 不使用struts2的json插件的jar包,不需要配置struts.xml中的type="json"
具体实现如下:
???? 使用json-lib.jar(下载地址:http://sourceforge.net/projects/json-lib/files/),需要的环境和jar包:
Json-lib requires (at least) the following dependencies in your classpath:
web页面,js里面,我书写的代码(jQuery):
?
var options = {
url: 'test/jsonTest.do',
type:'POST',
dataType:'json',//指定返回数据的解析类型,也可以是 xml
data:{
name:'lilei',
sex:'1'
},
success:function(rs){
if(rs.person){
alert(rs.name + '\t' + rs.sex);
}
},
error: function(rs){},
timeout:3000
};
$.ajax(options);
?struts.xml 配置文件:
<package name="test" namespace="/test" extends="struts-default"> <action name="jsonTest" class="test.JsonTestAction" method="jsonTest"> <!-- 注意,这里我什么都没有写,是空的 因为JsonTestAction里面的jsonTest的返回类型为 void --> </action> </package>
?Action? JsonTestAction的代码:
public class JsonTestAction extends ActionSupport implements
ServletResponseAware {
private HttpServletResponse response;
// -------------- tool methods
/**
* 注意:因为struts2.xml 里面没有写 <result></result> 这个项,所有这里的类型是 void,而不是 String
*
*
*
*/
public void jsonTest(){
String name = ServletActionContext.getRequest().getParameter("name");
Integer sex = Integer.valueOf(ServletActionContext.getRequest().getParameter("sex"));
JSONObject json = new JSONObject();
json.put("name",name);
if(sex.initValue == 1){
json.put("sex","男"):
}else{
json.put("sex","女"):
}
printToJson(json.toString());
}
/**
* 这里我指定了放回的类型 "text/json" 也可以是xml等其他类型
* 用response直接将数据打回到页面的 ajax 的请求里面去
*
*/
private void printToJson(String jsonStr) {
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/json");
response.setDateHeader("Expires", 0);
PrintWriter out = response.getWriter();
out.println(jsonStr);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//实现 ServletResponseAware 接口,必须实现的方法
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
}
?
?
这样,就可以通过上面的Action类,将所要的数据,通过response直接到回到ajax的请求里面去。
问题解决。
?
如果朋友们有更好的方法,请在这里留言。谢谢