thymeleaf文本處理

文本處理

顯示文本是網頁開發的最基本需求,另外,國際化的程序當今也是至關必要的。這些問題,thymeleaf均可以輕鬆解決。html

th:text標籤屬性

這個屬性的基本做用就是顯示文本,它的值能夠既能夠從thymeleaf上下文獲取,也能夠從外部文件獲取,甚至還可使用自定義的方式獲取,例如從數據庫獲取。web

不過,這些功能須要配合其餘表達式工具使用。那就是${}#{}操做符。數據庫

要注意的是,th:text中必須是合法的表達式,若是要th:text顯示純文本,則這些文本須要使用單引號括起來。不過,下列狀況下能夠不用寫單引號:編程

文本中只包含字母(A~Z和a~z),數字(0~9),中括號([]),點符號(.),連字符(-),和下橫線(_),可是不容許空格,逗號等。瀏覽器

${variable}和#{message}

這兩個操做符是thymeleaf提供的其中兩個表達式操做符,還有處理其餘內容的操做符例如:連接@{link}、碎片~{fragment}等。服務器

${variable}表達式

在前面的文章中已經使用過${}操做符,它的做用是從thymeleaf上下文獲取指定變量的值。例如:session

<h3 th:text="${welcome}">這是歡迎問候</h3>

若是當前上下文存在一個welcome變量的話,就顯示這個值,不然顯示默認的內容:這是歡迎問候app

${}的預約義變量

thymeleaf提供了一些預約義變量param、session和application,使用${}能夠方便地獲取這些變量的值:編程語言

  • 獲取當前名稱爲x的請求參數:${param.x}
  • 獲取當前session中名稱爲x的屬性:${session.x}
  • 獲取當前ServletContext中名稱爲x的屬性:${application.x}

可見,若是變量是一個對象的話,${}還能夠經過點語法獲取對象的屬性值。若是要獲取的屬性是一個私有字段,則它必須提供一個get方法,不然屬性值獲取失敗。函數

#{message}表達式

#{}表達式的做用是從外部文件獲取值,一般是key/value形式的property文件。它的強大在於經過簡單的操做,就能夠處理應用程序國際化的問題。還記得TemplateEngineprocess方法嗎?

WebContext context = new WebContext(request, response, getServletContext(), request.getLocale());
templateEngine.process("home", context, response.getWriter());

該方法接受一個WebContext類型參數,該對象的構造函數中第四個參數用於獲取用戶所在的語言區域。經過這個參數就能夠判斷程序應該使用什麼語言顯示給用戶。固然,第四個參數不是必須的,若是不使用第四個參數,那麼默認使用f服務器系統的語言區域,即Locale.getDefault()的值。

#{}的默認實現是:StandardMessageResolver,它是IMessageResolver接口的一個實現。

properties文件的匹配順序

/WEB-INF/templates/目錄下有以下文件,properties文件和home模板處於同級目錄:

假如咱們訪問的是home頁面,當前區域是zh_CN,那麼home_zh_CN文件被優先讀取,若是沒有home_zh_CN.properties文件,那麼就讀取home_zh.properties。若是目錄中只有home.properties,那麼就使用它做爲數據源。

也就是說,匹配順序以下:

  • home_zh_CN.properties
  • home_zh.properties
  • home.properties

使用#{}表達式操做符

它的使用和${}同樣簡單:

<h3 th:text="#{home.welcome}">這是歡迎問候</h3>

home_zh_CN.properties文件內容:

home.welcome=歡迎訪問咱們的網站

爲properties文件添加變量

不少時候,咱們但願properties文件中的內容能夠根據需求而變化,而不是一成不變的;thymeleaf能夠爲properties中的字符串添加變量佔位符,在運行時替換佔位符的值。

home_en.properties:

home.welcome=welcome {0}

{0}就是一個變量佔位符,該佔位符會在運行時被真正的變量值替換掉

home.html:

<span th:text="#{home.welcome (${user})}">這是歡迎問候</span>

${user}須要使用()括號括起來,不然會解析錯誤;多個變量可使用逗號分隔:

<span th:text="#{home.welcome (${user},${time})}">這是歡迎問候</span>

注意變量必定要放到括號裏面。

home.welcome=welcome {0} {1}

th:utext屬性

和th:text做用同樣,th:utext也是用來顯示文本的,惟一不一樣的是,th:utext能夠顯示未通過轉義的文本,而th:text顯示的全部文本都已經被轉義。

例如home.properties文件中有一個以下的鍵值對:

home.welcome=<strong>welcome</strong> to our website

若是想welcome在瀏覽器中顯示爲粗體,就必須使用th:utext;不能使用th:text緣由是它會轉義特殊字符串,形成的結果是文本值原樣輸出。

字符串相加

thymeleaf支持文本的相加,和常見的編程語言同樣,使用加號(+)運算符能夠對兩個字符串進行加操做,這些字符串能夠來自properties文件,也能夠是上下文中的變量。

例如:

<span th:text="'welcome: ' + ${user.firstName}">welcome</span>

注意靜態文本welcome: 須要使用單引號括起來,不然模板會解析失敗。

還有更簡單的操做,使用兩個(|)豎槓把須要鏈接的文本包起來

<span th:text="|welcome: ${user.firstName}|">welcome</span>

豎槓裏面的文本不須要使用單引號,更加簡介。不過,豎槓裏面只能包含${},*{}和#{}操做符。其餘一切的動態語法都不容許出如今豎槓裏面。

相關文章
相關標籤/搜索