1. 程式人生 > >Spring MVC 頁面渲染( render view )

Spring MVC 頁面渲染( render view )

一、理解view解析過程

1.1 從邏輯view到物理view

在Spring MVC 中,controllers不會負責具體的頁面渲染,它僅僅是呼叫業務邏輯並返回model資料給view層,至於view層具體怎麼用HTML展現,由專門的view層具體負責,這就是MVC模式,業務層與展示層是鬆耦合的。那麼,Spring MVC是如何解耦合請求處理邏輯和頁面渲染的呢?

我們在Spring MVC配置介紹文章中已經知道,controller在處理外業務邏輯之後會返回一個邏輯view的字串,那麼Spring MVC是怎麼根據這個邏輯view名找到真正的物理view頁面呢?這個工作就由Spring的ViewResolvers

負責。

對於普通的JSP頁面,最常用到的就是view resolver就是InternalResourceViewResolver,它有兩個屬性,一個是匹配物理view的字首,一個是字尾。字首一般就是view頁面的路徑位置,字尾就是檔案的格式,而字首字尾之間的就是邏輯view名稱。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

比如按照上面的配置,如果controller返回的邏輯view名稱是home的話,InternalResourceViewResolver會根據這個邏輯view名home找到其對應的實際物理view:/WEB-INF/views/home.jsp

@Controller
@RequestMapping(value = "/")
public class HomeController {
    @RequestMapping(method= RequestMethod.GET)
    public String home() {
        return "home";
    }
}

這裡寫圖片描述

1.2 ViewResolver相關介面

ViewResolver介面:

public interface ViewResolver {
    View resolveViewName(String var1, Locale var2) throws Exception;
}

這個介面很簡單,當我們傳入一個邏輯view名和Locale物件,就會返回一個View例項。

View介面:

public interface View {
    String getContentType();

    void render(Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}

View介面的職責就是接收model物件、Request物件、Response物件,並渲染輸出結果給Response物件。如果我們要自己寫一個ViewResolver也很簡單,我們只需要實現ViewResolver和View兩個介面,在View介面中把需要渲染的內容輸出到Response物件中去就可以了。

1.3 各種現成的ViewResolver

當然,我們基本上不需要自己去寫ViewResolver,spring mvc為我們提供了各種各樣的ViewResolver:
這裡寫圖片描述

上面雖然列了很多個ViewResolver,但我們具體用哪個好呢?其實上面的每個ViewResolver都對應著一種view頁面的實現技術,比如InternalResourceViewResolver就是用來處理JSP頁面,TilesViewResolver主要處理Apache Tiles Views,FreeMarkerViewResolverVelocityViewResolver分別對應著FreeMarkerVelocity Template頁面渲染技術。

二、建立一個JSP View

無可否認,在Java web程式設計領域,歷史最悠久的頁面處理技術便是JSP。所以,這裡我們就拿JSP技術來展示spring是如何渲染頁面的。

Spring有兩種方式來支援JSP頁面:

1. InternalResourceViewResolver可以用來解析JSP檔案,當然,它也支援JSP頁面使用JavaServer Standard Library(JSTL)
2. Spring自己也提供了兩種JSP 標籤類庫,一種是表單資料繫結標籤庫,另一種是提供了一些通用特性的標籤庫

無論我們使用JSTL還是Spring JSP標籤類庫,我們都需要配置一個ViewResolver來解析JSP頁面。當然一些其他的ViewResolver也可以解析JSP頁面,但InternalResourceViewResolver是專門針對JSP技術設計的解析器,所以對於JSP頁面,它用起來最簡單也最方便。

2.1 InternalResourceViewResolver的配置

其實InternalResourceViewResolver的配置在1.1節已經介紹了,它可以直接把一個邏輯view名對映到轉實際渲染資料的物理view頁面。如果按照我們這樣的配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

那麼對於下面這些邏輯view名,InternalResourceViewResolver則會將其對映成相應的JSP頁面:

  • home 解析成 /WEB-INF/views/home.jsp
  • productList 解析成 /WEB-INF/views/productList.jsp
  • books/detail 解析成 /WEB-INF/views/books/detail.jsp

上面例子中還可以看到,當我們的邏輯名稱中含有反斜線/時,解析器會將其解析成資原始檔的路徑,這樣我們就可以對頁面資原始檔進行目錄管理了。

2.2 解析標準的JSTL檔案

如果要想在JSP中使用JSTL標籤很簡單,我們只需在InternalResourceViewResolver中指定一個viewClass屬性即可:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView />
</bean>

2.3 使用Spring JSP類庫

上面已經講過,Spring JSP提供了兩種類庫,一種是表單資料繫結標籤庫,另一種提供了更多樣話的通用標籤庫。

2.3.1 使用表單資料繫結標籤庫

Spring的表單資料繫結標籤庫提供了14個標籤,它和普通標籤的區別就是能夠將表單屬性和model物件屬性繫結在一起。要想使用表單資料繫結標籤庫,只需要在JSP頁面中宣告:

<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>

標籤庫中的14個標籤:
這裡寫圖片描述
下面舉個例子,我們使用這個標籤庫來重寫一個註冊頁面:

<sf:form method="POST" commandName="user">
   First Name: <sf:input path="firstName" /><br/>
   Last Name: <sf:input path="lastName" /><br/>
   Email: <sf:input path="email" /><br/>
   Username: <sf:input path="username" /><br/>
   Password: <sf:password path="password" /><br/>
   <input type="submit" value="Register" />
</sf:form>

commandName:對應後端model資料物件名稱,也就是Model中的對應的key值

@RequestMapping(value="/register", method= RequestMethod.GET)
public String showRegistrationForm(Model model) {
    model.addAttribute("user",new User());
    return "register";
}

path:我們可以看到form表單內部每個標籤都有個path屬性,這個屬性對應的就是Model物件的屬性

2.3.2 使用通用標籤庫

除了表單資料繫結標籤庫之外,Spring還提供了一個更加通用的標籤庫,要想使用這個更通用的標籤庫,只需要在JSP頁面中新增:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

標籤庫中的標籤:
這裡寫圖片描述
關於這些標籤的詳細使用說明可以檢視spring的官方文件,這裡不多做介紹了。

相關推薦

Spring MVC 頁面渲染( render view )

一、理解view解析過程 1.1 從邏輯view到物理view 在Spring MVC 中,controllers不會負責具體的頁面渲染,它僅僅是呼叫業務邏輯並返回model資料給view層,至於view層具體怎麼用HTML展現,由專門的view層具體負

Spring MVC頁面重定向實例

targe packaging ips bmi 1.0 tsp pen web-inf htm 以下內容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-page-redirection-e

Spring MVC頁面重定向

quest this head 新頁面 ase frame png 按鈕 resource 以下示例顯示如何編寫一個簡單的基於Web的重定向應用程序,這個應用程序使用重定向將http請求傳輸到另一個頁面。 基於Spring MVC - Hello World實例章節中代碼

Spring MVC : 從Model和View名稱生成最終的View

當我們使用 Spring MVC開發Web應用頁面時,一般會使用某種檢視模版引擎技術,比如FreeMarker,Velocity之類的,然後還會寫很多控制器方法用來處理某個請求,這些控制器方法基本的套路是: 寫一個檢視模板,配置到合適的位置; 控制器方法接收處

spring mvc 頁面訪問圖片或者js等靜態檔案路徑出錯問題

這是web工程的結構,圖片放在images資料夾下,js檔案放在resource資料夾下 然後就是進行spring mvc的配置,我上一篇文章就有講到怎麼去配置,但只是

spring mvc Could not resolve view 返回500問題

問題:spring mvc找不到view時,返回http 500錯誤。不是應該是404錯誤麼?後來查原始碼發現,是因為專案裡用了多個HandlerMapping,其中包含了SimpleUrlHandlerMapping,而且設定了defaultHandler=UrlFilen

spring mvc 頁面form提示語

image nta 信息 edi inpu rec 保存 message ttr <form:form id="inputForm" modelAttribute="bsRabiesNum" action="${ctx}/num/bsRabiesNum/save?ty

spring mvc redirect 重定向 跳轉並傳遞引數 && mvc:view-controller直接轉發頁面

在專案中做form表單功能提交時,防止使用者客戶端後退或者重新整理時重複提交問題,需要在服務端進行重定向跳轉,具體跳轉方式有以下幾種方式: 公用程式碼: Java程式碼   @RequestMapping(value="/index",method = { Reque

Spring MVC頁面傳值 Map、Model和ModelMap

內容 ros obj model clas mod div java mode 除了使用ModelAndView方式外。還可以使用Map、Model、ModelMap來向前臺頁面創造 使用後面3種方式,都是在方法參數中,指定一個該類型的參數。例如: java類中 @Req

spring mvc的工程遇到頁面加載jquery失敗,提示 ReferenceError: $ is not defined

頁面加載 js文件 test head ren query title 首頁 訪問靜態文件 測試頁面代碼: <script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>&l

Spring MVC-視圖解析器(View Resolverr)-內部資源查看解析器(Internal Resource View Resolver)示例(轉載實踐)

ast mes 技術 子文件夾 schema html cati href tree 以下內容翻譯自:https://www.tutorialspoint.com/springmvc/springmvc_internalresourceviewresolver.htm 說

Spring MVC-視圖解析器(View Resolverr)-多重解析器(Multiple Resolver)示例(轉載實踐)

quest springmvc tab type elm utf servle err path 以下內容翻譯自:https://www.tutorialspoint.com/springmvc/springmvc_multiple_resolver_mapping.htm

Spring MVC框架下 將數據庫內容前臺頁面顯示完整版【獲取數據庫人員參與的事件列表】

XML 獲取 utf-8 字段 eas jsp r.java 增刪 otp 1.書寫jsp頁面包括要顯示的內容【people.jsp】 <!-- 此處包括三個方面內容: 1.包含 文本輸入框 查詢按鈕 查詢結果顯示位置 (p

Maven和Spring mvc下的頁面的跳轉與取值

servle 提交 輸入 接收 -m title style ofo pri (此處tomcat的端口設置為80) 例如:在testForm.jsp裏提交表單,在ok.jsp裏取值 testForm.jsp頁面代碼如下: <%@ page contentType="

Spring MVC筆記(四) 訪問靜態頁面

inpu web-inf bean ... 逗號 beans efi back 發送 本例通過<mvc:resources>標簽訪問一個靜態或動態頁面。 首先還是創建一個web工程,並引入相關jar包: 創建控制器類,WebController.java

Spring MVC 從 Controller向頁面傳值的方式

用戶 () 傳參數 control let att model enter 設定 Spring MVC 從 Controller向頁面傳值的方式 在實際開發中,Controller取得數據(可以在Controller中處理,當然也可以來源於業務邏輯層),傳給頁面,常用的方

Spring MVC 向前臺頁面傳值-ModelAndView

hello hash 實現類 spring div 結果 val 前臺 view ModelAndView   該對象中包含了一個model屬性和一個view屬性   model:其實是一個ModelMap類型。其實ModelMap是一個LinkedHashMap的子類  

Spring MVC報錯500: Circular view path [xxx]: would dispatch back to the current handler URL

描述 & 錯誤 響應碼500 Type: Exception Report Message: Circular view path [updateUserinfo]: would dispatch back to the current handler URL [/s

Spring MVC web 進行頁面傳值

當Controller元件處理後,需要向jsp傳值時,用下面方法: 1.直接使用HttpServletRequest和Session 2.使用ModeAndView物件 3.使用ModelMap(建模)引數物件 4.使用@ModelAttribute註解 直接使用HttpServ

Spring-MVC WEB進行頁面傳值(繼續上章)

8.使用RedirectView重定向 //8.使用RedirectView重定向 @RequestMapping("/test10.do") public ModelAndView test10(User user) { if(user.getUserName().equ