标签:
1.传统方式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 > |
这个action没有result,且doAction方法没有返回值!
2.structs2封装方式01 | < result type = "json" > |
02 | <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 --> |
03 | <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 --> |
04 | < param name = "root" >dataMap</ param > |
05 | <!-- 指定是否序列化空的属性 --> |
06 | < param name = "excludeNullProperties" >true</ param > |
07 | <!-- 这里指定将序列化dataMap中的那些属性 --> |
08 | < param name = "includeProperties" > |
09 | userList.* |
10 | </ param > |
11 | <!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 --> |
12 | < param name = "excludeProperties" > |
13 | SUCCESS |
14 | </ param > |
15 | </ result > |
这里需要注意的是execute方法的返回值字符串是无效的,可以随意设置,因为在后面的配置文件中并不会用到。
getter方法返回值的类型可以采用基本数据类型、String类、集合类(List、Map等)以及诸如Double、Integer等打包类。这些都不会影响JSON的生成,因为对于结果而言都是字符串类型的;而集合类在生成时会被自动迭代,因此生成的结果中其本身的集合类型(列表、映射表等)也不会改变。
因此在Action类可以将所有的结果数据保存到一个List或Map中在通过getter方法输出,也可以设置多个getter方法返回不同类型、不同变量的数据。这些数据在JSON中的名称与getter方法名中一致。
与基本的Action相比,生成JSON的Action在配置文件struts.xml中主要有两点不同:
1. 不能与基本的Action配置在同一个package中,新的package必须扩展自(extends)json-default命名空间;
2. result标签中可以不包含name属性(因为没用),但是必须包含type属性,且值必须为“json”,即<result type=”json” ></result>,表明这是一个JSON数据,不需要跳转页面。
标签:
原文地址:http://www.cnblogs.com/doit8791/p/4294276.html