一.认识JSON

JSON是一种轻量级、基于文本、与语言无关的数据交换格式,可以用文本格式的形式来存储或表示结构化的数据。

二.POST请求与Content-Type: application/json

常用的HTTP请求方法有GET, POST, PUT, DELETE等。在提交POST请求时,请求数据放在消息体(Body)中,请求数据的格式及编码方式用Content-Type来指定。如我们常用的表单<form>提交,其Content-Type默认为application/x-www-form-urlencoded,提交的数据按照key1=val1&key2=val2进行编码,服务器端也能很容易地解析K-V值。

JSON的出现,让交换的数据不再仅限于简单的K-V结构,而可以有更加复杂的层级,特别适合于RESTful接口。在发送请求时,指定Content-Type为application/json,即可使用JSON字符串作为请求的数据。而在服务器端接收到该请求后,将按照JSON字符串对请求数据进行处理。

三.Struts2接收JSON请求

在Struts2的Action中提取Content-Type为application/x-www-form-urlencoded的POST参数,我们非常熟悉:在Action中定义属性及其getter, setter方法,接收到请求时,默认会将与属性同名的参数值赋予该属性

但是对Content-Type为application/json的请求数据,Struts2默认无法解析。因为请求的JSON数据需从输入流中读取出来,无法直接从ServletRequest的请求参数中解析。很容易想到,要读取JSON请求数据,最直接的方式就是从输入流读取。而同时,Struts2的strus2-json-plugin也提供了有关的拦截器,对JSON请求数据进行解析。下面将对两种方案进行分析:

1.从输入流中读取JSON请求数据,以下是在Action中实现的一个读取输入流数据的方法

     //解析请求的Json数据
private String getRequestPostData(HttpServletRequest request) throws IOException {
int contentLength = request.getContentLength();
if(contentLength<0){
return null;
}
byte buffer[] = new byte[contentLength];
for (int i = 0; i < contentLength;) {
int len = request.getInputStream().read(buffer, i, contentLength - i);
if (len == -1) {
break;
}
i += len;
}
return new String(buffer, "utf-8");
}

在Action的execute方法中调用该方法,即可获取到请求的JSON数据。

2.使用struts2-json-plugin配置

  • 添加struts2-json-plugin的依赖,以maven配置为例:
<dependencies>
...
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>STRUTS_VERSION</version>
</dependency>
...
</dependencies>
  • struts.xml配置文件添加JSON配置(粗体部分)
<package name="example"  extends="struts-default,json-default">
...
<interceptor-ref name="json"/>
...
</package>
  • 在Action中指定JSON数据中各个key及getter, setter,如请求的JSON数据如下,则在Action中定义名为type, message, code的属性及其getter, setter
{
"type":10,
"message": "this is a test msg",
"code": 200
}

这样,在接收到以上JSON请求数据时,Struts会默认将type, message, code的值解析出来。

3.struts2-json-plugin解析JSON请求数据的分析

经过分析,struts2-json-plugin解析JSON请求数据,最核心的一个类是JSONIntercepter类。该拦截器的主要工作就是:读取JSON请求数据,将JSON数据提取出K-V值并设置到Action的属性中。步骤如下:

  • 判断当前请求数据类型是否为JSON类型
 String contentType = request.getHeader("content-type");
...
if ((contentType != null) && contentType.equalsIgnoreCase("application/json")) {
// load JSON object
Object obj = JSONUtil.deserialize(request.getReader());
...
}
  • 如果数据类型为JSON,从输入流中读取JSON数据,以下为JSONUtil类的deserialize方法
     public static Object deserialize(Reader reader) throws JSONException {
// read content
BufferedReader bufferReader = new BufferedReader(reader);
String line;
StringBuilder buffer = new StringBuilder(); try {
while ((line = bufferReader.readLine()) != null) {
buffer.append(line);
}
} catch (IOException e) {
throw new JSONException(e);
} return deserialize(buffer.toString());
}
  • 解析得到JSON对象后,遍历JSON对象,取出K-V,通过反射的V设置给予K相同的属性

开发者可根据自己的需求进行选择:从输入流直接读取JSON请求数据,或使用struts2-json-plugin对JSON请求数据进行处理。

参考资料:

四种常见的 POST 提交数据方式(https://imququ.com/post/four-ways-to-post-data-in-http.html)

JSON Plugin(https://struts.apache.org/docs/json-plugin.html)

Struts2 Action接收POST请求JSON数据及其实现解析的更多相关文章

  1. 浅析ajax请求json数据并用js解析(示例分析)

    这应该是每个web开发的人员都应该掌握的基础技术,需要的朋友可以参考下 自从接触了jquery就喜欢上了前端开发,而且深深感受到了前端开发的强大与重要之处.同时也想为asp.net鸣不平,事实上asp ...

  2. ajax post请求json数据在spring-controller解析

    1.前端post请求数据: userInfo=[{"id":"5","uname":"小李","phone&q ...

  3. Struts2.5 利用Ajax将json数据传值到JSP

    AJAX +JSON=>JSP AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着 ...

  4. bootstrap通过ajax请求JSON数据后填充到模态框

    1.   JSP页面中准备模态框 <!-- 详细信息模态框(Modal) --> <div> <div class="modal fade" id=& ...

  5. 关于使用Ajax请求json数据,@RequestMapping返回中文乱码的几种解决办法

    一.问题描述: 使用ajax请求json数据的时候,无论如何返回的响应编码都是ISO-8859-1类型,因为统一都是utf-8编码,导致出现返回结果中文乱码情况. $.ajax({ type:&quo ...

  6. 【Struts2】SSH如何返回JSON数据

      在开发中我们经常遇到客户端和后台数据的交互,使用比较多的就是json格式了.在这里以简单的Demo总结两种ssh返回Json格式的数据 项目目录如下 主要是看 上图选择的部分 WebRoot里面就 ...

  7. jQuery提交Json数据到Webservice,并接收返回的Json数据

    jQuery ajax webservice:get 和 post 一.GET 方式 客户端 复制代码 代码如下: var data = { classCode: "0001"}; ...

  8. AJAX跨域请求json数据的实现方法

    这篇文章介绍了AJAX跨域请求json数据的实现方法,有需要的朋友可以参考一下 我们都知道,AJAX的一大限制是不允许跨域请求. 不过通过使用JSONP来实现.JSONP是一种通过脚本标记注入的方式, ...

  9. react之fetch请求json数据

    Fetch下载 npm install whatwg-fetch -S Fetch请求json数据 json文件要放在public内部才能被检索到

随机推荐

  1. 虚幻UE4中移动端水材质的设置

    内容: *概述 *纹理文件 *基本颜色 *法线的设置 *标量参数和材质属性 *场景设置 *最终效果 概述 本教程由52VR翻译自unrealengine官方,在本教程中,我们将教您如何创建可以在移动设 ...

  2. linux中/etc/profile、/etc/profile.d/、/etc/bashrc、~/.bashrc、~/.bash_profile、~/.bash_logout的作用与区别

    作用: /etc/profile:登录时用来设置环境变量,执行文件中的命令,对所有用户生效. /etc/profile.d/:登录时和执行bash命令打开子shell时执行目录下所有已.sh结尾的脚本 ...

  3. [刷题]算法竞赛入门经典(第2版) 5-14/UVa1598 - Exchange

    题意:模拟买卖,当出售价bid等于或低于出售价ask,则交易. 代码:(Accepted,0.330s) //UVa1598 - Exchange //Accepted 0.330s //#defin ...

  4. 使用SpringBoot快速构建应用程序

    1.Spring MVC和Spring Boot自带的web构建方式有所区别.Spring提供了spring-boot-starter-web自动配置模块. 2. 添加如下依赖 <depende ...

  5. 无阻塞加载和defer、async

    无阻塞加载 把js放在head里,浏览器是怎么去执行它的呢,是按顺序加载还是并行加载呢?在旧的浏览器下,都是按照先后顺序来加载的,这就保证了加载的js依赖不会发生问题.但是少部分新的浏览器已经开始允许 ...

  6. 关于STM32在程序中间修改PWM值的总结(原创)

    首先在STM32库函数里有这样一个函数 void TIM3_PWM_Init(u16 arr,u16 psc)   若TIM3_PWM_Init(7200,100)//设置频谱7200.分频100   ...

  7. 纯css实现多标签浮动居中(任意个数)

    在做的一个网页上有一块要用浮动标签,具体就是网页底部有未知数量,未知尺寸的元素要水平居中,有点类似于分页器. 首先,我们先新建一个容器con,就是标签的爸爸,用来控制标签在页面的位置,.father{ ...

  8. SmartCoder每日站立会议05

    1.站立会议内容 经过四天的努力,我们的微信小程序有了很大的进展,首页的设计定了方案,API接地图正在试着把消息展示到其中,争取把地图信息做到直观形象. 站立会议照片: 2.任务展板 3.燃尽图

  9. netty基础--基本收发

    使用maven构建一个基本的netty收发应用,作为其他应用的基础.客户端使用packet sender工具. 1  添加netty依赖 1  maven netty依赖 <dependency ...

  10. Java的必备开发工具

    身为一个Java开发的爱好者,你不得不承认需要安装以下软件 NO.1 Java开发工具包 Java JDK 可以说这个工具包不得不安装,因为这个工具包是开发Java程序的核心! Java JDK工具包 ...