方法1: 通过在outpuutStream中写入数据的方式实现返回 public void write() throws IOException{HttpServletResponse response=ServletActionContext.getResponse();/* * 在调用getWriter之前未设置编码(既调用setContentType或者setCharacterEncoding方法
方法1:
通过在outpuutStream中写入数据的方式实现返回
public void write() throws IOException{ HttpServletResponse response=ServletActionContext.getResponse(); /* * 在调用getWriter之前未设置编码(既调用setContentType或者setCharacterEncoding方法设置编码), * HttpServletResponse则会返回一个用默认的编码(既ISO-8859-1)编码的PrintWriter实例。这样就会 * 造成中文乱码。而且设置编码时必须在调用getWriter之前设置,不然是无效的。 * */ response.setContentType("text/html;charset=utf-8"); //response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); //JSON在传递过程中是普通字符串形式传递的,这里简单拼接一个做测试 String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"张三\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}"; out.println(jsonString); out.flush(); out.close(); }action的配置: <action name="write" class="json.JsonAction" method="write" />方法2:
使用Struts2对JSON的扩展,要使用这个扩展功能肯定需要添加支持包。经过本人的调试,这里有两种选择:
1. xwork-core-2.1.6.jar和struts2-json-plugin-2.1.8.jar。如果你想使用struts2-json-plugin-2.1.8.jar这种支持方式,你的xwork-core-*.jar不能选择2.2.1及以上版本,因为xwork-core-*.jar的2.2.1及以上版本中没有了org.apache.commons.lang等包。启动tomcat的时候会出现:java.lang.NoClassDefFoundError: org.apache.commons.lang.xwork.StringUtils。
2. xwork-2.1.2.jar和jsonplugin-0.34.jar。如果想用jsonplugin-0.34.jar这种支持方式,那需要切换你的xwork-core-*.jar为xwork-2.1.2.jar。因为jsonplugin-0.34.jar需要com.opensymphony.xwork2.util.TextUtils
这个类的支持。而xwork-core-*.jar的2.2.1以上版本均为找到该类,且在xwork-core-2.1.6.jar中也没有该类。
action代码:
package json; import java.util.HashMap; import java.util.Map; import org.apache.struts2.json.annotations.JSON; import com.opensymphony.xwork2.ActionSupport; /** * JSON测试 * * @author Watson Xu * @date 2012-8-4 下午06:21:01 */ public class JsonAction extends ActionSupport{ private static final long serialVersionUID = 1L; private Map<String,Object> dataMap; private String key = "Just see see"; public String json() { // dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据 dataMap = new HashMap<String, Object>(); User user = new User(); user.setName("张三"); user.setPassword("123"); dataMap.put("user", user); // 放入一个是否操作成功的标识 dataMap.put("success", true); // 返回结果 return SUCCESS; } public Map<String, Object> getDataMap() { return dataMap; } //设置key属性不作为json的内容返回 @JSON(serialize=false) public String getKey() { return key; } }struts.xml文件配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ""> <struts> <package name="json" extends="struts-default,json-default" > <action name="json" class="json.JsonAction" method="json"> <result type="json"> <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 --> <param name="root">dataMap</param> </result> </action> </package> </struts>使用注解的方式可以减少xml文件的配置: package watson.action; import java.util.HashMap; import java.util.Map; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; @ParentPackage("base") @Namespace("/watson") @Results({ @Result(name = "json",type="json", params={"root","msg"}) }) public class JsonAction { @Action(value="json") public String json() { msg = new HashMap<String, Object>(); msg.put("flag", "success"); Map<String, String> user = new HashMap<String, String>(); user.put("name", "张三"); user.put("age", "34"); msg.put("user", user); return "json"; } //================================== private Map<String, Object> msg; <span style="color:#ff0000;">public Map<String, Object> getMsg() { return msg;//返回的数据必须具有get方法 }</span> }