原文:https://www.cnblogs.com/lyj-gyq/p/8963885.htmlcss
Spring自帶了13個視圖解析器,可以將邏輯視圖名轉換爲物理實現html
首先將會介紹 InternalResourceViewResolver,這個視圖解析器通常會用來 解析JSP視圖。java
1. Spring提供了兩種支持JSP視圖的方式: web
考慮一個簡單的場景,假設邏輯視圖名爲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 中的任何佔位符,那麼這個參數將會做爲查詢參數。