參數綁定的過程:就是頁面向后台傳遞參數,后台接受的一個過程。
默認支持的參數類型:(就是你在方法上以形參的形式去定義一下的類型,就可以直接使用它)
- HttpServletRequest
- HttpServletResponse
- HttpSession
- Model/ModelMap;前面這個是一個接口,后面試一個實現類。
作用:就是把數據放到request域。
1.支持簡單的數據類型綁定:(頁面的name屬性必須和你定義的參數名一致)
- Integer
- String
- ......
例:
1 public String test_user(int sid,String name){ 2 //int sid等價於 request.getparameter("sid"); 3 System.out.println(sid+"="+nam); 4 return "hello"; 5 }
如果想要名字不一樣,要使用:@RequestParam
1 //value:對應頁面的name屬性 2 //required:是否必須 3 //defaultValue:默認值 4 public String test_user(@RequestParam(value="sid",required=true) int sbid,@RequestParam(value="name")String sbname){ 5 System.out.println(sbid+"="+sbname); 6 return "hello"; 7 }
2.參數綁定之——實體類
有一個要求:實體類的屬性名必須和頁面的name值一樣。
實體的屬性:
頁面的name屬性:
當然,實體類的綁定和簡單數據類型的綁定不會相互影響,可以同時使用。
3.參數綁定之——包裝的實體類(pojo,entity)綁定
Items.java
1 package com.test.entity; 2 3 public class Items { 4 private Student student; 5 6 public Student getStudent() { 7 return student; 8 } 9 10 public void setStudent(Student student) { 11 this.student = student; 12 } 13 14 }
頁面寫法:
控制器寫法:
此時,我們會有這么一個疑問:明明可以直接用student,為什么要多一層的包裝?這就好比多褲子放屁多此一舉?答案當然不是,它這么做一定是有意思所在的。
下面我們來看一下案例:
案例1:
學生有: name
教師有: name
如果要求頁面同時向后台傳輸這兩個名字,那你后台到底怎么接受????
案例2:
做搜索的時候,多條件搜索(你能保證這些搜索條件都在一張表里面嗎?),根據班級名,學生姓名,學號,教師,教室。這個時候我們可以對其進行封裝,封裝一個QueryItems類,專門用於查詢。
4.參數綁定之——集合類型的綁定
- 數組類型的綁定:
應用:批量刪除
需求:首先出現一個頁面,里面有很多的數據,然后有一個批量刪除的按鈕,點擊的時候,把這些數據都刪了。
頁面:
1 <c:forEach items="${list}" var="stu"> 2 <tr> 3 <th><input type="checkbox" name="stu_id" value="${stu.sid }"> </th> 4 <th>${stu.sid }</th> 5 <th>${stu.name }</th> 6 <th>${stu.sex }</th> 7 <th>${stu.hobbies }</th> 8 </tr> 9 </c:forEach>
控制器:
1 @RequestMapping(value="deletemore") 2 public String deletemore(int [] stu_id){ 3 for (int i : stu_id) { 4 System.out.println(i); 5 } 6 return "studentlist"; 7 }
2.List類型的綁定:
應用:類似一些教務管理系統:成績的批量錄入,對於成績的批量修改。
需求:現在需要我完成一個系統,里面可以批量修改學生的信息。
思路:到一個頁面,里面有一堆的學生要我們編輯,編輯完成點擊提交,這些數據就會提交到我們的后台。
頁面:
注意其中划線的地方連空格都不可以多加。
控制器:
要利用我們的包裝類進行傳輸數據,不可以直接在方法上面聲明形參。
Items.java
1 package com.test.entity; 2 3 import java.util.List; 4 5 public class Items { 6 private Student student; 7 private List<Student>list;//這個是批量修改學生的包裝類 8 9 10 public List<Student> getList() { 11 return list; 12 } 13 14 public void setList(List<Student> list) { 15 this.list = list; 16 } 17 18 public Student getStudent() { 19 return student; 20 } 21 22 public void setStudent(Student student) { 23 this.student = student; 24 } 25 26 }
3.Map類型的綁定:類比上面的List,這里就不說了。
數據回顯
1. springmvc會有自動回顯的類型實體類(pojo)
實體類的數據會在頁面進入控制器后,springmvc會自動將自己的數據放到request作用域,並且他的key為該實體類的首字母小寫。Student student User user
有值的寫法:
不按照首字母小寫的情況:(證實取不到值)
2.簡單的類型不會自動回顯
簡單的類型就是:int,String,boolean……不會自動回顯,就用一下攜帶參數的手段進行數據回顯
3.常見的 攜帶參數的手段
ModelAndView(數據是放在request的作用域)
1 //常見的構造使用 2 //1.空的 3 ModelAndView mv = new ModelAndView(); 4 Map<String, Student>map=new HashMap<String, Student>(); 5 mv.addAllObjects(map); 6 mv.setViewName("hello"); 7 //2.new ModelAndView(viewName,數據); 8 ModelAndView mv1 = new ModelAndView("hello",map);
Model/ModelMap:可以在該方法的形參中聲明,以下可以直接使用。
@ModelAttribute可以把頁面接收的值放入到request作用域
1 @RequestMapping(value="model") 2 public String model(@ModelAttribute("stu") Student sb){ 3 return "hello"; 4 }
@SessionAttributes:會自動把model中的數據放到session作用域。他是寫在類上面的,並且屬性名和model中的一致。
Model中的名字叫 stu
1 @RequestMapping(value="model2") 2 public String model2(Model model){ 3 Student student= new Student(1, "傻大個", "男", "李勝"); 4 model.addAttribute("stu",student); 5 return "hello"; 6 }
聲明在類上,並且名字是stu
Map:也是放在request作用域
直接new一個Map<String, Student>mvp = new HashMap<String, Student>();是沒有辦法把值放到作用域的。我們需要在方法以形參的形式聲明,才會把值放到request作用域: