1.請求處理方法中可以出現以下幾種參數類型,直接在controller方法形參上定義默認類型的對象,就可以使用這些對象。可以通過下列對象來獲取前台傳來的參數:
①HttpServletRequest對象:通過request對象可以獲取參數信息
②HttpservletResponse對象:通過response對象可以處理響應信息
③HTTPSession對象:獲取session中存儲的對象
④Model/ModelMap:Model是一個接口,ModelMap是一個接口的實現。作用是將模型數據填充到request域
模型對象(ModelMap)的特定屬性具有Session范圍的作用域。 我們在②處添加了一個ModelMap屬性,其屬性名為currUser,
而①處通過@SessionAttributes注解將ModelMap中名為currUser的屬性放置到Session中,所以我們不但可以在login()請求所對應的JSP視圖
頁面中通過request.getAttribute("currUser")和session.getAttribute("currUser")獲取user對象,還可以在下一個請求所對應的JSP視圖頁面中
通過session.getAttribute("currUser")或者ModelMap.get("currUser")訪問到這個屬性。
@Controller @RequestMapping("/user") @SessionAttributes("currUser") //①將模型對象(ModelMap)中currUser屬性放到Session屬性列表中,以便這個屬性可以跨請求訪問 public class UserLoginController{ @RequestMapping(value="/login") public String login(@RequestParam("id") int id, User user, ModelMap model){ // ②往ModelMap中存放currUser屬性,該屬性將被轉存到Session屬性列表中 model.addAttribute("currUser", user); return "success"; } }
⑤使用IO對象作為入參 ,如 java.io.InputStream/java.io.Reader 及java.io.OutputStream/java.io.Writer
⑥使用其他類型的參數,java.util.Locale/java.security.Principal ,也可以通過Servlet的HttpServletRequest的getLocale()及getUserPrincipal()
⑦使用表單對象綁定請求參數值
非常簡單,只需將對象的屬性名和input的name值一一匹配即可。
User對象中有ContactInfo屬性,在表單代碼中,需要使用“屬性名(對象類型的屬性).屬性名”來命名input的name。
除此之外,對於基本數據類型和包裝數據類型,表單中input的name值和Controller的參數變量名保持一致,就能完成數據綁定,如果不一致可以使用@RequestParam注解。
需要注意的是,如果Controller方法參數中定義的是基本數據類型,但是從頁面提交過來的數據為null或者”"的話,會出現數據轉換的異常。
也就是必須保證表單傳遞過來的數據不能為null或”",所以,在開發過程中,對可能為空的數據,最好將參數數據類型定義成包裝類型。
@RequestMapping("saysth.do") public void test(User user) { System.out.println(user.getFirstName()); System.out.println(user.getLastName()); System.out.println(user.getContactInfo().getTel()); System.out.println(user.getContactInfo().getAddress()); }
<form action="saysth.do" method="post"> <input name="firstName" value="張" /><br> <input name="lastName" value="三" /><br> <input name="contactInfo.tel" value="13809908909" /><br> <input name="contactInfo.address" value="北京海淀" /><br> <input type="submit" value="Save" /> </form>
2.注解方式
①@RequestParam直接標注在方法的變量名上
參數有以下三個:
- value:參數名字,即入參的請求參數名字,如username表示請求的參數區中的名字為username的參數的值將傳入;
- required:是否必須,默認是true,表示請求中一定要有相應的參數,否則將報404錯誤碼;
- defaultValue:默認值,表示如果請求中沒有同名參數時的默認值,默認值可以是SpEL表達式,如“#{systemProperties['java.vm.version']}”。
②使用@CookieValue綁定請求中的Cookie值
@CookieValue的參數和@RequestParam一樣
③使用@RequestHeader綁定請求報文頭的屬性值
@RequestMapping(value="/method3") public String method3( @RequestHeader("Accept-Encoding") String encoding, @RequestHeader("Keep-Alive") long keepAlive){ return "methodSignature"; }
④使用@PathVariabl獲取路徑中傳遞參數
@RequestMapping(value="/users/{userId}/topics/{topicId}") public ModelAndView helloWorld( @PathVariable String userId, @PathVariable Long topicId) { System.out.println(id); System.out.println(str); return new ModelAndView( " /helloWorld " ); }
如請求的URL為“控制器URL/users/123/topics/456”,則自動將URL中模板變量{userId}和{topicId}綁定到通 過@PathVariable注解的同名參數上,即入參后userId=123、 topicId=456。代碼在 PathVariableTypeController中。