首頁 > Java > java教程 > 主體

SpringMVC視圖及REST風格的詳細分析(附程式碼)

不言
發布: 2018-09-26 15:26:51
原創
2219 人瀏覽過

這篇文章帶給大家的內容是關於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>
登入後複製

以上是SpringMVC視圖及REST風格的詳細分析(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板