springMVC中級篇

1 springMVC做用域參數處理html

     springMVC提供暫存(共享)數據到http的request對象或者session對象中的支持,主要註解有三個:@RequestAttribute、@SessionAttribute、@SessionAttributes,它們的做用以下:前端

  • @RequestAttribute獲取http的請求(request)對象屬性值,用來傳遞給控制器的參數。
  • @SessionAttribute在http的會話(session)對象屬性值中,用來傳遞給控制器的參數。
  • @SessionAttributes,能夠給它配置一個字符串數組,這個數組對應的是數據模型對應的鍵值對,而後將這些鍵值對保存到session中。

     也許你會留意到並無@RequestAttributs這個註解,那是由於在請求的範圍中,springMVC更但願你使用它所提供的數據模型Model,它的數據模型自己就是在請求的生命週期中存在的。java

   1.1 註解@RequestAttributeajax

     主要做用是從http的request對象中取出請求屬性,它的範圍週期在一次請求中存在spring

<a href="/book//requestAttribute?msg=peppa">peppa</a>
@RequestMapping("/book/requestAttribute")  
public String requestAttr(@RequestAttribute("msg") String name){  
  ........  
}  

     這樣就能夠獲取請求的msg屬性了,對於@RequestAttribute註解的參數,默認是不能爲空的,不然系統會拋出異常。和@RequestParam同樣,它也有一個required配置項,只須要設置它爲false,參數就能夠爲空了:@RequestAttribute(name="msg",required=false)數據庫

   1.2 註解@SessionAttribute和@SessionAttributsjson

     這兩個註解和http的session會話對象有關,可讓咱們在和服務器會話期間經過它讀/寫會話對象的屬性,緩存必定數據信息。api

     先來設置會話屬性,在控制器中可使用註解@SessionAttributes來設置對應的鍵值對,不過這個註解只能對類進行標註,不能對方法或者參數標註。能夠配置屬性名稱或者屬性類型。它的做用是:當這個控制器被註解後,SpringMvc執行完控制器的邏輯後,將數據模型中對應的屬性名稱或者熟悉類型保存到http的session對象中數組

package com.wise.tiger.controller;  
@Controller  
@RequestMapping("book")  
//能夠配置數據模型的名稱和類型,二者取或關係  
@SessionAttributes(names={"id"})  
public class AttributeController{  
   @Autowired private BookService service;  
   @RequestMapping("/sessionAttributes")  
   public String sessionAttrs(Integer id,Model model){  
      //根據類型,session將會保存圖書信息  
       model.addAttribute("book",service.findById(id));  
     //根據名稱,session將會保存id  
       model.addAttribute("id",id);  
       return "show";  
   }  
}  

     這樣就能夠在控制器內不使用servlet的api形成侵入的HttpSession對象來設置session的屬性了,這更加有利於對測試環境的構建進行測試。既然有了設置Session的屬性,那麼天然就有讀取session屬性的要求,經過@SessionAttribute實現獲取session對象緩存

<c:set var="id" value="1" scope="session"/>  
<c:redirect url="/book/sessionAttr"/>  

     後臺controller獲取session屬性值:

@RequestMapping("/book/sessionAttribute")  
public String sessionAttr(@SessionAttribute("id") Integer id){  
  ........  
}  

     和@RequestParam同樣,@SessionAttribute註解的參數默認是不能爲空的,若是要改變這個規則。修改required配置項爲false便可。

  1.3 註解@CookieValue和註解@RequestHeader

      從名稱而言,這兩個註解都很明確,就是從cookie和http請求頭獲取對應的請求信息,它們的用法比較簡單,其大同小異:

@RequestMapping("/getHeaderAndCookie")  
public  String getHeaderAndCookie(@RequestHeader(value="UserAgent",required=false,defaultValue="attribute") String userAgent,
@CookieValue(value="JSESSIONID",required=true,defaultValue="jsession-id" String sessionId){  
 .........  
}  

   1.4 清空session

@RequestMapping("/clear.do")
public void clearSession(SessionStatus status){
	status.setComplete();
}

   1.5 動態更新ModelAttribute

@ModelAttribute能夠標註在參數上也能夠標註在方法上,當標註在方法上時,該方法會優先執行,能夠用來實現數據動態更新,前端頁面表單提交須要更新後的值,由提早執行的方法去持久層返回該實體,系統底層會自動未提交的數據進行封裝,提交的更新數據則會覆蓋。若是標註在參數上,它會提早去標有@ModelAttribute的方法中尋找包含該參數名的參數進行返回。

 

2 請求分發與重定向

    要將一個圖書信息轉化爲JSON視圖的功能,只要傳遞圖書信息給它,它就能將信息轉化爲視圖,默認是請求分發的。

@RequestMapping("/book/showBookJsonInfo")  
public ModelAndView showBookJson(Book book){  
     var mv = new ModelAndView();  
     mv.addObject("book",book);  
     mv.setView(new MappingJackson2JsonView());  
     return mv;  
}  

    如今的需求是,每當新增一個圖書信息時,須要將其數據(圖書編號會回填)以json視圖的形式展現給請求者。在數據保存到數據庫後,由數據庫返回圖書編號,再將圖書信息傳遞給showBookJson方法,就能夠展現json視圖給請求者了:

@RequestMapping("/book/saveBook")  
//Model爲重定向數據模型,Spring Mvc會自動初始化它  
public String saveBook(Book book,Model model){  
     service.save(book);// 插入圖書後,會回填圖書編號  
     //綁定重定向數據模型  
     model.addAttribute("book",book);//只能傳遞簡單屬性,pojo須要flash屬性  
     return "redirect:./showBookJsonInfo";  
}  

    這裏的Model表明一個數據模型,能夠給它附加上對應的數據模型。SpringMVC有一個約定,若是返回的字符串不帶forward:和redirect:時,則默認爲請求分發;當返回的字符串中帶有forward:時,它會認爲是一個請求分發。當返回的字符串中帶有redirect:時,它會認爲是一個重定向。而事實上,不只能夠經過返回字符串來實現重定向,也能夠經過返回視圖來實現重定向。

@RequestMapping("/saveBook2")  
public ModelAndView saveBook2(ModelAndView mv,Book book){  
     mv.addObject("book",book);//只能傳遞簡單屬性,pojo須要flash屬性  
     mv.setView("redirect:./book/showBookJsonInfo");  
     return mv;  
}  

    可是,這樣並不能將參數順利傳遞給重定向的地址,由於在url重定向的過程當中,http的重定向參數是以字符串傳遞的,若是須要傳遞圖書pojo來完成任務,這個時候Springmvc提供了一個方法-----flash屬性,須要提供的數據模型就是一個RedirectAttribute:

@RequestMapping("/saveBook3")  
public String saveBook3(RedirectAttribute ra,Book book){  
     ra.addFlashAttribute("book",book);//綁定重定向數據模型  
     mv.setView("redirect:./book/showBookJsonInfo");  
     return "redirect:./showBookJsonInfo";  
}  

    這樣就可以傳遞pojo給下一個地址。使用addFlashAttribute方法後,springmvc會將數據保存到session中(session在同一個會話有效),重定向後就會將其清除, 這樣就可以傳遞給下一個地址了。

    1. 若是方法返回值是viod,視圖解析器會自動請求分發去尋找視圖解析器前綴包下該方法映射路徑名的頁面。
    2. 若是方法返回值是String並返回頁面,return "forward:該頁面會經過視圖解析器";return 「redirect:該頁面要本身寫全路徑,不會經過視圖解析器」

3. ajax獲取json數據

    有時候咱們須要異步處理時,須要返回的是json數據而非視圖對象,這時須要在方法上面添加@ResponseBody註解,這樣數據庫返回的數據會自動跳過視圖解析器,以json數據格式輸送到前端。@ResponseBody若標註在類上,則表示該類都跳過視圖解析器。此外,@RestController註解至關於@ResponseBody + @Controller合在一塊兒的做用。

相關文章
相關標籤/搜索