假设某个类型(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({}) 里设置了contentType 为application/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里数据,但我感觉知道更基础一点知识总会踏实一点;以上内容为个人的观点总结,有误的话可以指出来。