什麼是視圖解析器?html
springMVC用於處理視圖最重要的兩個接口是ViewResolver和View。web
ViewResolver的主要做用是把一個邏輯上的視圖名稱解析成一個真的的視圖,而SpringMVC中用於把View對象呈現給客戶端的是View對象自己,而ViewResolver只是把邏輯視圖名稱解析爲對象的View對象。spring
View接口的主要做用是用來處理視圖,返給給客戶端。api
視圖解析器的執行流程:安全
請求方法執行完成後,最終返回一個ModelAndView對象,對於那些返回String,View,ModelMap等類型SpingMVC最終會在內部給他們裝配成一個ModelAndView對象,它包含了邏輯名和模型對象的視圖。StringMVC藉助視圖解析器獲得最終的視圖對象,最終的視圖能夠是JSP,也多是其餘的文件形式的視圖。對於最終採起那一種方式渲染處理器並不關心,處理器重點焦距在生產模型數據的工做上,歷來實現了MVC充分的解耦。服務器
視圖:網絡
視圖的做用是渲染模型數據,將模型裏面的數據以某種形式呈現給用戶。爲了實現視圖模型和具體實現技術的解耦,Sping定義了一個View接口。視圖對象由視圖解析器負責實例化,因爲視圖是無狀態的,因此它們不會有線程安全問題。mvc
經常使用的視圖實現類:app
InternalResourceView:將JSP資源封裝成一個視圖,是springmvc默認使用的視圖解析器。
JstlView:在JSP項目中引入jstl包springmvc會自動使用該解析器
MapingJackJsonView:將模型經過Jackson開源框架的ObjectMapper以Json方式輸出。
AbstractExcelView:Excel文檔視圖的抽象類,該視圖基於POI構造Excel文檔
AbstractPdfVIew:PDF文檔視圖的抽象類,該視圖基於iText構建Pdf文檔
BeanNameViewResolver:將邏輯視圖名解析爲一個Bean,Bean的id等於邏輯視圖名。
視圖解析器的做用比較單一,將邏輯視圖解析爲一個具體的視圖對象,全部的視圖解析器必須實現ViewResolver接口。
JSP是最經常使用的視圖技術,可使用InternalResourceView做爲視圖解析器
項目中只要引入了JSTL標籤則springmvc會自動把視圖有InternalResourceView轉換成JstlView,JstlView是它的子類。
每個視圖解析器都實現了Ordered接口並開發出一個order屬性,能夠經過它設置解析器的優先級,order越小優先級越高。Spring MVC會按視圖解析器順序的優先級對邏輯視圖名進行解析,直到解析成功並返回視圖對象,不然會拋出ServletException異常
自定義視圖:
@Component public class MyView implements View { @Override public String getContentType() { return "text/html"; } @Override public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.getWriter().println("<h1>Spring MVC Custom view</h1>"); } }
咱們須要將這個自定義的視圖實現View接口而後重寫接口中的兩個方法。而後咱們把這個類聲明成Bean交給spring管理。在這裏咱們配置一個beanName解析器。
<!-- 配置BeanName解析器 -->
<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"/>
</bean>
而後寫一個請求,這個請求返回Bean的名字,默認是首字母小寫以駝峯式展示。
@RequestMapping("myView") public String myView(){ System.out.println("myView load ..."); return "myView"; }
這樣就能夠完成咱們的自定以視圖。
關與重定向:
若是返回字符串中帶有」redirect:「或"forward:",SpringMvc會將其作特殊的處理。
若是咱們須要直接訪問視圖能夠這樣配置
<!– 直接配置對應的視圖訪問路徑 --> <mvc:view-controller path="/hello" view-name="hello.jsp" /> <!-- 若是配置了mvc-controller會致使其它頁面無法正常訪問,還須要添加一個標籤 --> <mvc:annotation-driven />
REST章節
REST(Representational State Transfer):即(資源)表現層狀態傳遞。
資源(Resources):網絡上的一個實體,或者說網絡上的一段信息。它能夠是一段文本,一段歌曲,一張圖片等等,能夠用一個URL指向它,每一個資源都有一個特定的,獨一無二的URL,要訪問這個資源,直接訪問這個URI便可。
表現層(Representation):將資源呈現出來的形式。
狀態轉化(State Transfer):每發出一個請求,就表明客戶端和服務器一次交互。HTTP協議是一個無狀態的協議,即全部的狀態都保存在服務器端。客戶端想要操做服務器,必須經過某些手段,讓服務器發生狀態轉化,而這種轉化是創建在表現層之上的,因此就是表現層狀態轉化。
在咱們的SpringMVC之中支持HTTP四種請求狀態,REST規定的HTTP協議中四種表示操做方式的動詞
GET請求:獲取資源
POST請求:新建資源
PUT:更新資源
DELETE:刪除資源
咱們須要在WEB.xml中配置實現PUT,DELETE請求方式,你們都知道在咱們傳統的HTML中只有GET,POST兩種請求方式。
<!-- 配置HiddenHttpMethodFilter過濾器實現PUT,DELETE請求 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class> org.springframework.web.filter.HiddenHttpMethodFilter </filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
GET請求
GET請求: <a href="rest/testRest/10">test RestGet請求</a><br><br> @RequestMapping(value="/testRest/{id}",method=RequestMethod.GET) public String testRestGet(@PathVariable Integer id){ System.out.println("GET請求,獲取id爲:" + id + "的對象!"); return SUCCESS; }
Post請求
POST請求: <form action="rest/testRest" method="post"> <input type="submit" value="post請求" /> </form> @RequestMapping(value="/testRest",method=RequestMethod.POST) public String testRestPost(){ System.out.println("POST請求,添加新的對象!"); return SUCCESS; }
PUT和DELETE請求想要使用必須添加上面的過濾器,而且在Post請求中加上隱藏域name="_method",value="PUT/DELETE"。
PUT,請求實際上是由POST請求轉換而來的。
PUT請求: <form action="rest/testRest" method="post"> <!-- 添加隱藏域,名稱爲_method,value爲請求方式 --> <input type="hidden" name="_method" value="PUT" /> <input type="submit" value="put請求" /> </form> @RequestMapping(value="/testRest",method=RequestMethod.PUT) public String testRestPut(){ System.out.println("PUT請求,更新操做!"); return SUCCESS; }
DELETE請求
DELETE請求: <form action="rest/testRest/10000" method="post"> <!-- 添加隱藏域,名稱爲_method,value爲請求方式 --> <input type="hidden" name="_method" value="DELETE" /> <input type="submit" value="delete請求" /> </form> @RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE) public String testRestDelete(@PathVariable Integer id){ System.out.println("DELETE請求,刪除操做!" + id); return SUCCESS; }
重複一次第一章的內容在咱們springmvc攔截全部請求會致使css,js,圖片等不能引入咱們能夠這樣解決:
<!--將非mapping配置下的請求交給默認的Servlet來處理--> <mvc:default-servlet-handler/> <!--若是添加了默認servlet,mvc請求將無效,須要添加annotation-driven--> <mvc:annotation-driven></mvc:annotation-driven>