SpringMVC入門——基礎知識
1.MVC 的 Handler (Controller)方法可以接受哪些 ServletAPI 類型的參數:
- HttpServletRequest
- HttpServletResponse
- HttpSession
@RequestMapping(value="abc",method=RequestMethod.POST)
public void abc(HttpServletRequest request,HttpServletResponse response){
response.setHeader("content-Type", "text/html;charset=utf-8");
String username = request.getParameter("username");
System.out.println(username);
try {
response.getWriter().println(username);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.重定向與轉發
一般情況下,控制器方法返回字符串類型的值會被當成邏輯視圖名處理
如果返回的字符串中帶 forward: 或 redirect: 前綴 時,SpringMVC 會對他們進行特殊處理:將 forward: 和 redirect: 當成指示符,其後的字符串作爲 URL 來處理
–redirect:/success.jsp:會完成一個到 success.jsp 的重定向的操作
–forward:/success.jsp:會完成一個到 success.jsp 的轉發操作
@RequestMapping(value="testRedirect")
public String testRedirect(){
return "redirect:1.jsp";
}
@RequestMapping(value="testRedirect2")
public String testRedirect2(){
return "forward:1.jsp";
}
注意:springmvc.xml文件中要配置
<mvc:annotation-driven></mvc:annotation-driven>
可以在spingmvc配置文件中配置 <mvc:view-controller path="/j1sp" view-name="success"/>
標籤,就可以讓我們的請求不經過Controller,直接進入另一個目標頁面!(訪問/j1sp時,直接進入success.jsp頁面)
但是此時原來訪問正常的@RequestMapping URL現在卻不能正常訪問了,如果想正常訪問,需要加入<mvc:annotation-driven>
該標籤
3.@ModelAttribute註解用於修飾方法
這個@ModelAttribute註解修飾的方法在我們每次請求目標方法之前都會被執行一次!
作用是:與@Requestmapping映射的方法中參數對象比較或賦值。如果參數傳入的對象有些屬性沒有賦值,就會使用註解對象的屬性值
@ModelAttribute
public void updateUser(Map<String, Object> map){
User user=new User("張三", "123456", 15);
User user2=new User("老秦","111",20);
map.put("use", user);
map.put("user2", user2);
}
@RequestMapping(value="test8",method=RequestMethod.POST)
public String test(@ModelAttribute(value="use") User user){
System.out.println(user);
return "success";
}
注意:當@RequestMapping方法的參數中不寫(@ModelAttribute(value=“”) User use)時,默認的 是User實體類的user對象(即類名的首字母小寫)
4.使用 POJO 對象綁定請求參數值
Spring MVC 會按請求參數名和 POJO 屬性名進行自動匹 配,自動爲該對象填充屬性值。支持級聯屬性。 如:dept.deptId、dept.address.tel 等。
例如創建User類和Address類,User類中有一個Address類型的屬性,則上傳表單時就可以這樣寫
<form action="${pageContext.request.contextPath }/bcd" method="post">
用戶名:<input type="text" name="username">
密碼:<input type="password" name="password">
年齡:<input type="text" name="age">
省份:<input type="text" name="address.privance">
城市:<input type="text" name="address.city">
縣:<input type="text" name="address.county">
<input type="submit" value="提交">
</form>
接收請求處理
@RequestMapping(value="bcd",method=RequestMethod.POST)
public String bcd(User user){
System.out.println(user);
return "success";
}
確定目標方法POJO類型入參的過程:
1. 確定一個key:
1).若目標方法的POJO類型的參數木有使用@ModelAttribute作爲修飾,則key爲POJO類名第一個字母的小寫。
2).若使用@ModelAttribute修飾,則key爲@ModelAttribute註解的value屬性值.
2. 在implicitModel中查找key對應的對象,若存在,則作爲入參傳入
1).若在@ModelAttribute標記的方法中在Map保存過,且key和1確定的key一致,則會獲取到!
3.在implicitModel中不存在key對應的對象,則檢查當前的Handler是否使用@SessionAttribute註解修飾,若使用了該註釋,且@SessionAttributes註解的value屬性值中包含了key,則會從HttpSession中來獲取key所對應的value值,若存在則直接傳入到目標方法的入參中,若不存在則將拋出異常。
4.若Handler沒有標識@SessionAttributes註解或者@SessionAttributes註解的value值中不包含key,則會通過反射來創建POJO類型的參數,傳入爲目標方法的參數。
5.SpringMVC會把key和POJO對象保存到implicitModel中,進而會保存到request域中!
@SessionAttributes註解只能標記在類上,可以使得多次請求共享某部一部分數據!
value:指定放入session域中鍵
types:指定放入Session域中的對象的字節碼!
@SessionAttributes(value={"use","user2"})//@SessionAttributes(types={User.class})
@Controller
public class BController {
@ModelAttribute
public void updateUser(Map<String, Object> map){
User user=new User("張三", "123456", 15);
User user2=new User("老秦","111",20);
map.put("use", user);
map.put("user2", user2);
}
5.處理模型數據
Spring MVC 提供了以下幾種途徑輸出模型數據:
–ModelAndView: 處理方法返回值類型爲 ModelAndView時, 方法體即可通過該對象添加模型數據
–Map 及 Model、ModelMap: 入參爲 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 時,處理方法返回時,Map 中的數據會自動添加到模型中。
注意:無論我們的返回值是String類型還是ModelAndView類型,SpringMVC框架執行目標Handler方法之後都會將返回值解析爲ModelAndView;
我們放入到Map或者Model、ModelMap中的數據都會放入ModelAndView對象中,作爲MOdel使用!