使用Servlet返回JSON数据到客户端:
15publicclassJSON extendsHttpServlet {20privatestaticfinallongserialVersionUID = 1L;32publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)33throwsServletException, IOException {3435response.setContentType("text/html");36PrintWriter out = response.getWriter();37//将要被返回到客户端的对象38User user=newUser();39user.setId("123");40user.setName("JSONServlet");41user.setPassword("JSON");42user.setSay("Hello , i am a servlet !");43JSONObject json=newJSONObject();44json.accumulate("success", true);45json.accumulate("user", user);46out.println(json.toString());47// 因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端48// 以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段49// String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONServlet\",\"say\":\"Hello , i am a servlet !\",\"password\":\"JSON\"},\"success\":true}";50// out.println(jsonString);51out.flush();52out.close();53}65publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)66throwsServletException, IOException {67doGet(request, response);68}6970}
结果在意料之中,如下图所示:
使用JSP(或html等)返回JSON数据到服务器端:
1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
2 | {"user":{"id":"123","name":"JSONJSP","say":"Hello , i am a JSP !","password":"JSON"},"success":true} |
这个就不用去看结果了吧。
再回到Struts,在Struts的MVC模型中,Action替代Servlet担当了Model的角色,所以对于Struts而言,返回 JSON数据到客户端,跟传统的WEB应用一样,存在两种方式,即在Action中输出JSON数据,和在视图资源中输出JSON数据。再往下细分的话,在Action中输出JSON数据又分为两种方式,一是使用传统方式输出自己包装后的JSON数据,二是使用Struts自带的JSON数据封装功能来自动包装并返回JSON数据。
在视图资源中输出JSON数据
Action处理完用户请求后,将数据存放在某一位置,如request中,并返回视图,然后Struts将跳转至该视图资源,在该视图中,我们需要做的是将数据从存放位置中取出,然后将其转换为JSON字符串,输出在视图中。这跟传统WEB应用中在JSP页面输出JSON数据的做法如出一辙:
01publicString testByJSP() {02User user = newUser();03user.setId("123");04user.setName("Struts2");05user.setPassword("123");06user.setSay("Hello world !");07JSONObject jsonObject=newJSONObject();08jsonObject.accumulate("user", user);09//这里在request对象中放了一个data,所以struts的result配置中不能有type="redirect"10ServletActionContext.getRequest().setAttribute("data", jsonObject.toString());11returnSUCCESS;12};
|
因为是常规的Struts流程配置,所以配置内容就不再展示了。
JSP代码就非常简单了,
1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
2 | ${data } |
结果如图所示:
在Action中以传统方式输出JSON数据
这一点跟传统的Servlet的处理方式基本上一模一样,代码如下
01 | public void doAction() throws IOException{ |
02 |
HttpServletResponse response=ServletActionContext.getResponse(); |
03 |
//以下代码从JSON.java中拷过来的 |
04 |
response.setContentType( "text/html" ); |
05 |
PrintWriter out; |
06 |
out = response.getWriter(); |
07 |
//将要被返回到客户端的对象 |
08 |
User user= new User(); |
09 |
user.setId( "123" ); |
10 |
user.setName( "JSONActionGeneral" ); |
11 |
user.setPassword( "JSON" ); |
12 |
user.setSay( "Hello , i am a action to print a json!" ); |
13 |
JSONObject json= new JSONObject(); |
14 |
json.accumulate( "success" , true ); |
15 |
json.accumulate( "user" , user); |
16 |
out.println(json.toString()); |
17 | // 因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端 |
18 | // 以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段 |
19 | // String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}"; |
20 | // out.println(jsonString); |
21 |
out.flush(); |
22 |
out.close(); |
23 |
} |
struts.xml中的配置:
1 | < package name = "default" extends = "struts-default" namespace = "/" > |
2 |
< action name = "testJSONFromActionByGeneral" class = "cn.ysh.studio.struts2.json.demo.action.UserAction" method = "doAction" > |
3 |
</ action > |
4 | </ package > |
01publicvoiddoAction() throwsIOException{02HttpServletResponse response=ServletActionContext.getResponse();03//以下代码从JSON.java中拷过来的04response.setContentType("text/html");05PrintWriter out;06out = response.getWriter();07//将要被返回到客户端的对象08User user=newUser();09user.setId("123");10user.setName("JSONActionGeneral");11user.setPassword("JSON");12user.setSay("Hello , i am a action to print a json!");13JSONObject json=newJSONObject();14json.accumulate("success", true);15json.accumulate("user", user);16out.println(json.toString());17// 因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端18// 以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段19// String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}";20// out.println(jsonString);21out.flush();22out.close();23}struts.xml中的配置:12 34
注意:这个action没有result,且doAction方法没有返回值!