在spring mvc中如何擷取請求要素呢?
通過如下方法:

/**
* compatible with get and post
*
* @param request
* @return : <code>string</code>
* @throws ioexception
*/
public static string getrequestquerystr(httpservletrequest request,
string charencoding) throws ioexception {
string submitmehtod = request.getmethod();
if (submitmehtod.equalsignorecase("post")) {
byte[] bytes = getrequestpostbytes(request);
string charencoding2 = request.getcharacterencoding();// charset
system.out.println("[getrequestquerystr]charencoding:"
+ charencoding2);
system.out.println("[getrequestquerystr]content-type:"
+ request.getheader(constant2.request_header_content_type));
if(valuewidget.isnullorempty(charencoding)){
charencoding=systemhwutil.charset_utf;
}
return new string(bytes, charencoding);
} else {// form method :get
return request.getquerystring();
}
}
對get請求的參數是沒有問題的,但是對于post請求擷取不到為什麼呢?
因為spring mvc已經擷取了一遍request的stream,是以再次擷取時是為空的,(這是輸入流的特性,可以查查官網api),是以我擷取到request 的inputstream之後調用reset,但是報錯,不支援reset操作.
怎麼辦呢?
在spring mvc 的控制器中使用@requestbody 注解,作用是擷取請求體,格式是位元組數組,見代碼

@responsebody
@requestmapping(value = "/jsonstub", produces = systemhwutil.response_contenttype_json_utf)
public string json(model model, httpsession session,@requestbody byte[]bytes,
httpservletrequest request, string callback) throws ioexception {
map map=webservletutil.parserequest(request, null);
if(valuewidget.isnullorempty(map)){
string poststr=new string(bytes,systemhwutil.curr_encoding);//username=huangwei&password=123
system.out.println("poststr:"+poststr);//username=%e9%bb%84%e5%a8%81&password=123
poststr=urldecoder.decode(poststr,systemhwutil.curr_encoding);//{"username":"黃威","password":"123"}
map=webservletutil.parserequeststr(poststr, true);
string content = hwutils.getjsonp(map, callback);
return content;
@requestbody後緊跟的參數将被注入請求體的位元組數組(spring mvc幫我們完成的).
注意:request.getinputstream() 讀取一次之後,再次讀取就讀取不到
上述代碼依賴的方法:

/***
* get request query string, form method : post
* @return byte[]
public static byte[] getrequestpostbytes(httpservletrequest request)
throws ioexception {
int contentlength = request.getcontentlength();
/*當無請求參數時,request.getcontentlength()傳回-1 */
if(contentlength<0){
return null;
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;
return buffer;
/***
* @return
public static string getrequestpoststr(httpservletrequest request)
byte buffer[] = getrequestpostbytes(request);
string charencoding = request.getcharacterencoding();
if (charencoding == null) {
charencoding = "utf-8";
return new string(buffer, charencoding);
參考:http://json20080301.iteye.com/blog/1874074?utm_source=tuicool