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>

JSON数据在Action类中是根据getter方法的返回值自动装配的,也就是说完全可以不需要重写execute方法。JSON的生成机制(上述两个必需的包中提供的方法)会直接从setter方法获取到request中提供的值,并且自动装配getter方法提供的返回值。期间如果有其它的功能操作,如计算、查询数据库、重组数据等,可以写到getter方法中,也可以写到execute方法中统一执行。

这里需要注意的是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数据,不需要跳转页面。


 

Structs2中Action返回json到前台方法的更多相关文章

  1. WebApi中直接返回json字符串的方法

    [HttpPost] public HttpResponseMessage Upload() { string json = "{\"result\":\"tr ...

  2. struts通过action返回json

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

  3. MVC3中Action返回类型ActionResult类型

    MVC3中Action返回类型ActionResult在System.Web.Mvc命名空间中.这些包含在控制器中的方法,我们称为控制器中的 Action,比如:HomeController 中的 I ...

  4. Spring MVC 3.0 返回JSON数据的方法

    Spring MVC 3.0 返回JSON数据的方法1. 直接 PrintWriter 输出2. 使用 JSP 视图3. 使用Spring内置的支持// Spring MVC 配置<bean c ...

  5. Controller 中Action 返回值类型 及其 页面跳转的用法

        •Controller 中Action 返回值类型 View – 返回  ViewResult,相当于返回一个View 页面. -------------------------------- ...

  6. spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500:no convertter for return value of type

    问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json ...

  7. Flask Response响应(flask中设置响应信息的方法,返回json数据的方法)

    设置响应信息的方法 1.  返回自定义的响应头,有两种方式: (1)  第一种是:视图函数return的时候,使用元组,返回自定义的信息 返回的时候的状态码可以自定义信息:"状态码   自定 ...

  8. 如何在Crystal Portlet中正确返回JSON数据给AJAX请求?

    当Crystal Portlet中需要采用Ajax请求,并让后台返回Json数据时,如何才能正确.方便的返回Json数据呢? 以下两种方法均可: 方法一:Ajax请求时,采用RenderURL,对应P ...

  9. Struts2返回JSON对象的方法总结

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

随机推荐

  1. vb串口通信界面

    界面如上: 程序如下: Dim num As Byte     '申明一个全局变量为单字节型 '单击“清空接收缓冲区”按钮时,将接收缓冲区清空,此过程为“清空接收缓冲区”的单击事件 Private S ...

  2. 第十四个目标(dp + 树状数组 + 线段树)

    Problem 2236 第十四个目标 Accept: 17    Submit: 35 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  3. qt超强精美绘图控件 - QCustomPlot一览 及 安装使用教程

    1.概述 QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用,远比qwt方便和漂亮,可以自己 ...

  4. 7. 稀疏表示之OMP,SOMP算法及openCV实现

    一.前言 稀疏表示是自上世纪90年代开始,从人眼的视觉感受野获得启示,逐渐被人们所研究.现在已经发展为一种重要的信息表示方法.所谓稀疏表示是指,一个信号在过完备字典中,可以由少数个原子线性表达, 其数 ...

  5. [汇编学习笔记][第五章[BX]和loop指令]

    第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...

  6. Linq:切勿使用 Count() > 0 来判断集合非空

    原文(http://www.cnblogs.com/ldp615/archive/2011/12/11/2284154.html) Linq 出现之前,我们通常使用下面的方式来判断集合是否非空,即集合 ...

  7. iOS获取网络时间与转换格式

      [NSDate date]可以获取系统时间,但是会造成一个问题,用户可以自己修改手机系统时间,所以有时候需要用网络时间而不用系统时间.获取网络标准时间的方法: 1.先在需要的地方实现下面的代码,创 ...

  8. sqlite3安装

    SQLite命令行程序(CLP)是开始使用SQLite的最好选择,按照如下步骤获取CLP: 1).打开浏览器进入SQLite主页,www.sqlite.org. 2).单击页面顶部的下载链接(Down ...

  9. 为什么报错说req未定义,createServer只接受匿名函数吗?

    var http = require('http');var server = new http.createServer(handlerRequest(req,res));server.listen ...

  10. IIS Hang Troubleshoot

    Your website maybe stop working and response very lowly. How to find out the reason? Below are the g ...