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:
- jakarta commons-lang 2.4
- jakarta commons-beanutils 1.7.0
- jakarta commons-collections 3.2
- jakarta commons-logging 1.1.1
- ezmorph 1.0.6
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;
- }
- }
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的请求里面去。
问题解决。