概述
Thymeleaf提供了一組Spring集成,使您可以將其用作Spring MVC應(yīng)用程序中JSP的全功能替代品。
這些集成將使您能夠:
- @Controller像使用JSP一樣,將Spring MVC 對(duì)象中的映射方法轉(zhuǎn)發(fā)到Thymeleaf管理的模板。
- 在模板中使用Spring表達(dá)式語(yǔ)言(Spring EL)代替OGNL。
- 在與表單支持Bean和結(jié)果綁定完全集成的模板中創(chuàng)建表單,包括使用屬性編輯器,轉(zhuǎn)換服務(wù)和驗(yàn)證錯(cuò)誤處理。
- 顯示Spring管理的消息文件中的國(guó)際化消息(通過(guò)常規(guī)MessageSource對(duì)象)。
- 使用Spring自己的資源解析機(jī)制解析您的模板。
thymeleaf自己也做了spring的集成,所以我們并不需要做太多的配置,就可以達(dá)到我們想要的結(jié)果。thymeleaf提供了兩種集成方法:①、注解配置,也就是java代碼,②、xml文件配配置,本文主要介紹第二種xml配置。
你能get到的知識(shí)點(diǎn):
1、springmvc整合thymeleaf
2、spring提供的三種model的使用
3、解決html前端thymeleaf不生效問(wèn)題(見(jiàn)問(wèn)題1)
4、解決html前端顯示亂碼問(wèn)題(見(jiàn)問(wèn)題2)
springmvc整合thymeleaf
一:加入依賴
在springmvc里面,除了要加入 thymeleaf
的主依賴之外,還需要 thymeleaf-spring4
,否則會(huì)報(bào) org.thymeleaf.spring4.view.ThymeleafViewResolver
,找不到thymeleaf解析器,所以 thymeleaf-spring4
也是必不可少的。
Thymeleaf具有針對(duì)Spring Framework 3.x和4.x的集成,由兩個(gè)獨(dú)立的庫(kù)分別稱為thymeleaf-spring3和提供thymeleaf-spring4。這些庫(kù)打包在單獨(dú)的.jar文件(thymeleaf-spring3-{version}.jar和thymeleaf-spring4-{version}.jar)中,需要添加到類路徑中,以便在應(yīng)用程序中使用Thymeleaf的Spring集成
<!-- thymeleaf-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring4</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
復(fù)制
在springmvc配置文件中配置thymeleaf解析器,官方文檔中Thymeleaf提供了上述兩個(gè)接口的實(shí)現(xiàn):
org.thymeleaf.spring4.view.ThymeleafView
org.thymeleaf.spring4.view.ThymeleafViewResolver
復(fù)制
不過(guò)現(xiàn)在都已經(jīng)被 org.thymeleaf.spring4.view.ThymeleafViewResolver
所代替,至于以上配置是否還能夠生效,就要靠你來(lái)試試了。
<!-- thymeleaf 模板解析器 -->
<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML" />
<property name="cacheable" value="false" />
<property name="characterEncoding" value="UTF-8"/>
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
</bean>
<!-- 視圖解析器-->
<bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
<property name="templateEngine" ref="templateEngine" />
<property name="characterEncoding" value="UTF-8"/>
</bean>
復(fù)制
ViewResolvers是負(fù)責(zé)獲取特定操作和語(yǔ)言環(huán)境的View對(duì)象的對(duì)象。通常,控制器要求ViewResolvers轉(zhuǎn)發(fā)到具有特定名稱的視圖(由controller方法返回的String),然后應(yīng)用程序中的所有視圖解析器將按有序鏈執(zhí)行,直到其中一個(gè)能夠解析該視圖為止。如果返回了View對(duì)象,并且將控件傳遞給該對(duì)象以呈現(xiàn)HTML。
注:值得注意的是,如果自己設(shè)置了spring的視圖解析器,需要將其注釋掉,否則thymeleaf解析器可能不會(huì)生效,我就是因?yàn)檫@個(gè)調(diào)試了好久,最后才發(fā)現(xiàn)這個(gè)問(wèn)題。
<!-- 配置視圖解析器 prefix:前綴, suffix:后綴 使用thymeleaf需要將其注釋掉-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".html"/>
</bean>
復(fù)制
三
:編寫(xiě)控制器
需要從控制層傳數(shù)據(jù)到視圖時(shí),我們就會(huì)使用model,常用的三種model就是:Model、ModelMap、ModelAndView。使用這三種model時(shí),spring框架自動(dòng)創(chuàng)建實(shí)例并作為controller的入?yún)?,用戶無(wú)需自己創(chuàng)建
1、使用Model
/**
* 在Model里存入一個(gè)用戶信息
* @return hello頁(yè)面
*/
@GetMapping("returnModelAndView")
public String returnModelAndView(Model model){
model.addAttribute("userInfo",new UserInfo("lomtom","123",new Address("湖南","邵陽(yáng)")));
return "hello";
}
復(fù)制
Model是一個(gè)接口, Model源碼:
public interface Model {
Model addAttribute(String var1, Object var2);
Model addAttribute(Object var1);
Model addAllAttributes(Collection<?> var1);
Model addAllAttributes(Map<String, ?> var1);
Model mergeAttributes(Map<String, ?> var1);
boolean containsAttribute(String var1);
Map<String, Object> asMap();
}
復(fù)制
2、使用ModelMap
ModelMap繼承LinkedHashMap
ModelMap源碼:
public class ModelMap extends LinkedHashMap<String, Object> {
public ModelMap() {
}
public ModelMap(String attributeName, Object attributeValue) {
this.addAttribute(attributeName, attributeValue);
}
public ModelMap(Object attributeValue) {
this.addAttribute(attributeValue);
}
public ModelMap addAttribute(String attributeName, Object attributeValue) {
Assert.notNull(attributeName, "Model attribute name must not be null");
this.put(attributeName, attributeValue);
return this;
}
public ModelMap addAttribute(Object attributeValue) {
Assert.notNull(attributeValue, "Model object must not be null");
return attributeValue instanceof Collection && ((Collection)attributeValue).isEmpty() ? this : this.addAttribute(Conventions.getVariableName(attributeValue), attributeValue);
}
public ModelMap addAllAttributes(Collection<?> attributeValues) {
if (attributeValues != null) {
Iterator var2 = attributeValues.iterator();
while(var2.hasNext()) {
Object attributeValue = var2.next();
this.addAttribute(attributeValue);
}
}
return this;
}
public ModelMap addAllAttributes(Map<String, ?> attributes) {
if (attributes != null) {
this.putAll(attributes);
}
return this;
}
public ModelMap mergeAttributes(Map<String, ?> attributes) {
if (attributes != null) {
Iterator var2 = attributes.entrySet().iterator();
while(var2.hasNext()) {
Entry<String, ?> entry = (Entry)var2.next();
String key = (String)entry.getKey();
if (!this.containsKey(key)) {
this.put(key, entry.getValue());
}
}
}
return this;
}
public boolean containsAttribute(String attributeName) {
return this.containsKey(attributeName);
}
}
復(fù)制
3、使用ModelAndView
/**
* 在ModelAndView里存入一個(gè)用戶信息
* @return ModelAndView
*/
@GetMapping("returnModelAndView")
public ModelAndView returnModelAndView(ModelAndView modelAndView){
modelAndView.setViewName("hello");
modelAndView.addObject("userInfo",new UserInfo("lomtom","123",new Address("湖南","邵陽(yáng)")));
return modelAndView;
}
復(fù)制
ModelAndView顧名思義就是模型和試圖的結(jié)合。ModelAndView源碼:
public class ModelAndView {
private Object view;
private ModelMap model;
private HttpStatus status;
private boolean cleared = false;
......
}
復(fù)制
四:編寫(xiě)html
首先,寫(xiě)一個(gè)鏈接,請(qǐng)求 returnModelAndView
請(qǐng)求。
<a href="returnModelAndView">ModelAndView</a>
復(fù)制
然后,寫(xiě)hello.html頁(yè)面用于驗(yàn)證
<h2>你好啊,你成功了</h2>
<p th:text="${userInfo.userName}+'來(lái)自'+${userInfo.address.province}+${userInfo.address.city}"></p>
復(fù)制
五:結(jié)果
六:記錄我遇到的問(wèn)題
問(wèn)題1:配置好一切后,thymeleaf無(wú)法解析,所有關(guān)于thymeleaf的顯示都無(wú)法生效。解決:由于我配置了spring的視圖解析,所以導(dǎo)致thymeleaf的試圖解析無(wú)法生效,所以去掉spring的視圖解析。
thmelaf介紹Springmvc的視圖解析:快速瀏覽其屬性足以了解其配置方式:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-484075.html
- viewClass建立View實(shí)例的類。對(duì)于JSP解析器,這是必需的,但是當(dāng)我們與Thymeleaf合作時(shí),根本不需要。
- prefix與suffixThymeleaf的TemplateResolver對(duì)象中相同名稱的屬性的工作方式相似。
- order 確定在鏈中查詢ViewResolver的順序。
- viewNames 允許使用此ViewResolver解析視圖名稱(帶通配符)。
問(wèn)題2:前端顯示亂碼,具體表現(xiàn)為后臺(tái)傳入的不亂碼,但是html中原本存在的亂碼。解決:在試圖解析器和模板解析器中加入?yún)?shù):<propertyname="characterEncoding"value="UTF-8"/>
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-484075.html
到了這里,關(guān)于springmvc整合thymeleaf的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!