Spring MVC 系列(三)——Spring MVC 參數傳遞與表單交互



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所特有的方式。

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")  
  2.        public String toPerson(HttpServletRequest request){  
  3.        String result = request.getParameter("name");  
  4.        System.out.println(result);  
  5.        return "index";  
  6.       }  
String  studentName=request.getParameter("name");

測試時,瀏覽器通過訪問 URL:http://localhost:8091/springMVC/getName.do?Name=max1209 傳入name=max1209參數。   

2、直接定義參數名

控制器接收界面參數,還可直接指定參數名稱

1)單個參數

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")   
  2.   
  3.  public String getName(String name){   
  4.   
  5.         System.out.println(name);  
  6.   
  7.        return "/index";   
  8.   
  9.  }  
       測試時,瀏覽器通過訪問 URL:http://localhost:8091/springMVC/getName.do?name=max1209 傳入name=max1209參數。   
      2)多個參數
[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")   
  2.   
  3.  public String getName(String name, Integer age, String address, Date birthday){   
  4.   
  5.        System.out.println(name + " "+ age + " "+ address + " " +birthday);  
  6.   
  7.        return "/index";   
  8.   
  9.  }  

測試時,瀏覽器通過訪問 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等參數值。

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")  
  2. public String getName(Person person){  
  3.     System.out.println(person);  
  4.     return "index";  
  5. }  

測試時,瀏覽器通過訪問 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中就需要使用數組接收參數。

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")  
  2. public String getName(String[] name){  
  3.     for(String result : name){  
  4.         System.out.println(result);  
  5.     }  
  6.     return "index";  
  7. }  

測試時,瀏覽器通過訪問 URL:http://localhost:8091/springMVC/getName.do?name=max1209&name=li&name=zzz傳入數組形式參數。                
二、Controller如何把業務數據返回View顯示

1、通過ModelAndView 返回

將數據封裝成一個實體,通過ModelAndView返回界面。實際就是把person對象放到map ,通過ModelAndView 封裝到responce對象中去了,所以前臺直接通過map key值,獲取屬性即可。

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")  
  2. public ModelAndView getName() throws Exception{  
  3.     Person person = new Person();  
  4.     person.setName("james");  
  5.     person.setAge(28);  
  6.     person.setAddress("maami");  
  7.     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  8.     Date date = format.parse("1985-04-22");  
  9.     person.setBirthday(date);  
  10.     Map<String, Object> map = new HashMap<String, Object>();  
  11.     map.put("p", person);  
  12.     return new ModelAndView("index", map);  
  13. }  

2、通過Map

在方法中加入map參數,ModelAndView視圖管理器會自動把這個map參數裝配到request中,方法通過返回String照樣可以把person實體返回界面。

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")  
  2. public String getName(Map<String, Object> map) throws Exception{  
  3.     Person person = new Person();  
  4.     person.setName("james");  
  5.     person.setAge(28);  
  6.     person.setAddress("maami");  
  7.     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  8.     Date date = format.parse("1985-04-22");  
  9.     person.setBirthday(date);  
  10.     map.put("p", person);  
  11.     return "index";  
  12. }  

3、直接使用Model對象

最常用也最方便的就是直接通過Model對象返回

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. @RequestMapping("/getName.do")  
  2. public String getName(Model model) throws Exception{  
  3.     Person person = new Person();  
  4.     person.setName("james");  
  5.     person.setAge(28);  
  6.     person.setAddress("maami");  
  7.     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
  8.     Date date = format.parse("1985-04-22");  
  9.     person.setBirthday(date);  
  10.     //把參數值放到request類裏面去  
  11.     model.addAttribute("p", person);  
  12.     return "index";  
  13. }  

這三種方式均可由前臺通過JSTL+EL表達式獲取addAttribute中key-value獲取person實體數據

[java] view plain copy 在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Comic Sans MS;"> <body>  
  2.         <h1>${p.name}</h1>  
  3.         <h1>${p.age}</h1>  
  4.         <h1>${p.sex}}</h1>  
  5.         <h1>${p.address}</h1>  
  6.     </body></span>  

文章轉載自:Spring MVC 系列(三)——Spring MVC 參數傳遞與表單交互



發佈了82 篇原創文章 · 獲贊 100 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章