post 請(qǐng)求獲取body內(nèi)容
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
public class HttpServletRequestReader
{
// 字符串讀取
// 方法一
public static String ReadAsChars(HttpServletRequest request)
{
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try
{
br = request.getReader();
String str;
while ((str = br.readLine()) != null)
{
sb.append(str);
}
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (null != br)
{
try
{
br.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return sb.toString();
}
// 方法二
public static void ReadAsChars2(HttpServletRequest request)
{
InputStream is = null;
try
{
is = request.getInputStream();
StringBuilder sb = new StringBuilder();
byte[] b = new byte[4096];
for (int n; (n = is.read(b)) != -1;)
{
sb.append(new String(b, 0, n));
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (null != is)
{
try
{
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
// 二進(jìn)制讀取
public static byte[] readAsBytes(HttpServletRequest request)
{
int len = request.getContentLength();
byte[] buffer = new byte[len];
ServletInputStream in = null;
try
{
in = request.getInputStream();
in.read(buffer, 0, len);
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (null != in)
{
try
{
in.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return buffer;
}
}
注意:HttpServletRequest 請(qǐng)求中的 body 內(nèi)容僅能調(diào)用 request.getInputStream()矮湘, request.getReader()和request.getParameter("key") 方法讀取一次,重復(fù)讀取會(huì)報(bào) java.io.IOException: Stream closed 異常褐荷。
1.get請(qǐng)求獲取全部參數(shù)
@RequestMapping("/getRequest")
public String getReq(HttpServletRequest request) {
Map<String,Object> map = new HashMap<String,Object>();
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length >0) {
String paramValue = paramValues[0];
if (paramValue.length() != 0) {
map.put(paramName, paramValue);
}
}
}
Set<Map.Entry<String, Object>> set = map.entrySet();
logger.debug("==============================================================");
for (Map.Entry entry : set) {
logger.debug(entry.getKey() + ":" + entry.getValue());
}
logger.debug("=============================================================");
return JSONObject.toJSONString(map);
}
2脚曾、可選參數(shù)
spring mvc中@requesMapping的可配置參數(shù)和標(biāo)注的處理方法的可選參數(shù)
@RequestMapping的可選參數(shù)
value:表示需要匹配的url的格式镣煮。
method:表示所需處理請(qǐng)求的http 協(xié)議(如get,post,put,delete等)安券,可選值為RequestMethod這個(gè)enum的值。
params:格式為”paramname=paramvalue” 或 “paramname!=paramvalue”昧绣。不帶參數(shù)則表示paramvalue可以為任意值规肴。
如params = {"param1=1","param2!=2","param3"},表示對(duì)應(yīng)的url必須包括param1,param2,param3三個(gè)參數(shù),其中param1的值必須為1,param2的值不能為2奏纪,param3的值可以為任意值鉴嗤。
headers:用來(lái)限定對(duì)應(yīng)的reqeust請(qǐng)求的headers中必須包括的內(nèi)容,例如
headers={"Connection=keep-alive"}, 表示請(qǐng)求頭中的connection的值必須為keep-alive序调。
使用@requesMapping標(biāo)注的處理函數(shù)包括的可選參數(shù)醉锅,除了HttpServletRequest, HttpServletResponse, HttpSession這些web應(yīng)用中常見(jiàn)的參數(shù)及之前提到過(guò)的@PathVariable外,還可以包括以下可選的參數(shù)发绢,其中大部分參數(shù)的順序沒(méi)有特殊要求的硬耍。
java.util.Locale
當(dāng)前請(qǐng)求所屬的區(qū)域設(shè)置。
java.io.InputStream或java.io.Reader
用來(lái)讀取request content边酒,相當(dāng)于 request.getInputStream()或request.getReader();
java.io.OutputStream或java.io.Writer
用來(lái)生成reponse content经柴,相當(dāng)于response.getOutputStream()或response.getWriter()。
java.security.Principal
當(dāng)前認(rèn)證了的用戶
WebRequest或NativeWebRequest
Spring 對(duì)request,response,session等web元素封裝后的對(duì)象HttpServletRequest/response/HttpSession等原始的web對(duì)象
java.util.Map 或 org.springframework.ui.Model或org.springframework.ui.ModelMap
用來(lái)存放domain model的map結(jié)構(gòu)墩朦。
HttpEntity<?>
可用來(lái)讀取http請(qǐng)求的header和 body內(nèi)容坯认,注意因?yàn)閔ttpentity,@RequestBody,Reader這三種類型的參數(shù)都是通過(guò)inputstram來(lái)讀取httpbody的數(shù)據(jù)的氓涣,而inputstream流不能反復(fù)讀取牛哺,因此這三種類型的參數(shù)不能放在一起使用。而且在沒(méi)有設(shè)置content-type或沒(méi)有設(shè)置相應(yīng)的messageconverter的情況下劳吠,都會(huì)報(bào)錯(cuò)引润。
Command 或 form objects
通過(guò)spring 的databinding機(jī)制將request請(qǐng)求中的參數(shù)自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的java bean實(shí)例。
Errors或BindingResult
對(duì)command或form objects值的校驗(yàn)結(jié)果痒玩。此參數(shù)必須緊跟在需校驗(yàn)的command或form object參數(shù)后面淳附。因?yàn)閐atabinding可以允許將輸入?yún)?shù)和多個(gè)java bean 進(jìn)行綁定(也就是說(shuō)我們可以把輸入request param轉(zhuǎn)換成為多個(gè)java 對(duì)象)。
SessionStatus
Session的狀態(tài)蠢古。當(dāng)使用@SessionAttributes來(lái)標(biāo)注請(qǐng)求需要session中對(duì)應(yīng)的值時(shí),在處理結(jié)束時(shí)奴曙,使用SessionStatus. setComplete()來(lái)將session設(shè)置為時(shí)效。
@RequestParam
將request參數(shù)和handler method參數(shù)做綁定草讶。例如
@RequestParam(value="username",defaultValue="winzip",required=false) String name
#表示將request中的username參數(shù)和handler method中的name參數(shù)綁定洽糟,缺省值為”winzip”,request請(qǐng)求中可以不傳遞此參數(shù)
@RequestHeader
將handler method中的參數(shù)與request header中的值綁定,例如
@RequestHeader(required=false,value="User-Agent") String ua
#表示將header中的"User-Agent"與ua這個(gè)入?yún)⒔壎ā?
@RequestBody
將handler method中的參數(shù)與request context body中的值綁定
例如
@RequestBody String u
表示將request body中的內(nèi)容與u這個(gè)入?yún)⒔壎ā?/p>
@CookieValue
將handler method中的參數(shù)與cookie中的值綁定
例如
@CookieValue(value="JSESSIONID",required=false) String jssionid
@ModelAttribute
將handler method中的參數(shù)與對(duì)應(yīng)的類型綁定到涂,名稱缺省為類名(首字母小寫(xiě)),如果ModelAttribute指定了值則以該值作為model attribute name颁督。
例如
@ModelAttribute("ooxx") User u
#則在modelmap中創(chuàng)建了一個(gè)鍵值為ooxx的model attribute践啄。
@ModelAttribute User u 或 User u
#在modelmap中創(chuàng)建了一個(gè)鍵值為user的model attribute
實(shí)例
/**
* 接收普通請(qǐng)求參數(shù)
* http://localhost:8080/hello/show18?name=998 顯示為998
* http://localhost:8080/hello/show18?name 顯示為hello
* @return
*/
@RequestMapping("show18")
public ModelAndView test18(@RequestParam(value="name",required=true,defaultValue="hello")String name){
ModelAndView mv = new ModelAndView();
mv.setViewName("hello2");
mv.addObject("msg", "接收普通請(qǐng)求參數(shù):" + name);
return mv;
}
1、直接把表單的參數(shù)寫(xiě)在Controller相應(yīng)的方法的形參中沉御,適用于get方式提交屿讽,不適用于post方式提交。
/**
* 1.直接把表單的參數(shù)寫(xiě)在Controller相應(yīng)的方法的形參中
* @param username
* @param password
* @return
*/
@RequestMapping("/addUser1")
public String addUser1(String username,String password) {
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
url形式:http://localhost/SSMDemo/demo/addUser1?username=lixiaoxi&password=111111 提交的參數(shù)需要和Controller方法中的入?yún)⒚Q一致。
2伐谈、通過(guò)HttpServletRequest接收烂完,post方式和get方式都可以。
/**
* 2诵棵、通過(guò)HttpServletRequest接收
* @param request
* @return
*/
@RequestMapping("/addUser2")
public String addUser2(HttpServletRequest request) {
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
3抠蚣、通過(guò)一個(gè)bean來(lái)接收,post方式和get方式都可以。
(1)建立一個(gè)和表單中參數(shù)對(duì)應(yīng)的bean
package demo.model;
public class UserModel {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(2)用這個(gè)bean來(lái)封裝接收的參數(shù)
/**
* 3履澳、通過(guò)一個(gè)bean來(lái)接收
* @param user
* @return
*/
@RequestMapping("/addUser3")
public String addUser3(UserModel user) {
System.out.println("username is:"+user.getUsername());
System.out.println("password is:"+user.getPassword());
return "demo/index";
}
4嘶窄、通過(guò)@PathVariable獲取路徑中的參數(shù)
/**
* 4、通過(guò)@PathVariable獲取路徑中的參數(shù)
* @param username
* @param password
* @return
*/
@RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET)
public String addUser4(@PathVariable String username,@PathVariable String password) {
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}
例如距贷,訪問(wèn)http://localhost/SSMDemo/demo/addUser4/lixiaoxi/111111 路徑時(shí)柄冲,則自動(dòng)將URL中模板變量{username}和{password}綁定到通過(guò)@PathVariable注解的同名參數(shù)上,即入?yún)⒑髐sername=lixiaoxi忠蝗、password=111111现横。
5、使用@ModelAttribute注解獲取POST請(qǐng)求的FORM表單數(shù)據(jù)
Jsp表單如下:
<form action ="<%=request.getContextPath()%>/demo/addUser5" method="post">
用戶名: <input type="text" name="username"/><br/>
密 碼: <input type="password" name="password"/><br/>
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
Java Controller如下:
/**
* 5阁最、使用@ModelAttribute注解獲取POST請(qǐng)求的FORM表單數(shù)據(jù)
* @param user
* @return
*/
@RequestMapping(value="/addUser5",method=RequestMethod.POST)
public String addUser5(@ModelAttribute("user") UserModel user) {
System.out.println("username is:"+user.getUsername());
System.out.println("password is:"+user.getPassword());
return "demo/index";
}
6戒祠、用注解@RequestParam綁定請(qǐng)求參數(shù)到方法入?yún)?/p>
當(dāng)請(qǐng)求參數(shù)username不存在時(shí)會(huì)有異常發(fā)生,可以通過(guò)設(shè)置屬性required=false解決,例如: @RequestParam(value="username", required=false)
/**
* 6、用注解@RequestParam綁定請(qǐng)求參數(shù)到方法入?yún)? * @param username
* @param password
* @return
*/
@RequestMapping(value="/addUser6",method=RequestMethod.GET)
public String addUser6(@RequestParam("username") String username,@RequestParam("password") String password) {
System.out.println("username is:"+username);
System.out.println("password is:"+password);
return "demo/index";
}