getParameter只能提取x-www-form-urlencoded编码的数据?;常见的几种提交数据类型

假设某个类型(json、text等)的数据已经通过servlet或者Ajax等技术封装到http协议的请求体中,再发送到后台;这时候你要从后台拿出数据。
这里介绍通过HttpServlet最原始的方法拿去,非框架技术;
doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
如何拿出来呢?
首先你要确定前台发过来的数据的类型,也是请求头信息“contentType”是什么;
1.第一种情况:
contentType为application/x-www-form-urlencoded;
Content-Type: application/x-www-form-urlencoded;
  • 最常见的 POST 提交数据的方式。
  • 浏览器的原生 表单,如果不设置 enctype 属性,那么最终无论post还是get方式,就都会以 application/x-www-form-urlencoded 方式提交数据。除此之外,使用Jquery封装的Ajax技术$.post{}里面如果没有设置contentType的参数那么最终也还是会以application/x-www-form-urlencoded 方式提交数据。
  • 这种类型提交的数据将按照 “key1=value1&key2=value2” 的方式进行编码放在请求体中(是get就放在url后面)。例:
a=1&b=2
  • 在后台如何提取?用request.getParameter(‘key’) 方法返回valued的值,在API文档里并没有说getParameter只能取x-www-form-urlencoded类型的数据,但对于其他类型,我尝试了,都取不出来。
第二种情况:
Content-Type: application/multipart/form-data
  • 用处:使用表单上传文件。让 表单的 enctype 等于 multipart/form-data。一般用来上传文件,各大服务端语言对它也有着良好的支持。当然它也支持用键值对的方法将数据存进请求体中。
  • 这种类型提交的数据将按照某种奇怪的方式进行编码放在请求体中。假如这里form表单有两个键值对,key1/key2及value1/value2。
  • 那么编码后存在于请求体中样子是这样的(它会用一条虚线隔开每个数据和数据以外的部分):
----------------------------p
Content-Disposition: form-data; name="key1"

value1
----------------------------p
Content-Disposition: form-data; name="key2"

value2
----------------------------p
第三种情况:
Content-Type:application/json
  • JSON 格式支持比键值对复杂得多的结构化数据,大多数浏览器都原生支持 JSON.stringify()将json对象转换成可以封装进请求体的字符串;
  • 前台ajax 使用案例:
$.ajax({
	method:"post",
	contentType:"application/json;charset=utf-8",
	dataType:"json",
	url:"/ServletProject/MyServlet",
	data:JSON.stringify({"key1":"value1","key2":"value2"}),
	//不用JSON.stringify()函数的data写法
	//data:"{\"key1\":\"value1\",\"key2\":\"value2\"}", 
	success:function(data){
		...
	}
});
  • 在无误的情况下,用json类型提交的数据将按照如下键值对格式放进request的请求体中;
{
	"key1":"value1",
	"key2":"value2"
}
  • 怎么取出来?如果单纯将一个json数据硬放进了request的话,request没有什么提取方法可以直接取出来;下面给出一种利用输入输出流硬取的参考方法。
int contentLength = request.getContentLength();
   	 byte buffer[] = new byte[contentLength];
   	 for (int i = 0; i < contentLength;) {
   		 int readlen = request.getInputStream().read(buffer, i,contentLength - i);
               if (readlen == -1) {
                   break;
               }
            i += readlen;
        }
   	 String getJson = new String(buffer);
   	 System.out.println(getJson);
打印台结果:
{"key1":"value1","key2":"value2"}
 - 在拿到 {"key1":"value1","key2":"value2"}结果后,
 - 可以导入并使用各中json处理jar包,如Json-lib等来将上面的格式转换成beans或者String类。
 - 或者直接用String类的分割方法硬拿value和key.
  • 用x-www-form-urlencoded辅助存取json数据格式:
  • ajax案例
$.ajax({
	method:"post",
	contentType:"application/x-www-form-urlencoded",
	dataType:"json",
	url:"/ServletProject/MyServlet",
	data:"data1={\"pwd\":\"222\",\"AAA\":\"111\"}&data2=5",
	success:function(data){
		...
	}
});
  • 后台要用request.getParameter(‘key’)来获取json格式的value值,然后利用工具进行转换beans。
String data = request.getParameter("data1");
JSONObject j1 = JSONObject.fromObject(data);
System.out.println("JSONObject:"+j1);
//打印台:
//{"pwd":"222","AAA":"111"}
  • 补充注意事项
  • 1 :之所以要用JSON.stringify()是因为js对象和json格式字符串还是有区别的;一是封装进去的必须是字符串而不是一个对象,其次是js对象的key可能不是字符串;所以要用stringify()确保无误;
  • 2:如果你在$.ajax({}) 里设置了contentTypeapplication/json;但是你又把data部分的json数据格式给写歪了;比如有误又没有用stringify()处理,这样虽然你写的是{”a“ : “A”},但它还是会以application/x-www-form-urlencoded 给你进行编码,把数据格式编码成 a=A&b=B的格式传到后台。
  • 3:str 为{ “a” : 5 },传入前端然后为什么要用var json = eval("(" + str + “)”)处理一下?
    因为后台没有设置contentType为json, 需要处理一下也就是用eval转换一下,至于为什么加“( “ 和 ” )”,是为了避免当成一个函数这样没啥意义。
虽然框架非常好用能直接拿到各种request里数据,但我感觉知道更基础一点知识总会踏实一点;以上内容为个人的观点总结,有误的话可以指出来。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值