Spring MVC學習筆記(五)

第五章 Spring MVC起步
1,Spring將請求在調度Servelet,處理器映射(handler mapping),控制器以及視圖解析器(view resolver)之間移動。
在Spring MVC中,DispatcherServlet就是前端控制器。DispatcherServlet的任務是將請求發送給Spring MVC控制器(controller).
2,搭建Spring MVC
配置DispatcherServlet:
1)配置在web.xml文件中,這個文件會放到應用的WAR包裏面。
2)在config包中,定義繼承AbstractAnnotationConfigDispatcherServletInitializer的類,配置在Servlet容器中。
擴展AbstractAnnotationConfigDispatcherServletInitializer的任意類都會自動配置DispatcherSevlet和Spring應用上下文,Spring的應用上下文會位於應用程序的Servlet上下文之中。
三個方法:getServeletMappings():將一個或多個路徑映射到DispatcherServlet上。
getServeletConfigClasses():返回的帶有@Configuration註解的類將會用來定義DispatcherServlet應用上下文的bean,加載包含Web組件的bean(控制器,視圖解析器,處理器映射)
getRootConfigClasses():返回的帶有@Configuration註解的類將會用來定義ContextLoaderListener創建的應用上下文中的bean ,加載其他bean(驅動應用後端的中間層和數據層組件)
3,啓用MVC
<mvc:annotation-driven>
@EnableWebMvc
4,控制器
方法上添加了@RequestMapping註解(value屬性:指定方法所要處理的請求路徑,method屬性:細化所處理的HTTP方法)的類,這個註解聲明瞭它們要處理的請求。
@Controller:基於@Component註解,輔助實現組件掃描
5,接受請求的輸入
Spring MVC運行以多種方式將客戶端中的數據傳送到控制器的處理器方法中:
查詢參數(Query Parameter)
@RequestMapping(method=RequestMethod.GET)
public List<Spittle> spittles(
@RequestParam(value="max",defaultValue=MAX_LONG_AS_STRING)long max,
@RequestParam(value="count",defaultValue=20)int count){
    return spittleRespository.findSpittles(max,count);
}
private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE);
表單參數(Form Parameter)
@RequestMapping(value="/register", method=RequestMethod.POST)
public String processRegistration(
@Valid Spitter spitter, Errors errors){  @Valid註解告知Spring確保該參數滿足校驗限制,Errors參數要緊跟在帶有@Valid註解的參數後面,@Valid標註的就是要檢驗的參數
    if(errors.hasErrors()) {    //檢驗校驗是否有錯誤
    return "registerForm";
    spittleRespository.save(spitter);
    return "redirect:/spitter/" + spitter.getUsername();//模型的key將會是spittle,這是根據傳遞到addAttribute()方法中的類型推斷得到的。
}
Spring對Java校驗API的支持:javax.validation.constraints包,  @AssertFalse  @Pattern  @Size  @NotNull
路徑變量(Path Variable)
@RequestMapping(value="/{spittleID}", method=RequestMethod.GET)
public String spittle(
@PathVariable("spittleID")long spittleID, Model model){  也可以寫做public String spittle(@PathVariable long spittleID, Model model){如果@PathVariable沒有value屬性的話,會假設佔位符的名稱與方法的參數名相同)
    model.addAttribute(spittleRespository.findOne(spittleID);
    return "spittle";//模型的key將會是spittle,這是根據傳遞到addAttribute()方法中的類型推斷得到的。
}
對/spittles/12345(通過路徑變量)發起GET請求要優於對"/spittles/show?spittle_id=12345(通過查詢參數)發起請求。前者能夠識別出要查詢的資源,而後者描述的是帶有參數的一個操作--本質上是通過HTTP發起的RPC。

20190506:
第16章 使用Spring MVC創建REST API
1,以信息爲中心的表述性狀態轉移(Representaitonal State Transfer,REST,關注要處理的數據)已經成爲替換傳統SOAP(關注行爲和處理) web服務的流行方案。
REST就是將資源的狀態以最適合客戶端或服務端的形式從服務器端轉移到客戶端(或者反過來)。
REST中會有行爲,它們是通過HTTP方法來定義的。具體來講,也就是GET,POST,PUT,DELETE,PATCH以及其他的HTTP方法構成了REST中的動作。
2,Spring支持以下方式來創建REST資源:
控制器可以處理所有的HTTP方法。
表述是REST中很重要的一個方面。它是關於客戶端和服務器端針對某一資源是如何通信的。
控制器本身通常並不關心資源如何表述。控制器以Java對象的方式來處理資源。控制器完成了它的工作之後,資源纔會被轉化成最適合客戶端的形式。
Spring提供了兩張方法將資源的Java表述形式轉換爲最適合客戶端的表述形式:
內容協商(Content negotiation):選擇一個視圖,它能夠將模型渲染爲呈現給客戶端的表述形式。特殊的視圖解析器:ContentNegotiatingViewResolver
消息轉換器(Message conversation):通過一個消息轉換器將控制器所返回的對象轉換爲呈現給客戶端的表述形式。
3,ContentNegotiatingViewResolver配置
@Bean
public ViewResolver cnViewResolver() {
    return new ContentNegotiatingViewResolver();
}
首先查看URL的文件擴展名,然後再考慮請求中的Accept頭部信息,然後會使用“/"作爲默認的內容類型,這就意味着客戶端必須要接收服務器發送的任何形式的表述。
與Spring的其他視圖解析器不同,ContentNegotiatingViewResolver本身不會解析視圖,而是委託給其他的視圖解析器,讓他們來解析視圖。
通過設置ContentNegotiationManager可以改變所請求媒體類型的默認策略。
<bean id="contentNegotiationManager"
    class="org.springframework.http.ContentNegotiationManagerFactoryBean"
    p:defaultContentType="application/json">
@Override
public void configureContentNegotiation(
    ContentNegotiationConfigurer configurer) {
    configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
將ContentNegotiationManager Bean注入到ContentNegotiatingViewResolver的將contentNegotiationManager屬性中:
@Bean
public ViewResolver cnViewResolver(ContentNegotiationManager cnm) {
    ContentNegotiatingViewResolver cnvr = new ContentNegotiatingViewResolver();
    cnvr.setContentNegotiationManager(cnm);
}
4,使用HTTP信息轉換器
使用消息轉換器的話,需要告訴Spring跳過正常的模型/視圖流程,並使用消息轉換器,最簡單的方法是爲控制器方法添加@Response註解。
@Response註解會告知Spring,我們要將返回的對象作爲資源發送給客戶端,並將其轉換爲客戶端可接受的表述形式。更具體地講,DispatcherServet將會考慮到請求中Accept頭部信息,並查找能夠爲客戶端提供所需表述形式的消息轉換器。
@RequestMapping(method=RequestMethod.GET,produces="application/json") //produces屬性表明這個方法只處理預期輸出爲JSON的請求,即只會處理Accept頭部信息包含"application/json"的請求。
public @ResponseBody List<Spittle> spittles(
    @RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING)long max,
    @RequestParam(value="count",defaultValue=20)int count){
    return spittleRespository.findSpittles(max,count);
}
在請求提中接收資源狀態
@RequestMapping(method=RequestMethod.POST,consumes="application/json")
public @ResponseBody Spittle saveSpittle(@RequestBody Spittle spittle)
    return spittleRespository.save(spittle);
}

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