天天看點

傳統SpringMVC使用介紹

作者:Java熱點

@RequestMapping注解

  • DispatcherServlet截獲請求後就通過控制器上的@RequestMapping注解提供的映射資訊确定請求所對應的處理方法
  • 可以使用params參數和headers參數 更加精準的映射請求
java複制代碼@RequestMapping(value="testParamsAndHeaders")
    ,params={"address", "age!=25"}
    ,headers={"Accept-Language=en-US,zh;q=0.8"}
           
  • 支援Ant風格通配符 ?:比對檔案名中的一個字元。例如: /student/get?? 比對 /student/getaa或/student/getbb *:比對檔案名中的任意字元。例如:/student/*/createStudent 比對 student/aa/createStudent 或者 student/bb/createStudent **:比對多層路徑。例如:/student/**/createStudent 比對 /student/createStudent 或者student/aa/bb/createStudent
  • @PathVariable可以用來将url中的占位符映射到目标方法參數中
java複制代碼@RequestMapping("/testPathVariable/{name}")
public String testPathVariable(@PathVariable("name" String name)){
    return name;
}
           
  • 可以将POST請求轉化成标準的PUT或者DELETE請求 需要配置HiddenHttpMethodFilter 需要發送POST請求 需要在發送POST請求的時候攜帶一個name="_method" 的隐藏域,值是DELETE 或者 PUT
xml複制代碼<!--配置org.Springframework.web.filter.HiddenHttpMethodFilter,可以把POST請求轉為DELETE或者是PUT請求-->
<filter>
    <filter-name>HiddentHttpMethodFilter</filter-name>
    <filter-class>org.Springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddentHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
           
html複制代碼<form action="testRest" method="post">
    <input type="hidden" name="_method" value="PUT" />
    <input type="submit" value="test" />
</form>
           
  • @RequestParam 可以用來映射請求參數
java複制代碼//value:請求參數的參數名,defaultValue :如果沒有這個參數的預設值,required:是否是必須的預設是true
@RequestMapping("/testRequestParam)
public String testRequestParam(@RequestParam(value="name" defaultValue="小紅") String name){
    return name
}
           
  • @RequestHeader 映射請求頭 用法同@RequestParam
java複制代碼@RequestMapping("/testRequestHeader)
public String testRequestHeader(@RequestHeader(value="Auth" String auth)){
    return auth;
}
           
  • @cookieValue 映射cookie值 用法同@RequestParam
java複制代碼@RequestMapping("testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String id){
    return id;
}
           

參數處理

  • MVC的Handler方法可以接收一下參數,進行自動填充 HttpServletRequest HttpServletResponse HttpSession java.util.Map org.springframework.ui.Model org.springframework.ui.ModelMap
  • controller處理方法的傳回值 ModelAndView:處理方法的傳回值是這個的時候,可以向該對象中添加資料 Map及Model:入參為Map或者Model的時候,可以直接向map中添加鍵值對,會自動儲存到request域對象中,頁面傳回時自動添加其中 @SessionAttributes:将模型中的某個屬性暫存到HttpSession中,以便多個請求之間可以共享這個屬性,除了可以通過屬性名指定需要放到會話中的屬性外,還可以通過模型屬性的對象類型指定哪些模型屬性需要放到會話中。例:@SessionAttributes(value="{name}",types={String.class})會把放入到map中的參數放到session中 ModelAttribute:方法入參标注該注解後,入參的對象就會放在資料模型中
java複制代碼//控制器處理方法的傳回結果是ModelAndView的時候,它既包含視圖資訊,也包含模型資料資訊。
//添加模型資料:

//ModelAndView.addObject(String attributeName,Object attributeValue)
//ModelAndView.addAllObject(Map modelMap)

//其中模型資料會依次周遊request,setAttribute(modelName,modelValue),即添加到request域對象中
//設定視圖:

//void setView(View view)
//void setViewName(String viewName)

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    ModelAndView modelAndView = new ModelAndView("/testModelAndView");
    modelAndView.addObject("name", "小紅");
    return modelAndView;
}
           
java複制代碼//1) Map:入參為Map的時候,可以直接向map中添加鍵值對,會自動儲存到request域對象中,頁面傳回時自動添加其中
//2)Model:入參為Model的時候,可以直接向Model中添加鍵值對,會自動儲存到request域對象中,頁面傳回時自動添加其中

@RequestMapping("/testMap")
public void testMap(Map<Stirng, Object> map, Model model){
    map.put("name", "小紅");
    model.addAttribute("address", "xx");
}
           
java複制代碼//除了可以通過屬性名指定需要放到會話中的屬性外,還可以通過模型屬性的對象類型指定哪些模型屬性需要放到會話中。
//例:@SessionAttributes(value="{name}",types={String.class})
//會把放入到map中的參數放到session中

@SessionAttributes(value="{name}", types={String.class})

@RequestMapping("/testSessionAttributes")
public void testSessionAttributes(Map<Stirng, Object> map){
    map.put("name", "小紅");
}
           
java複制代碼//有ModelAttribute注解标注的方法,會在每個目标方法執行之前被SpringMvc調用!

//其中HttpServletRequst對象是同一個,是以可以在有ModelAttribute注解标注的方法的入參傳入request, 同時
//request.setAttribute(arg0, arg1);之後在目标url中可以request.getAttribute() 出來

//執行過程:先執行有ModelAttribute注解标注的方法,将pojo放入map或model中,此時pojo還沒有放入request域
//中,是以不能用request.getAttribute方法擷取pojo。然後執行目标方法,将map或model中的pojo傳入目标方
//法,在将前台傳過來的資料一一set,這樣就能達到 前台沒有傳過來的資料沒有改變,而不是null.

//也可以不往model中加,直接将需要添加的值設定成方法的傳回值,也一樣會放在model中。key就是傳回值的名字,
//如果需要指定key 那就在@modelattribute注解的value屬性中指定:

@ModelAtribute(value="preStudent")
public Object modelAttribute(){
    Student student = new Student();
    student.setName("小紅");
    student.setAge(25);
    student.setAddress("xx");
    return student;
}

//其中@ModelAttribute注解也可以放在目标方法的參數上,可以指定一個參數名進行綁定:
@ModelAtribute
public void modelAttribute(Model model){
    Student student = new Student();
    student.setName("小紅");
    student.setAge(25);
    student.setAddress("xx");
    model.addAttribute("preStudent", student);
}

@RequestMapping("/testModelAttribute")
public void testModelAttribute(@ModelAttribute("preStudent") student){
    System.out.println(student);
}

//其中如果model中沒有對應的key,并且目前handler也沒有用@sessionAttributes注解标記,則會通過反射的方式
//建立一個對象,此時該對象必須有一個無參構造器。如果用@sessionAttributes注解标記并且其vaule屬性與key一
//緻,則會強制在session中取,如果沒有取到則會抛出一個異常。