spring 視圖解析 ——InternalResourceViewResolver

原文:https://www.cnblogs.com/lyj-gyq/p/8963885.htmlcss

Spring自帶了13個視圖解析器,可以將邏輯視圖名轉換爲物理實現html

首先將會介紹 InternalResourceViewResolver,這個視圖解析器通常會用來 解析JSP視圖。java

 1.  Spring提供了兩種支持JSP視圖的方式: web

  • InternalResourceViewResolver會將視圖名解析爲JSP文 件。另外,若是在你的JSP頁面中使用了JSP標準標籤庫 (JavaServer Pages Standard Tag Library,JSTL)的 話,InternalResourceViewResolver可以將視圖名解析爲 JstlView形式的JSP文件,從而將JSTL本地化和資源bundle變量暴 露給JSTL的格式化(formatting)和信息(message)標籤。
  • Spring提供了兩個JSP標籤庫,一個用於表單到模型的綁定,另外一 個提供了通用的工具類特性。

考慮一個簡單的場景,假設邏輯視圖名爲home。通用的 實踐是將JSP文件放到Web應用的WEB-INF目錄下,防止對它的直接 訪問。若是咱們將全部的JSP文件都放在「/WEB-INF/views/」目錄下, 而且home頁的JSP名爲home.jsp,那麼咱們能夠肯定物理視圖的路徑 就是邏輯視圖名home再加上「/WEB-INF/views/」前綴和「.jsp」後綴。以下圖所示:spring

 

當使用@Bean註解的時候,咱們能夠按照以下的方式配 置Internal-ResourceView Resolver,使其在解析視圖時,遵 循上述的約定。服務器

複製代碼
1     @Bean // 配置JSP視圖解析器
2     public ViewResolver viewResolver() {
3         InternalResourceViewResolver resolver = new InternalResourceViewResolver();
4         resolver.setPrefix("/WEB-INF/views/");
5         resolver.setSuffix(".jsp");
6         resolver.setExposeContextBeansAsAttributes(true);
7         return resolver;
8     }
複製代碼

2.  解析JSTL視圖app

若是在JSP中使用JSTL標籤來處理格式化和信息的話,那麼就會讓InternalResourceViewResolver將視圖解析爲JstlView。 JSTL的格式化標籤須要一個Locale對象,以便於恰當地格式化地域 相關的值,如日期和貨幣。信息標籤能夠藉助Spring的信息資源和 Locale,從而選擇適當的信息渲染到HTML之中。經過解析 JstlView,JSTL可以得到Locale對象以及Spring中配置的信息資 源。 jsp

若是想讓InternalResourceViewResolver將視圖解析 爲JstlView,而不是InternalResourceView的話,那麼咱們只需設置它的viewClass屬性便可:工具

複製代碼
1     @Bean // 配置JSP視圖解析器
2     public ViewResolver viewResolver() {
3         InternalResourceViewResolver resolver = new InternalResourceViewResolver();
4         resolver.setPrefix("/WEB-INF/views/");
5         resolver.setSuffix(".jsp");
6         resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
7         resolver.setExposeContextBeansAsAttributes(true);
8         return resolver;
9     }
複製代碼

3.  Spring的JSP庫 ui

Spring提供了兩個JSP標籤庫,用來幫助定義 Spring MVC Web的視圖。其中一個標籤庫會用來渲染HTML表單標 籤,這些標籤能夠綁定model中的某個屬性。另一個標籤庫包含了 一些工具類標籤

3.1  將表單綁定到模型上

Spring的表單綁定JSP標籤庫包含了14個標籤,它們中的大多數都用來 渲染HTML中的表單標籤。可是,它們與原生HTML標籤的區別在於 它們會綁定模型中的一個對象,可以根據模型中對象的屬性填充值。 標籤庫中還包含了一個爲用戶展示錯誤的標籤,它會將錯誤信息渲染 到最終的HTML之中。 

爲了使用表單綁定庫,須要在JSP頁面中對其進行聲明:

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

須要注意,將前綴指定爲「sf」,但一般也可能使用「form」前綴。 在聲明完表單綁定標籤庫以後,就可使用14個相關的標籤了。以下圖所示:

重寫registerForm.jsp,程序以下:

複製代碼
 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7 
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11     <base href="<%=basePath%>">
12     
13     <title>註冊</title>
14     
15     <meta http-equiv="pragma" content="no-cache">
16     <meta http-equiv="cache-control" content="no-cache">
17     <meta http-equiv="expires" content="0">    
18     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
19     <meta http-equiv="description" content="This is my page">
20     <!--
21     <link rel="stylesheet" type="text/css" href="styles.css">
22     -->
23 
24   </head>
25   
26   <body>
27         <sf:form method="POST" modelAttribute="spitter">
28             First Name:<sf:input path="firstName"/>
29             Last Name:<sf:input path="lastName"/>
30             Email:<sf:input path="email"/>
31             UserName:<sf:input path="username"/>
32             Password:<sf:password path="password"/>
33             <input type="submit" value="註冊">
34         </sf:form>
35   </body>
36 </html>
複製代碼

<sf:form>會渲染會一個HTML <form>標籤,但它也會經過 commandName屬性構建針對某個模型對象的上下文信息。在其餘的 表單綁定標籤中,會引用這個模型對象的屬性。 

將commandName屬性設置爲spitter。因 此,在模型中必需要有一個key爲spitter的對象,不然的話,表單 不能正常渲染(會出現JSP錯誤)。這意味着須要修改一 下SpitterController,以確保模型中存在以spitter爲key的 Spitter對象:

1     @RequestMapping(value = "/register", method = RequestMethod.GET) // 處理對「/spitter/register」的GET請求
2     public String showRegistrationForm(Model model) {
3         model.addAttribute(new Spitter());
4         return "registerForm";
5     }

修改後的showRegistrationForm()方法中,新增了一 個Spitter實例到模型中。

3.2  展示錯誤

相對於標準的HTML標籤,使用Spring的表單綁定標籤可以帶來必定 的功能提高,在校驗失敗後,表單中會預先填充以前輸入的值。但 是,這依然沒有告訴用戶錯在什麼地方。爲了指導用戶矯正錯誤,須要使用<sf:errors>。 

若是存在校驗錯誤的話,請求中會包含錯誤的詳細信息,這些信息是 與模型數據放到一塊兒的。咱們所須要作的就是到模型中將這些數據抽 取出來,並展示給用戶。<sf:errors>可以讓這項任務變得很簡 單。 

1 <sf:errors path="firstName">
2             <span id="firstName.errors">必須大於2個字符</span>
3         </sf:errors>

將<sf:errors>用到First Name輸入域的場景,它的path屬性設置成了firstName,也就是指定了要顯示Spitter 模型對象中哪一個屬性的錯誤。若是firstName屬性沒有錯誤的話, 那麼<sf:errors>不會渲染任何內容。但若是有校驗錯誤的話,那 麼它將會在一個HTML <span>標籤中顯示錯誤信息。 

4.  Spring通用的標籤庫

除了表單綁定標籤庫以外,Spring還提供了更爲通用的JSP標籤庫。要使用Spring通用的標籤庫,咱們必需要在頁面上對其進行聲明:

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

標籤庫聲明以後,咱們就可使用下表中的十個JSP標籤了。

 

4.1  展示國際化信息

對於渲染文原本說,是很好的方案,文本可以位於一個或多個屬性文 件中。藉助<s:message>,咱們能夠將硬編碼的歡迎信息替換爲如 下的形式:

按照這裏的方式,<s:message>將會根據key爲spittr.welcome 的信息源來渲染文本。所以,若是咱們但願<s:message>可以正常 完成任務的話,就須要配置一個這樣的信息源。 

Spring有多個信息源的類,它們都實現了MessageSource接口。在 這些類中,更爲常見和有用的 是ResourceBundleMessageSource。它會從一個屬性文件中加 載信息,這個屬性文件的名稱是根據基礎名稱(base name)衍生而來 的。以下的@Bean方法配置了 ResourceBundleMessageSource:

1     @Bean
2     public MessageSource messageSource() {
3         ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
4         messageSource.setBasename("message");
5         return messageSource;
6     }

在這個bean聲明中,核心在於設置basename屬性。你能夠將其設置 爲任意的值,在這裏,我將其設置爲message。將其設置 爲message後,ResourceBundle-MessageSource就會試圖在根 路徑的屬性文件中解析信息,這些屬性文件的名稱是根據這個基礎名 稱衍生獲得的。

另外的可選方案是使 用ReloadableResourceBundleMessageSource,它的工做方 式與ResourceBundleMessageSource很是相似,可是它可以重 新加載信息屬性,而沒必要從新編譯或重啓應用。以下是配 置ReloadableResourceBundle-MessageSource的樣例:

複製代碼
1     @Bean
2     public MessageSource messageSource2() {
3         ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
4         messageSource.setBasename("file:///etc/spittr/message");
5         messageSource.setCacheSeconds(10);
6         return messageSource;
7     }
複製代碼

這裏的關鍵區別在於basename屬性設置爲在應用的外部查找(而不 是像ResourceBundleMessageSource那樣在類路徑下查 找)。basename屬性能夠設置爲在類路徑下(以「classpath:」做 爲前綴)、文件系統中(以「file:」做爲前綴)或Web應用的根路徑 下(沒有前綴)查找屬性。在這裏,我將其配置爲在服務器文件系統 的「/etc/spittr」目錄下的屬性文件中查找信息,而且基礎的文件名 爲「message」。

這兩個bean放在WebConfig.java中

建立屬性文件:message.properties 位置:src下,類的根目錄

1 spittr.welcome=Welcome to Spittr\! 

4.2  建立URL 

<s:url>是一個很小的標籤。它主要的任務就是建立URL,而後將其 賦值給一個變量或者渲染到響應中。它是JSTL中<c:url>標籤的替 代者,可是它具有幾項特殊的技巧。

按照其最簡單的形式,<s:url>會接受一個相對於Servlet上下文的 URL,並在渲染的時候,預先添加上Servlet上下文路徑。例如,考慮 以下<s:url>的基本用法:

若是應用的Servlet上下文名爲spittr,那麼在響應中將會渲染以下 的HTML:

這樣,在建立URL的時候,就沒必要再擔憂Servlet上下文路徑是什 麼了,<s:url>將會負責這件事。 

另外,還可使用<s:url>建立URL,並將其賦值給一個變量供 模板在稍後使用:

默認狀況下,URL是在頁面做用域內建立的。可是經過設置scope屬 性,咱們可讓<s:url>在應用做用域內、會話做用域內或請求做 用域內建立URL:

若是但願在URL上添加參數的話,那麼可使用<s:param>標 籤。好比,以下的<s:url>使用兩個內嵌的<s:param>標籤,來設 置「/spittles」的max和count參數:

重點:建立帶有路徑 (path)參數的URL

當href屬性中的佔位符匹配<s:param>中所指定的參數時,這個參 數將會插入到佔位符的位置中。若是<s:param>參數沒法匹配href 中的任何佔位符,那麼這個參數將會做爲查詢參數。 

相關文章
相關標籤/搜索