日期:2014-05-16 浏览次数:20416 次
最近看了一些帖子,发现一些朋友在使用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的请求里面去。
问题解决。
?
如果朋友们有更好的方法,请在这里留言。谢谢