一: 發送 DELETE 或者 PUT 請求:html
一、在表單中加入一個隱藏的參數: _method , 值是 DELETE (或者PUT)java
<form action="springmvc/testRest/a1we2!3#d" method="post"> <input type="hidden" name="_method" value="DELETE"></input> <input type="submit" value="test Rest delete"></input> </form>
二、 發送的POST 請求, 配置一個 HiddenHttpMethodFilter 過濾器:web
<filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
該過濾器會把 獲取 String paramValue = request.getParameter("_method"); spring
paramValue 值是 DELETE , 而後把該POST 的 HTTP請求的 改爲 DELETE 請求。數據庫
三、在Controller 中匹配,獲取上面的 DETELE 請求api
@RequestMapping(value="/testRest/{ss}", method=RequestMethod.DELETE) public String testRestDelete(@PathVariable("ss") String sid) { System.out.println("test DELETE: " + sid); return SUCCESS; }
輸出: test DELETE: a1we2!3cookie
點了 test Rest delete 這個按鈕後,請求的url 是 http://localhost:8080/springmvc-1/springmvc/testRest/a1we2!3#d , 在springmvc 中經過 PathVariable 註解獲取 REST風格的URL 中的參數,獲取的時候 ss 值是 a1we2!3 , 保存到 sid 中。 (把 # 後面的內容去掉了)session
二:在 前臺頁面中寫的連接:mvc
<a href="springmvc/tsetParameters?username=zhou&age=11">tsetParameters</a></br>
RequestMapping 註解中可使用 params 匹配請求中的參數, 用headers 匹配http請求中頭域
controller 方法中:
@RequestMapping(value="tsetParameters", params={"username", "age!=10"},headers={"Accept-Language=zh-CN,zh;q=0.9" , "User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"}) public String testParameters() { System.out.println("testParameters"); return SUCCESS; }
當 前臺發送的請求 是: http://localhost:8080/springmvc-1/springmvc/tsetParameters?username=zhou&age=11 而且http 請求中帶有:app
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept-Language: zh-CN,zh;q=0.9
這兩個頭域的時候, 纔會執行 testParameters 方法。
即執行 testParameters 方法須要同時知足如下的條件:
一、請求url tsetParameters 中必須含有 username 參數,必須含有 age 參數 而且 值不能是 10.
二、請求header 中 必須有 Accept-Language 和 User-Agent 。 而且值是 RequestMapping 中寫的。
不然就會報404 錯誤。
四: @RequestMapping 能夠映射參數:
value 值即請求參數的參數名
required 該參數是不是必須,默認是true 。
defaultValue 請求參數的默認值
好比請求url: http://localhost:8080/springmvc-1/springmvc/testRequestParam?username=zhou
controller 方法:
@RequestMapping(value="/testRequestParam") public String testRequestParam(@RequestParam(value="username") String name, @RequestParam(value="age",required=false, defaultValue="0") int age){ System.out.println("name:" + name + "======" + "age:" + age); return SUCCESS; }
輸出: name:zhou======age:0
RequestHeader 註解能夠獲取 http 請求的頭域:
@RequestMapping("/testHeader") public String testRequestHeader(@RequestHeader("User-Agent") String ua) { System.out.println(ua); return SUCCESS; }
CookieValue 能夠獲取cookie 值
@RequestMapping("/testCookie") public String testCookieVal(@CookieValue("JSESSIONID") String cook) { System.out.println(cook); return SUCCESS; }
Servlet 原生API 做爲目標方法的參數支持如下類型:
HttpServletRequest、HttpServletResponse、HttpSession、java.security.Principal、Local InputStream、 OutputStream、 Reader、Writer 。
@RequestMapping("/testServletAPI") public void testServletAPI(HttpServletRequest req, HttpServletResponse rep,Writer writer) throws IOException { System.out.println("HttpServletRequest:" + req + "--------" + rep); writer.write("this is servlet api"); }
前臺頁面上顯示: this is servlet api
五:
springmvc 能夠返回目標方法中的map對象:
Controller 方法:
@RequestMapping("/testMap") public String testMap(Map<String, Object> map) { map.put("names", Arrays.asList("tim","jack","mike")); return SUCCESS; }
在返回的頁面 success.jsp 中 能夠接收 names 對象:
<body>
${requestScope.names}
${names}
</body>
頁面顯示:
[tim, jack, mike] [tim, jack, mike]
Controller 層也能夠返回 ModelAndView 對象:
@RequestMapping("/testModelView") public ModelAndView testModel() { String viewName = SUCCESS; ModelAndView modelview = new ModelAndView(viewName); modelview.addObject("time",new Date()); return modelview; }
success.jsp 經過 ${names} 或者 ${requestScope.names} 接收,在頁面上顯示時間。
六:
@sessionAttributes 能夠經過屬性名指定放到會話中的屬性(value屬性值), 也能夠經過模型屬性的對象類型指定哪些模型屬性須要放到會話中(types屬性值)。
Controller 方法:
@RequestMapping("/testSessionAttr") public String testSessionAttr(Map<String, Object> map) { User user = new User("tom","123","tomc@guigu.com", 20); map.put("userone", user); map.put("school", "qinghua"); User user2 = new User("mike","365","mm@guigu.com", 30); map.put("usertwo2", user2.getAge());
return SUCCESS; }
須要在Controller 類上加上註解: @SessionAttributes(value={"userone"}, types={String.class})
user: ${userone} </br> 在前臺界面上取的值是: User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null]
request user: ${requestScope.userone} </br> User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null]
sessionScope user: ${sessionScope.userone}</br> User [username=tom, password=123, email=tomc@guigu.com, age=20, address=null]
school: ${school}</br> qinghua
requestScope school: ${requestScope.school}</br> qinghua
sessoin school: ${sessionScope.school}</br> qinghua
usertwo: ${usertwo2}</br> 30
requestScope usertwo: ${requestScope.usertwo2}</br> 30
sessionScope usertwo: ${sessionScope.usertwo2}</br> 空
只有把 String 類型的值放到 session 中時, sessionScope 中才會取到。
七:
在前臺頁面向Controller傳遞bean 的屬性時,若是bean 對象沒有空的構造函數,而且前臺頁面傳的屬性和bean 的構造函數參數不匹配時,就會報錯,沒有空的構造函數:
嚴重: Servlet.service() for servlet [springmvc] in context with path [/springmvc-1] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zhou.entity.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.zhou.entity.User.<init>()] with root cause
java.lang.NoSuchMethodException: com.zhou.entity.User.<init>()
at java.lang.Class.getConstructor0(Class.java:2849)
at java.lang.Class.getDeclaredConstructor(Class.java:2053)
須要加上一個空的構造函數。
一、在方法定義上使用 @ModelAttribute 註解:SpringMVC 在調用Controller 目標處理方法前,會先逐個調用在方法級上標註了 @ModelAttribute 的方法。
二、在方法的入參前使用 @ModelAttribute 註解 ,能夠從隱含對象中獲取隱含的模型數據中獲取對象,再將請求參數綁定到對象中,再傳入入參,將方法入參對象添加到模型中
前臺頁面傳入 username、email、 age:
<form action="springmvc/testModeAttr"> <input type="hidden" name="id" value="1"> username: <input type="text" name="username" value="Tom"><br/> email: <input type="text" name="email" value="tomca@126.com"><br/> age: <input type="text" name="age" value="26"><br/> <input type="submit" value="提交"><br/> </form>
Controller 中的方法:
@RequestMapping("/testModeAttr") public String testModeAttr(User user,Map<String, Object> map) { System.out.println("modify:" + user); map.put("user", user); return SUCCESS; } @ModelAttribute public void getUser(@RequestParam(value="id", required=false) Integer id,Map<String, Object> map) { if(id!= null){ User user = new User(1,"Tome", "12345","tom@guigu.com", 12); System.out.println("從數據庫中獲取的對象:" + user); map.put("user", user); } }
一、先執行 @ModelAttribute 註解的 getUser 方法, 輸出: 從數據庫中獲取的對象:User [id=1, username=Tome, password=12345, email=tom@guigu.com, age=12]
把 user 存入 key是 user 的對象中。
二、 SpringMVC 把 從Map 中取出的 User 對象,並把表單的請求參數 賦給該 User 對象的對應屬性。 (這一步是SpringMVC 完成的) (在@ModelAttribute 修飾的方法中,放入到Map 時的鍵須要和目標方法入參類型的第一個字母小寫的字符一致,)
若是在 @ModelAttribute 修飾的方法中,map存入的對象 和 目標方法的參數類名的第一個字母小寫的字符不一致,能夠在目標方法中用 @ModelAttribute 修改該參數。 好比:
@RequestMapping("/testModeAttr") public String testModeAttr(@ModelAttribute("usera") User user,Map<String, Object> map) { System.out.println("modify:" + user); map.put("user", user); return SUCCESS; } @ModelAttribute public void getUser(@RequestParam(value="id", required=false) Integer id,Map<String, Object> map) { if(id!= null){ User user = new User(1,"Tome", "12345","tom@guigu.com", 12); System.out.println("從數據庫中獲取的對象:" + user); map.put("usera", user); } }
則在 目標方法 testModeAttr 中的參數 user 也就是 map 中存入的 key 是 usera 的對象。
三、 再執行 目標方法 testModeAttr , 把上面的user 對象傳入 該目標方法。