struts2中实现返回json格式请求
第一种方式:通过struts2-json-plugin插件
1、JSP页面
<script type="text/javascript"> /* 提交结果,执行ajax */ function btn(){ var $btn = $("input.btn");//获取按钮元素 //给按钮绑定点击事件 $btn.bind("click",function(){ $.ajax({ type:"post", url:"excuteAjaxJsonAction",//需要用来处理ajax请求的action data:{//设置数据源 name:$("input[name=name]").val(), age:$("input[name=age]").val(), position:$("input[name=position]").val() }, dataType:"json",//设置需要返回的数据类型 success:function(data){ var d = eval("("+data+")");//将数据转换成json类型 $("#s_name").text(""+d.name+""); $("#s_age").text(""+d.age+""); $("#s_position").text(""+d.position+""); }, error:function() alert("系统异常,请稍后重试!"); } }); }); } </script>
2、Action代码
public class JsonAction extends ActionSupport implements ServletRequestAware{ private HttpServletRequest request; private String result; public void setServletRequest(HttpServletRequest arg0) { this.request = arg0; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } /** * 处理ajax请求 */ public String excuteAjax(){ try { //获取数据 String name = request.getParameter("name"); int age = Integer.parseInt(request.getParameter("age")); String position = request.getParameter("position"); //将数据存储在map里,再转换成json类型数据,也可以自己手动构造json类型数据 Map<String,Object> map = new HashMap<String,Object>(); map.put("name", name); map.put("age",age); map.put("position", position); JSONObject json = JSONObject.fromObject(map);//将map对象转换成json类型数据 result = json.toString();//给result赋值,传递给页面,同时也是struts.xml中param参数root的值 } catch (Exception e) { e.printStackTrace(); } return SUCCESS; } }
3、struts.xml
<struts> <package name="simpleton" extends="struts-default,json-default"> <!-- package需要继承json-default --> <action name="*JsonAction" method="{1}"class="com.simpleton.demo.action.JsonAction"> <!-- 返回json类型数据 --> <result type="json"> <param name="root">result</param> <!-- name不要乱改 --> <!-- param名为root的参数就是action中设置的变量名result,也是页面需要返回的数据,该变量必须有setter和getter方法 --> </result> </action> </package> </struts>
第二种方式:借助输出流,来向请求响应一个json格式的数据
1、编写action类,实现返回json数据方法。
public class BaseAction { public String ajax(Object out){ PrintWriter writer = null; try { HttpServletResponse response = ServletActionContext.getResponse(); response.setContentType("application/json;charset=utf-8"); writer = response.getWriter(); response.setDateHeader("Expires", 0); JSONObject object = JSONObject.fromObject(out); writer.write(object.toString()); writer.flush(); } catch (Exception e) { e.printStackTrace(); }finally{ if(writer!=null){ writer.close(); } } return null; } }
2、编写一个BaseAction,实现方法ajax,用来将java对象转换为json对象,并输出。我们需要实现json返回请求的类可以继承该类。
public class UserAction extends BaseAction { public String json(){ Map<String, Object> result = new HashMap<String, Object>(); result.put("code", 200); result.put("msg", "success"); result.put("error", "没有错误信息"); return ajax(result); } }
这种通过PrintWriter返回的方式可以不用配置struts.xml,但是需要注意一个地方,就是我们在设置返回类型和编码的时候,需要在resonse.getWriter()之前。