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>

竖杠里面的文本不须要使用单引号,更加简介。不过,竖杠里面只能包含${},*{}和#{}操做符。其余一切的动态语法都不容许出如今竖杠里面。