复杂的json提交给Struts2普通的request.getParameter()是获取不到的

今天在编码的时候遇到遇到一个奇特的问题,在前端客户段提交json数据到Struts2时,在通过request.getParameter()对相应的json数据进行获取竟然是null

前台jquery如下:

$.post("test.do", {"reportId":"2c90f1884cc110e6014cc117de000002","fileFormat":"Docx","reName":"text","columns":"名字;狀態","isIndent":"Y"} );

以上是最常见的一种普通json,單一的key-value形式,这种就能通过request.getParameter("name")获取对应的值

但是如果是一下这种情况的话就难说了

$.post("test.do", {"reportId":"2c90f1884cc110e6014cc117de000002","fileFormat":"Docx","reName":"text","columns":"名字;狀態","isIndent":"Y","conditionDTOs":[{"keyName":"nameLike","keyCode":"like","keyValue":"%会%"}]} );

上面这种情况比较特殊,在json里面并不是单纯的key-value的形式,而是包含了key-[key-value]的特殊情况,也就是他是一个复杂的json对象,如果以类似这种方式提交json.早struts2的action中是获取不到全部内容的,注意我说的是全部内容,为什么呢这么说呢?

原因很简单,这种情况下,前面定义的key-value还是能获取的,而复杂的key-[key-value]才是获取不到,既然Struts2如此,普通的Servlect也是如此的,有点基础的都懂,这里不详述了

那么问题来了,我想获取key-[key-value]这种复杂的json,request.getParameter()又解决不了问题,怎么办呢?

由此,我们引出了:

request.getReader();

没错,以流的方式解决一切

具体代码如下(Struts2为例子):

public String exportReportByJson() throws IOException {
		HttpServletRequest request = ServletActionContext.getRequest();
		String line =null;
		StringBuffer json = new StringBuffer();
		BufferedReader reader = null;
		reader = request.getReader();
        while((line = reader.readLine()) != null) {
            json.append(line);
        }
        reader.close();
        System.out.println(json.toString());

		return null;
	}

以流的方式获取客户端提交的所有数据,这里需要说明一点的是

request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。

所以,如果在获取完流后在调用request.getParameter()就会报错,请注意哦

嗯,以上是一种比较特殊的服务端获取复杂json的解决方案,会有用到的时候,请收藏哦

时间: 2024-08-05 17:01:33

复杂的json提交给Struts2普通的request.getParameter()是获取不到的的相关文章

ajax传JSON时设置的contenttype导致JAVA中request.getParameter("")怎么也接收不到数据

ajax传JSON时设置的contenttype默认值是application/x-www-form-urlencoded, 当ajax传JSON时设置的contenttype 如果是application/json或者text/json时,JAVA中request.getParameter("")是接收不到数据的. 因为在java后台会认为你传递的是一个纯文本流,而非键值对,是不能存入requestMap的. 可以把流读取出来转成json转成lsit或对象等,在Spring中使用@R

Struts2(二)---将页面表单中的数据提交给Action

问题:在struts2框架下,如何将表单数据传递给业务控制器Action. struts2中,表单想Action传递参数的方式有两种,并且这两种传参方式都是struts2默认实现的,他们分别是基本属性注入.域模型注入 .其中: ---基本属性注入,是将表单的数据项分别传入给Action中的一些基本基本类型. ---域模型注入,是将表单的数据项打包传入给Action中的一个实体对象. 我们项目Struts2的实例,在其基础上使用这2中方式完成页面向Action的参数传递.具体的我们可以在项目首页r

Struts2:request & response

整理自网上:  1.   获取Request和Response的方法  1.1. ServletActionContext的静态方法 1     HttpServletRequest request = ServletActionContext.getRequest();  2     HttpServletResponse response = ServletActionContext.getResponse();  1.2.      ActionContext对象的方法 1 ActionC

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry '2′ for key 'PRIMARY' 你的主键是不可重复的,现在重复插入值为3的主键了.可以去掉主键唯一,或是设成自增加.就不会出现这种情况了. 具体操作: 进入后台,"系统" - "系统设置" - "SQL命令行工具" 运行SQL命令行: alter table dede_addonarticle

JSON格式输出Struts2

public void JSON(Object object,String charset){   getHttpResponse().setCharacterEncoding(charset);   getHttpResponse().setContentType("text/html;charset="+charset);   try {    JSONUtil.serialize(getHttpResponse().getWriter(), object);    getHttp

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方。Duplicate entry

把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方.Duplicate entry ’3′ for key ‘PRIMARY’ 你的主键是不可重复的,现在重复插入值为3的主键了.可以去掉主键唯一,或是设成自增加.就不会出现这种情况了. 具体操作:进入后台,“系统” - “系统设置” - “SQL命令行工具” 运行SQL命令行: alter table dede_addonarticle drop primary key 运行上面的代码就

request.getParameterValues与request.getParameter的区别

一. 简单的对比 request.getParameter用的比较多,相对熟悉 request.getParameterValues(String   name)是获得如checkbox类(名字相同,但值有多个)的数据.   接收数组变量 ,如checkobx类型     request.getParameter(String   name)是获得相应名的数据,如果有重复的名,则返回第一个的值 . 接收一般变量 ,如text类型 例: 1. 三个名字相同的text标签 <input type=&qu

request.getParameterValues与request.getParameter的差别

一. 简单的对照 request.getParameter用的比較多,相对熟悉 request.getParameterValues(String   name)是获得如checkbox类(名字同样,但值有多个)的数据.   接收数组变量 ,如checkobx类型     request.getParameter(String   name)是获得对应名的数据,假设有反复的名,则返回第一个的值 . 接收一般变量 ,如text类型 例: 1. 三个名字同样的text标签 <input type=&qu

使用struts2的标签s:if获取url中的参数值,并与字符串常量进行比较

大家都知道,jsp中最好不要写java脚本,稍微复杂一点的逻辑都会让代码十分难看,对于维护来说简直是噩梦.但是我们又不可能完全不在jsp中写java脚本,像<%= request.getContextPath()>这种方式,很方便而且也不会让代码很难看.当jsp中需要有复杂的逻辑判断或者循环的时候,最好使用标签库来提高代码的可维护性,比如标准的JSTL库,还有很常用的struts2标签库. 比如有一个url http://127.0.0.1:8080/demo/test.jsp?id=1 ,我