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()之前。