SpringMVC入門——基礎知識

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使用!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章