http://kingxss.iteye.com/blog/1622455

如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择。而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持。但是,在开发工作中,对功能的升级是基于既定架构是很常见的情况。本人碰到需要用开发基于Struts2的HTTP+JSON返回类型接口就是基于既定框架结构下进行的。

Struts2返回JSON有两种方式:1.使用Servlet的输出流写入JSON字符串;2.使用Struts2对JSON的扩展。

一.使用Servlet的输出流

JSON接口的实质是:JSON数据在传递过程中,其实就是传递一个普通的符合JSON语法格式的字符串而已,所谓的“JSON对象”是指对这个JSON字符串解析和包装后的结果。

所以这里只需要将一个JSON语法格式的字符串写入到Servlet的HttpServletResponse中,这里使用的是PrintWriter的方式,当然也可以采用Stream流的方式。需要注意的是:在调用getWriter之前未设置编码(既调用setContentType或者setCharacterEncoding方法设置编码), HttpServletResponse则会返回一个用默认的编码(既ISO-8859-1)编码的PrintWriter实例。这样就会造成中文乱码。而且设置编码时必须在调用getWriter之前设置,不然是无效的。

编写接口代码:

这里的方法与一般的Struts2方法的区别是这里是void返回类型。

Java代码  
  1. public void write() throws IOException{
  2. HttpServletResponse response=ServletActionContext.getResponse();
  3. /*
  4. * 在调用getWriter之前未设置编码(既调用setContentType或者setCharacterEncoding方法设置编码),
  5. * HttpServletResponse则会返回一个用默认的编码(既ISO-8859-1)编码的PrintWriter实例。这样就会
  6. * 造成中文乱码。而且设置编码时必须在调用getWriter之前设置,不然是无效的。
  7. * */
  8. response.setContentType("text/html;charset=utf-8");
  9. //response.setCharacterEncoding("UTF-8");
  10. PrintWriter out = response.getWriter();
  11. //JSON在传递过程中是普通字符串形式传递的,这里简单拼接一个做测试
  12. String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"张三\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}";
  13. out.println(jsonString);
  14. out.flush();
  15. out.close();
  16. }

配置action

从以下的配置中可以明显的看到配置与普通的action配置没有任何区别,只是没有返回的视图而已。

Java代码  
  1. <action name="write" class="json.JsonAction" method="write" />

返回值

Console代码  
  1. {"user":{"id":"123","name":"张三","say":"Hello , i am a action to print a json!","password":"JSON"},"success":true}

二.使用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中也没有该类。

最后说一句,还因为用原始构建方式而不停蹚雷,确实不值得,真心累。使用Maven等自动化构件方式,会在很大程度上避免依赖包间的版本差异的bug。第三节的“struts2零配置”中会使用maven的构件方式。

编写接口代码

该类中json()方法就是普通Struts2的方法。在这里没有看到任何JSON格式的字符串,因为我们将要把这项工作交给扩展去完成。在没有任何设定的情况下,改类下的所有getter方法的返回值将被包含在返回给客户端的JSON字符串中。要剔除不需要包含的属性,在类结构结构中需要在getter方法上使用@JSON(serialize=false)进行注解,当然在不影响其他业务的时候也可以直接去掉这个getter方法。所以本例中的返回结果是将dataMap对象转换成的JSON格式的字符串。

Java代码  
  1. package json;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.apache.struts2.json.annotations.JSON;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. /**
  7. * JSON测试
  8. *
  9. * @author Watson Xu
  10. * @date 2012-8-4 下午06:21:01
  11. */
  12. public class JsonAction extends ActionSupport{
  13. private static final long serialVersionUID = 1L;
  14. private Map<String,Object> dataMap;
  15. private String key = "Just see see";
  16. public String json() {
  17. // dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据
  18. dataMap = new HashMap<String, Object>();
  19. User user = new User();
  20. user.setName("张三");
  21. user.setPassword("123");
  22. dataMap.put("user", user);
  23. // 放入一个是否操作成功的标识
  24. dataMap.put("success", true);
  25. // 返回结果
  26. return SUCCESS;
  27. }
  28. public Map<String, Object> getDataMap() {
  29. return dataMap;
  30. }
  31. //设置key属性不作为json的内容返回
  32. @JSON(serialize=false)
  33. public String getKey() {
  34. return key;
  35. }
  36. }

配置aciton

在配置中,首先需要action所在的package继承了json-default,或者继承的父包继承了json-default。这配置action的返回类型的type为json,并且可以配置其序列化的属性等一些类参数

Xml代码  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <package name="json" extends="struts-default,json-default" >
  7. <action name="json" class="json.JsonAction" method="json">
  8. <result type="json">
  9. <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
  10. <param name="root">dataMap</param>
  11. </result>
  12. </action>
  13. </package>
  14. </struts>

返回值

Console代码  
  1. {"success":true,"user":{"name":"张三","password":"123"}}

三. Struts2零配置使用方法,使用Maven构件:

3.1) 建立一个webapp,这里还是采用Maven构建,构建过程参考limingnihao的blog: 使用Eclipse构建Maven的SpringMVC项目 。

3.2) 添加Struts2的依赖、struts2零配置依赖和struts2的json依赖:

Xml代码  
  1. <dependencies>
  2. <!-- struts2核心依赖 -->
  3. <dependency>
  4. <groupId>org.apache.struts</groupId>
  5. <artifactId>struts2-core</artifactId>
  6. <version>2.3.4</version>
  7. <type>jar</type>
  8. <scope>compile</scope>
  9. </dependency>
  10. <!-- struts2零配置依赖 -->
  11. <dependency>
  12. <groupId>org.apache.struts</groupId>
  13. <artifactId>struts2-convention-plugin</artifactId>
  14. <version>2.3.4</version>
  15. <type>jar</type>
  16. <scope>compile</scope>
  17. </dependency>
  18. <!-- struts2的json依赖 -->
  19. <dependency>
  20. <groupId>org.apache.struts</groupId>
  21. <artifactId>struts2-json-plugin</artifactId>
  22. <version>2.3.4</version>
  23. <type>jar</type>
  24. <scope>compile</scope>
  25. </dependency>
  26. </dependencies>

经过测试,上面的依赖包间没有出现版本兼容的bug,不仅仅因为他们是同一个版本,更加得益于Maven的自动构建方式。

3.3) 配置web.xml,启用Struts2:

Xml代码  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <filter>
  7. <filter-name>StrutsPrepareAndExecuteFilter </filter-name>
  8. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
  9. <init-param>
  10. <param-name>config</param-name>
  11. <param-value>struts-default.xml,struts-plugin.xml,struts.xml</param-value>
  12. </init-param>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
  16. <url-pattern>/*</url-pattern>
  17. </filter-mapping>
  18. </web-app>

3.4)配置struts.xml,设置一些基本常量和应用:

Xml代码  
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <package name="base" extends="json-default,struts-default">
  7. <!-- 这里可以设置一些全局的返回值映射关系等 -->
  8. </package>
  9. <constant name="struts.action.extension" value="" />
  10. <constant name="struts.ui.theme" value="simple" />
  11. <constant name="struts.i18n.encoding" value="utf-8" />
  12. <constant name="struts.multipart.maxSize" value="1073741824"/>
  13. <constant name="struts.devMode" value="false"/>
  14. </struts>

3.5)编写和配置Action。由并未指定Convention进行设置,所以对于Convention插件而言,默认的它会把所有类名以Action结尾的java类当成Action处理:

Java代码  
  1. package watson.action;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.apache.struts2.convention.annotation.Action;
  5. import org.apache.struts2.convention.annotation.Namespace;
  6. import org.apache.struts2.convention.annotation.ParentPackage;
  7. import org.apache.struts2.convention.annotation.Result;
  8. import org.apache.struts2.convention.annotation.Results;
  9. @ParentPackage("base")
  10. @Namespace("/watson")
  11. @Results({
  12. @Result(name = "json",type="json", params={"root","msg"})
  13. })
  14. public class JsonAction {
  15. @Action(value="json")
  16. public String json() {
  17. msg = new HashMap<String, Object>();
  18. msg.put("flag", "success");
  19. Map<String, String> user = new HashMap<String, String>();
  20. user.put("name", "张三");
  21. user.put("age", "34");
  22. msg.put("user", user);
  23. return "json";
  24. }
  25. //==================================
  26. private Map<String, Object> msg;
  27. public Map<String, Object> getMsg() {
  28. return msg;
  29. }
  30. }

3.6)部署项目,启动容器,浏览器地址栏中输入:http://localhost:7070/Struts2foo/watson/json。等到结果如下:

Json代码  
  1. {"flag":"success","user":{"age":"34","name":"张三"}}

从上面结果可知在启用了零配置以后,只是少了在xml中的配置,改为在每个action中用annotation进行注解。这里删除上面在xml中的配置,将下面的代码写入到上面的JsonAction的上部:

Java代码  
  1. @ParentPackage("base")
  2. @Namespace("/watson")
  3. @Results({
  4. @Result(name = "json",type="json", params={"root","msg"})
  5. })

root就相当xml配置中的参数配置。

四.附 

action的返回类型为json时的可配置参数详解:

Xml代码  
  1. <result type="json">
  2. <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
  3. <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->
  4. <param name="root">dataMap</param>
  5. <!-- 指定是否序列化空的属性 -->
  6. <param name="excludeNullProperties">true</param>
  7. <!-- 这里指定将序列化dataMap中的那些属性 -->
  8. <param name="includeProperties">userList.*</param>
  9. <!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一般不与上边的参数配置同时出现 -->
  10. <param name="excludeProperties">SUCCESS</param>
  11. </result>

参考:

1.《深入了解Struts2返回JSON数据的原理及具体应用范例 》

2.添加支持包时的bug汇总:http://hi.baidu.com/chennning/item/53d8f8b97c1fd5d985dd79de

3.jjiag22222的BLOG《HttpServletResponse中获取PrintWriter需要注意的一个小问题 》

4.struts2 零配置详解: http://topic.csdn.net/u/20101130/11/a47de200-c0e2-4daa-841b-5b2cb659f66b.html?45426

Struts2返回JSON对象的方法总结相关推荐

  1. java action result_Struts2 Result 返回JSON对象详解

    如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好 ...

  2. php返回json数组元素,php生成返回json对象数组(json支持中文)

    php生成返回json对象数组 注意两种方法生成的对象数组在结构上的区别 $jarr=array( 'total' => 239, 'list' => array( array( 'cod ...

  3. struts2操作json成字符串格式错误被转义及其前台访问json对象的方法

    这个问题确实纠结了我几天,是在是烦.网上也是参考了好几位大师的说法.都是不了了之. 这里记下这个问题,以备以后的参考. 我在struts2后台返回的是这样的json字符串: "[{\&quo ...

  4. ajax请求Struts2返回JSON数据方法

    如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好 ...

  5. Struts2返回JSON数据的具体应用范…

    Struts2返回JSON数据的具体应用范例 博客分类: Struts2 Struts2JSON  早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具 ...

  6. 从源代码角度看Struts2返回JSON数据的原理

    2019独角兽企业重金招聘Python工程师标准>>> 前面一篇文章其实只是介绍了如何在Struts2中返回JSON数据到客户端的具体范例而无关其原理,内容与标题不符惹来标题党嫌疑确 ...

  7. 深入了解Struts2返回JSON数据的原理及具体应用范例

    来源:http://yshjava.iteye.com/blog/1333104 早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一 ...

  8. action对象 java_struts2通过action返回json对象

    其实struts2通过action返回json挺简单的,但是就是老要忘,所以索性写在博客上.好的,开始. 首先是引入必须的jar包: struts2-json-plugin-2.3.24.jar 然后 ...

  9. python返回json数据_python和flask中返回JSON数据的方法

    在python中可以使用json将数据格式化为JSON格式: 1.将字典转换成JSON数据格式: s=['张三','年龄','姓名'] t={} t['data']=s return json.dum ...

最新文章

  1. RxJava 基础的使用
  2. java 判断当前运行的操作系统
  3. 湖南对口升学计算机组装考点,全国计算机等级考试湖南省考点名单及联系方式...
  4. 《转》atomic assign retain
  5. Python---编写一函数,将摄氏温度与华氏温度互转。
  6. ddnspod php 脚本_使用DNSPOD的域名解析实现DDNS域名动态的脚本
  7. 利用JavaScript在ASP.NET中动态生成系统菜单
  8. CodeForces - 466C Number of Ways(推公式/dp)
  9. PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层
  10. win7 安装 IIS
  11. 改造create-react-app 通过npm命令动态打包文件
  12. 【BZOJ2388】—旅行规划(分块+凸包)
  13. 数学魔鬼表达式——第二天
  14. arduino 控制无刷电机_怎样使用Arduino控制无刷电机
  15. 2020年你不可不知的自动化框架,可替代Selenuim的测试框架Top10
  16. Python 和 Java、PHP、C、C#、C++等其他语言的对比?
  17. 中南大学实验室安全知识 网上学习6小时的小工具,小技巧
  18. mybatis insert成功与否返回数据都是null
  19. 数论-模运算与同余的性质
  20. 智能客服系统开发(技术方案)

热门文章

  1. HarmonyOS之搭建和配置开发环境的流程
  2. 2017\National _C_C++_C\4.小数第n位
  3. 2019\Province_C_C++_B\试题G-完全二叉树的权值
  4. 124. Binary Tree Maximum Path Sum 二叉树中的最大路径和
  5. 287. Find the Duplicate Number
  6. 中国大学MOOC 计算机组成原理第5章 测试(下)
  7. BASIC-2 01字串
  8. feachall php_集合:给 PHP 数组插上翅膀
  9. java j集合_JNotes/Java-集合篇(2)集合之List.md at master · harryjudy2240/JNotes · GitHub...
  10. 2007标注没有文字_应用技巧:CAD在机械工程制图中尺寸标注