使用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}

结果在意料之中,如下图所示:

a1.jpg

使用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 }

结果如图所示:

a2.jpg

在Action中以传统方式输出JSON数据


这一点跟传统的Servlet的处理方式基本上一模一样,代码如下

01 publicvoiddoAction() throwsIOException{
02 HttpServletResponse response=ServletActionContext.getResponse();
03 //以下代码从JSON.java中拷过来的
04 response.setContentType("text/html");
05 PrintWriter out;
06 out = response.getWriter();
07 //将要被返回到客户端的对象
08 User user=newUser();
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=newJSONObject();
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 <packagename="default"extends="struts-default"namespace="/">
2 <actionname="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中的配置:1
2
34

注意:这个action没有result,且doAction方法没有返回值!