請求參數的綁定和獲取:
獲取頁面請求的參數,是javaweb必不可少的一個環節,在struts中,是通過再Action中定義屬性,或者Model的方式進行數據綁定和獲取。需要提供setter或getter方法,略顯麻煩。而在SpringMvc中,卻可以非常方便的獲取請求參數,只需要在對應方法的參數列表中定義出來,即可獲取,所見即所得!
1.獲取Servlet內置對象(不推薦使用這個方法)
需求:客戶端發送一個請求,返回到JSP視圖中,顯示servlet內置對象和session
@RequestMapping("test7") public String test7(HttpServletRequest req,HttpServletResponse resp,HttpSession session){ req.setAttribute("msg1", "jack"+req); req.setAttribute("msg2", "jack"+resp); session.setAttribute("msg3", "pick"+session); return "servlet"; }
視圖(servlet.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> ${requestScope.msg1 }...${requestScope.msg2 }...${sessionScope.msg3 } </body> </html>
2.獲取PathVariable參數
需求:使用占位符,獲取參數
@RequestMapping("test8/{age}/{name}") public ModelAndView test8(@PathVariable("age") String age,@PathVariable("name") String name){ ModelAndView mv = new ModelAndView("hello"); mv.addObject("msg", age+"---"+name); return mv; }
注意:參數類型必須匹配,否則會出錯
3.獲取請求參數並封裝為pojo對象
需求:提交表單,把表單里面的數據封裝為對象
定義Controller,只需要在參數中寫上要封裝的對象即可:
@RequestMapping(value="testjson") @ResponseStatus(HttpStatus.OK) public void acceptJson(User user){ System.out.println(user); }
4.@RequestParam的更多用法
沒有傳遞參數的情況下,不會報錯
@RequestMapping("/show5") public ModelAndView show5(@RequestParam(value="name",required=false,defaultValue="123")){ ModelAndView mv=new ModelAndView("hello"); mv.addObject("msg","接收普通參數:name "+name); return mv; }
5.獲取cookie的值
SpringMVC中依然是通過注解加參數注入的方式:
6.接受對象List集合
需求:表單提交多個用戶,springmvc怎樣接受?
<body> <form action="/test/show6.do" method="post"> 用戶1:<input type="text" name="users[0].name"/><br/> 用戶2:<input type="text" name="users[1].name"/><br/> 用戶3:<input type="text" name="users[2].name"/><br/> </form> </body>
對於以上,表單中相當於提交3個用戶,也就是用戶的集合,SpringMvc中的Controller,不能直接接受一個User的List集合
創建pojo 的userForm類里面提供一個用戶對象的集合,提供get set toString 方法,接受參數的方式接受
必須在UserForm中定義一個List<User>的屬性:
public class userForm{ private List<user> users; //提供get set方法 ... }
7.接受JSON格式請求
@ResponseBody 是把返回值的Pojo對象變為JSON字符串,稱為序列化
@RequestBody 是把接收到的JSON字符串變為Pojo對象,稱為反序列化
需求:客戶端傳來一個JSON格式數據,轉換為pojo對象@RequestBody()
@RequestMapping(value="testjson") @ResponseStatus(HttpStatus.OK) public void acceptJson(@RequestBody() User user){ System.out.println("id"+user.getId()); System.out.println("name"+user.getName()); System.out.println("age"+user.getAge()); }
需求:客戶端傳來一個JSON格式的數組,轉換為pojo對象@RequestBody()
@RequestMapping(value="testjsons") @ResponseStatus(HttpStatus.OK) public void acceptJsons(@RequestBody() List<User> users){ for (User user1 : users) { System.out.println("id:"+user1.getId()); System.out.println("name:"+user1.getName()); System.out.println("age:"+user1.getAge()); } }
8.SpringMvc和Struts的區別
1.SpringMvc的入口是Servlet,Struts2的入口是Filter,兩者的實現機制不同;
2.SpringMvc基於方法設計,傳遞參數是通過方法形參,其實現是單例模式(可以改為多例,推薦用單例),struts2基於類設計,傳遞參數是通過類的屬性,只能是多例,性能上SpringMvc更高一些
3.參數傳遞方面,Struts2是用類的屬性接受的,也就是在多個方法見共享,而SpringMvc基於方法,多個方法間不能共享