现在的位置: 首页 > 综合 > 正文

struts2学习 json数据返回

2019年05月24日 ⁄ 综合 ⁄ 共 3371字 ⁄ 字号 评论关闭

方法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"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<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>

}

抱歉!评论已关闭.