文本處理
顯示文本是網頁開發的最基本需求,另外,國際化的程序當今也是相當必要的。這些問題,thymeleaf都可以輕松解決。
th:text標簽屬性
這個屬性的基本作用就是顯示文本,它的值可以既可以從thymeleaf上下文獲取,也可以從外部文件獲取,甚至還可以使用自定義的方式獲取,例如從數據庫獲取。
不過,這些功能需要配合其他表達式工具使用。那就是${}
和#{}
操作符。
要注意的是,th:text中必須是合法的表達式,如果要th:text顯示純文本,則這些文本需要使用單引號括起來。不過,下列情況下可以不用寫單引號:
文本中只包含字母(A~Z和a~z),數字(0~9),中括號([]),點符號(.),連字符(-),和下橫線(_),但是不允許空格,逗號等。
${variable}和#{message}
這兩個操作符是thymeleaf提供的其中兩個表達式操作符,還有處理其他內容的操作符例如:鏈接@{link}、碎片~{fragment}等。
${variable}表達式
在前面的文章中已經使用過${}操作符,它的作用是從thymeleaf上下文獲取指定變量的值。例如:
<h3 th:text="${welcome}">這是歡迎問候</h3>
如果當前上下文存在一個welcome變量的話,就顯示這個值,否則顯示默認的內容:這是歡迎問候
。
${}的預定義變量
thymeleaf提供了一些預定義變量param、session和application,使用${}可以方便地獲取這些變量的值:
- 獲取當前名稱為x的請求參數:${param.x}
- 獲取當前session中名稱為x的屬性:${session.x}
- 獲取當前ServletContext中名稱為x的屬性:${application.x}
可見,如果變量是一個對象的話,${}還可以通過點語法獲取對象的屬性值。如果要獲取的屬性是一個私有字段,則它必須提供一個get方法,否則屬性值獲取失敗。
#{message}表達式
#{}表達式的作用是從外部文件獲取值,通常是key/value形式的property文件。它的強大在於通過簡單的操作,就可以處理應用程序國際化的問題。還記得TemplateEngine
的process
方法嗎?
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>
豎杠里面的文本不需要使用單引號,更加簡介。不過,豎杠里面只能包含${},*{}和#{}操作符。其他一切的動態語法都不允許出現在豎杠里面。