日期:2014-05-16  浏览次数:20351 次

Struts2 Ajax 应用(不再书写type="json")

最近看了一些帖子,发现一些朋友在使用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:

  • 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;
	}
}			 

?

?

这样,就可以通过上面的Action类,将所要的数据,通过response直接到回到ajax的请求里面去。

问题解决。

?

如果朋友们有更好的方法,请在这里留言。谢谢

1 楼 lirong1978 2010-08-09  
我们是一样的,应该是最简单的。
2 楼 litaisheng001 2010-08-13  
其实配置个type=json就很简单吧。何必写这么多的代码。导入struts-json-plugin的类库包 不是更简单吗?
3 楼 huanghao8388 2012-02-19  
楼主思路不错,解决了我问题,谢谢!
我的项目Action配了type=json就报错,不配这个参数就正常, 你这个方法解决了我的问题