1. 程式人生 > >SpringMVC檢視及REST風格(三)

SpringMVC檢視及REST風格(三)

什麼是檢視解析器?

springMVC用於處理檢視最重要的兩個介面是ViewResolver和View。

ViewResolver的主要作用是把一個邏輯上的檢視名稱解析成一個真的的檢視,而SpringMVC中用於把View物件呈現給客戶端的是View物件本身,而ViewResolver只是把邏輯檢視名稱解析為物件的View物件。

View介面的主要作用是用來處理檢視,返給給客戶端。

檢視解析器的執行流程:

請求方法執行完成後,最終返回一個ModelAndView物件,對於那些返回String,View,ModelMap等型別SpingMVC最終會在內部給他們裝配成一個ModelAndView物件,它包含了邏輯名和模型物件的檢視。StringMVC藉助檢視解析器得到最終的檢視物件,最終的檢視可以是JSP,也可能是其他的檔案形式的檢視。對於最終採取那一種方式渲染處理器並不關心,處理器重點焦距在生產模型資料的工作上,從來實現了MVC充分的解耦。

檢視:

檢視的作用是渲染模型資料,將模型裡面的資料以某種形式呈現給使用者。為了實現檢視模型和具體實現技術的解耦,Sping定義了一個View介面。檢視物件由檢視解析器負責例項化,由於檢視是無狀態的,所以它們不會有執行緒安全問題。

常用的檢視實現類:

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>