Spring MVC 視圖技術(shù)(上)
1. 前言
本節(jié)課和大家一起聊聊 Spring MVC 支持的主流視圖技術(shù)。通過本章節(jié)內(nèi)容的學(xué)習(xí),你將對視圖解析器有更本質(zhì)的理解。也將了解到 Spring MVC 支持哪些主流視圖解析器。重點(diǎn)是要掌握各種視圖解析器的配置。
2. 視圖技術(shù)
最初的 WEB 應(yīng)用程序,數(shù)據(jù)直接綁定在 HTML 頁面中,頁面中的數(shù)據(jù)不能動(dòng)態(tài)更新。如果要修改頁面中的數(shù)據(jù),需要手工修改 HTML 頁面中的數(shù)據(jù),這種頁面叫靜態(tài)頁面。
所謂的動(dòng)態(tài)網(wǎng)頁指頁面中的數(shù)據(jù)能自動(dòng)更新,頁面中可以存在不同類型的變量,隨時(shí)根據(jù)數(shù)據(jù)庫中數(shù)據(jù)的變化自動(dòng)變化。
HTML 如同一面廣告墻,上面貼的什么廣告內(nèi)容,它是不知道的,如果要換廣告內(nèi)容,需要工作人員自己動(dòng)手。這就是靜態(tài)網(wǎng)頁,現(xiàn)在有很多電子廣告牌,廣告內(nèi)容可以自動(dòng)切換,相當(dāng)于動(dòng)態(tài)網(wǎng)頁。
HTML 并不支持變量,所以需要一種視圖技術(shù),讓 HTML 中支持變量。也可以說是模板技術(shù),在 HTML 中通過嵌入類似于 JAVA 的強(qiáng)邏輯性語言達(dá)到數(shù)據(jù)自動(dòng)更新的目的。
繼續(xù)講解之前,深入理解一下視圖技術(shù)的概念。
視圖技術(shù): 這是一個(gè)抽象概念,或者說是一個(gè)概括性概念。任何一款視圖技術(shù)產(chǎn)品,都應(yīng)該包括:
- 模板;
- 模板解析引擎。
2.1 模板
稱其為動(dòng)態(tài)頁面模板可能更準(zhǔn)確。模板中至少應(yīng)該包括 2 部分內(nèi)容:
-
HTML、CSS 等 : 為模板中的數(shù)據(jù)提供版式和樣式;
-
強(qiáng)邏輯性語言: 提供數(shù)據(jù)邏輯能力,可以自動(dòng)更新模板中的數(shù)據(jù)。
Tips: 不同視圖技術(shù)的模板可嵌入的強(qiáng)邏輯性語言不同。本文講的 JAVA 程序,這里的強(qiáng)邏輯性語言指的是 JAVA 。
每一種視圖技術(shù)都會(huì)有自己的模板語法,開發(fā)者編寫模板時(shí)必須遵循模板語法。
2.2 模板解析引擎
視圖技術(shù)提供的動(dòng)態(tài)頁面模板不能直接發(fā)送給瀏覽器,瀏覽器又不是 JAVA 語言解釋器。動(dòng)態(tài)頁面模板需要被渲染成純 HTML 靜態(tài)頁面后才能發(fā)送給瀏覽器,這個(gè)渲染過程就是依靠模板解析引擎實(shí)現(xiàn)。
3. 主流視圖技術(shù)
Spring MVC 可使用的視圖技術(shù)較多,本課程主要聊聊 3 大主流視圖技術(shù)。
- Jsp: 這個(gè)很老牌,相信大家一定知道。Jsp 模板是 J2EE 官方指定的,所以其模板引擎可由遵循 J2EE 規(guī)范的服務(wù)器實(shí)現(xiàn),如 tomcat ;
- Freemarker: Freemarker 曾經(jīng)因?yàn)?Struts MVC 風(fēng)靡一時(shí),當(dāng)然,現(xiàn)在也很受歡迎。其模板需要自己提供的模板引擎解析;
- Thymeleaf: Thymeleaf 應(yīng)該算是后起之秀,因?yàn)槭呛笃鹬?,?huì)改善前輩的諸多不足,更適應(yīng)現(xiàn)代化開發(fā)理念和習(xí)慣。
Tips: 在 Servlet 的開發(fā)環(huán)境中,除了 JSP 外,其它的視圖技術(shù)都有自己的模板引擎,可以說它們都是輕量級的視圖解析器,可以在需要地方獨(dú)立運(yùn)行。
既然有 3 種主流視圖技術(shù),繞不過去的當(dāng)然要比較一下。
首先要表態(tài)的是它們各有千秋,比較不是分輸贏,而是讓大家更好理解后在不同的場景下做出最合理的選擇。最好的比較方式就是用起來。
WEB 應(yīng)用程序中,動(dòng)態(tài)頁面模板中的數(shù)據(jù)主要來自于不同的作用域,作用域中的數(shù)據(jù)如何來,就不需要?jiǎng)討B(tài)模板操心。所以,對頁面模板的要求就是要簡潔、方便。
Jsp 的模板很有天然優(yōu)勢,但其頁面元素較多,且有些功能的實(shí)現(xiàn)需要借助于 JSTL (標(biāo)準(zhǔn)標(biāo)簽庫)實(shí)現(xiàn)。且依賴于服務(wù)器容器,并不是很靈活。相信大家對 JSP 了解的也較多,這里就不再多說。
Spring MVC 默認(rèn)提供的 InternalResourceViewResolver 視圖解析器,就是針對 JSP 的。因?yàn)?JSP 的解析是由服務(wù)器完成的,在 Spring MVC 中配置時(shí),只需要指定視圖位置即可。
但是對于其它的視圖技術(shù)而言,除了要指定視圖的位置,還需要提供視圖解析引擎的實(shí)現(xiàn)。
3.1. Freemarker 視圖技術(shù)
本小節(jié)和大家一起聊聊在 Spring MVC 中如何使用 Freemarker 視圖技術(shù) 。
- 打開 pom.xml 文件,添加 Freemarker 依賴包;
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.13.RELEASE</version>
</dependency>
- 新建 spring-freemarker.xml 文件,放在 src/main/resources 目錄中。新建 freemarker.properties 文件放在 src/main/resources /conf 目錄中;
Tips: Spring MVC 支持 JAVA 、XML 配置,也支持兩者混合使用。Freemarker 的相關(guān)配置這里使用 XML 方法。
- 打開 WebConfig 文件,在類名前加上 @ImportResource(value = {“classpath:spring-freemarker.xml”}) 這樣配置類和 XML 文件就可以混合使用;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.mk.web.action" })
@ImportResource(value = {"classpath:spring-freemarker.xml"})
public class WebConfig implements WebMvcConfigurer {
//……
}
- 在 spring-freemarker.xml 中配置 3 個(gè) Bean。
<bean id="freemarkerConfiguration"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:conf/freemarker.properties" />
</bean>
<!-- freeMarker 的模板路徑 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="freemarkerSettings" ref="freemarkerConfiguration" />
<property name="templateLoaderPath">
<value>/WEB-INF/ftl/</value>
</property>
</bean>
<!-- freeMarker 視圖解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<property name="contentType" value="text/html; charset=utf-8" />
<property name="cache" value="true" />
</bean>
- freemarker.properties 文件內(nèi)容。用來設(shè)置 Freemarker 的工作環(huán)境;
#設(shè)置標(biāo)簽類型
tag_syntax=auto_detect
#模版緩存時(shí)間,單位:秒
template_update_delay=0
default_encoding=UTF-8
output_encoding=UTF-8
locale=zh_CN
#設(shè)置數(shù)字格式 ,防止出現(xiàn) 000.00
number_format=\#
#變量為空時(shí),不會(huì)報(bào)錯(cuò)
classic_compatible=true
-
在項(xiàng)目的 WEB-INF 目錄下新建用來存放 freemarker 模板文件的 ftl 目錄;
-
編寫 FreemarkerAction 控制器;
@Controller
public class FreemarkerAction {
@RequestMapping("/fm")
public String sayHello(ModelMap map){
map.put("name", "mk");
return "mk.ftl";
}
}
- 在 WEB-INF/ftl 下創(chuàng)建一個(gè)名為 mk.ftl 的模板文件;
<pre name="code" class="java">
<html>
<body>
<h1>holle world ${name}</h1><br/>
</body>
</html>
</pre>
Tips: 每一種視圖技術(shù)都會(huì)提供自己的模板語法。FreeMarker 更多的語法元素大家可查閱 FreeMarker 官方網(wǎng)站 http://freemarker.foofun.cn/toc.html 。
本文僅介紹在 Spring MVC 中如何使用 FreeMarker 。
- 打開瀏覽器,地址欄中輸入 http://localhost:8888/sm-demo/fm 。瀏覽器中將顯示;
4. 小結(jié)
本章節(jié)和大家一起講解視圖技術(shù)。
每一種視圖技術(shù)都會(huì)有自己的模板語法,且模板需要經(jīng)過模板引擎解析后才能輸送給瀏覽器。
Spring MVC 支持多種視圖技術(shù),本章節(jié)向大家介紹了在 Spring MVC 中如何使用 FreeMarker 視圖。一般在配置過程中需要指定模板文件的位置,以及指定具體的模板引擎實(shí)現(xiàn)。
在本章節(jié)內(nèi)容環(huán)節(jié)中也告訴了大家在 Spring MVC 中如何混合使用 JAVA 和 XML 兩種配置方案。