MVC模式的特點就在於將頁面、業務邏輯、實體分層管理,那三層之間如何進行數據傳輸,Spring MVC與其他web 框架相比,有何獨到之處。
在MVC框架模式中,大部分的參數傳遞都是通過發送request請求到controller控制器,Controller中調用後臺Service業務,獲取數據,回顯View 界面。所以主要的參數傳遞是在Controller和View之間進行的。下面就來介紹Controller和View之間數據的發送和接收方式。
一、Controller接收View參數
1、通過HttpServletRequest
通過HttpServletRequest 進行頁面與控制器間參數傳遞是典型的Servlet參數傳遞方式,像使用Servlet作爲Web開發中控制器的角色,通過實現servlet接口,重寫doGet\doPost方法,兩必不可少的參數便是HttpServletRequest 和HttpServletResponce。所以使用HttpServletRequest接受request請求參數,並非Spring MVC所特有的方式。
- @RequestMapping("/getName.do")
- public String toPerson(HttpServletRequest request){
- String result = request.getParameter("name");
- System.out.println(result);
- return "index";
- }
測試時,瀏覽器通過訪問 URL:http://localhost:8091/springMVC/getName.do?Name=max1209 傳入name=max1209參數。
2、直接定義參數名
控制器接收界面參數,還可直接指定參數名稱
1)單個參數
- @RequestMapping("/getName.do")
- public String getName(String name){
- System.out.println(name);
- return "/index";
- }
2)多個參數
- @RequestMapping("/getName.do")
- public String getName(String name, Integer age, String address, Date birthday){
- System.out.println(name + " "+ age + " "+ address + " " +birthday);
- return "/index";
- }
測試時,瀏覽器通過訪問 URL:http://localhost:8091/springMVC/getName.do?name=max1209&age=30&address=London 傳入多個參數。
注意
1)要求前臺傳入的參數和controller方法中參數名必須相同,纔可成功獲取該參數值。
2)參數類型,如果前臺出入String類型,後臺方法參數爲Integer,傳入“123”數字字符串,SpringMVC可自動轉換成Integer,但傳入“jfjdk”字符串,就會參數類型轉換錯誤。
3)時間類型參數需要指定時間格式
3、通過實體整合
當界面參數過多時,以2中指定參數名的形式進行接收未免過於繁瑣。可以將參數整合成一個實體進行接收。例如:定義一個Person實體接受person的name、age、sex等參數值。
- @RequestMapping("/getName.do")
- public String getName(Person person){
- System.out.println(person);
- return "index";
- }
測試時,瀏覽器通過訪問 URL:http://localhost:8091/springMVC/getName.do?name=max1209&age=30&address=London 傳入多個參數。
使用實體接收參數需要注意:
1、URL傳遞的參數必須跟person實體的set方法後面的名完全一樣,纔可以接收到這個參數。因爲傳入的name 、age ,都作爲參數傳入實體中,需要通過set方法爲實體賦值。屬性才能被注入進Person實體中,ps.Spring MVC中參數與set方法首字母大小寫不敏感。
2、參數列表,如果有兩個實體,person 和user ,倆都有name 和age 屬性,不管哪個實體,只要傳入的參數名能和實體中的set方法匹配,就能改該實體賦值。也就是說,如果url就傳入name 、age參數,而person和User實體恰好也都有這兩個參數,那麼兩個實體都能注入name、age參數值
4、數組類型參數接收
這個適用於頁面例如有多個checkbox時,名字都一樣,傳入多個checkbox值,則Controller中就需要使用數組接收參數。
- @RequestMapping("/getName.do")
- public String getName(String[] name){
- for(String result : name){
- System.out.println(result);
- }
- return "index";
- }
測試時,瀏覽器通過訪問 URL:http://localhost:8091/springMVC/getName.do?name=max1209&name=li&name=zzz傳入數組形式參數。
二、Controller如何把業務數據返回View顯示
1、通過ModelAndView 返回
將數據封裝成一個實體,通過ModelAndView返回界面。實際就是把person對象放到map ,通過ModelAndView 封裝到responce對象中去了,所以前臺直接通過map key值,獲取屬性即可。
- @RequestMapping("/getName.do")
- public ModelAndView getName() throws Exception{
- Person person = new Person();
- person.setName("james");
- person.setAge(28);
- person.setAddress("maami");
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
- Date date = format.parse("1985-04-22");
- person.setBirthday(date);
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("p", person);
- return new ModelAndView("index", map);
- }
2、通過Map
在方法中加入map參數,ModelAndView視圖管理器會自動把這個map參數裝配到request中,方法通過返回String照樣可以把person實體返回界面。
- @RequestMapping("/getName.do")
- public String getName(Map<String, Object> map) throws Exception{
- Person person = new Person();
- person.setName("james");
- person.setAge(28);
- person.setAddress("maami");
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
- Date date = format.parse("1985-04-22");
- person.setBirthday(date);
- map.put("p", person);
- return "index";
- }
3、直接使用Model對象
最常用也最方便的就是直接通過Model對象返回
- @RequestMapping("/getName.do")
- public String getName(Model model) throws Exception{
- Person person = new Person();
- person.setName("james");
- person.setAge(28);
- person.setAddress("maami");
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
- Date date = format.parse("1985-04-22");
- person.setBirthday(date);
- //把參數值放到request類裏面去
- model.addAttribute("p", person);
- return "index";
- }
這三種方式均可由前臺通過JSTL+EL表達式獲取addAttribute中key-value獲取person實體數據
- <span style="font-family:Comic Sans MS;"> <body>
- <h1>${p.name}</h1>
- <h1>${p.age}</h1>
- <h1>${p.sex}}</h1>
- <h1>${p.address}</h1>
- </body></span>
文章轉載自:Spring MVC 系列(三)——Spring MVC 參數傳遞與表單交互