我们已经知道了两种语法
<p th:utext="#{home.welcome}">Welcome to our grocery store!p>
<p>Today is: <span th:text="${today}">13 february 2011span>p>
但是还有很多语法我们不知道,接下来我们快速的介绍更多的表达式语法:
简单表示式:
文字类型:
条件语句:
所有上面算法都可以随意组合和嵌套:
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
我们之前的例子是这样的
<p th:utext="#{home.welcome}">Welcome to our grocery store!p>
home.welcome=欢迎光临本店,
但是有的时候我们需要在消息中增加变量,比如客人的名字怎么办?比如达到如下效果
<p>¡Bienvenido a nuestra tienda de comestibles, 木鱼!p>
这样办:
home.welcome=欢迎光临本店, {0}!
th:utext="#{home.welcome(${session.user.name})}">
¡Bienvenido a nuestra tienda de comestibles, 木鱼!
</p>
在这里,参数可以是字符型也可是树数值型或者日期型。当然如果我们需要多个参数的话,类推即可,并且我们也可以内嵌表达式替换字符串,比如:
"#{${welcomeMsgKey}(${session.user.name})}">
Welcome to our grocery store, 木鱼!
</p>
变量表达式可以解析OGNL语法。详尽的语法信息可以访问官网:
http://commons.apache.org/ognl/
OGNL有以下基本内置对象
Established locale country: <span th:text="${#locale.country}">USspan>.
除了这些基本的对象,Thymeleaf将为我们提供一套实用的对象。来帮助我们我们执行常见的任务。
现在我们知道了Thymeleaf提供的工具类和表达式的语法,那么我们来重新格式化首页的日期吧,首先在我们的controller层中吧字符型日期替换成对象
SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy");
Calendar cal = Calendar.getInstance();
WebContext ctx = new WebContext(request, servletContext, request.getLocale());
ctx.setVariable("today", dateFormat.format(cal.getTime()));
templateEngine.process("home", ctx, response.getWriter());
替换成
WebContext ctx = new WebContext(request, servletContext, request.getLocale());
ctx.setVariable("today", Calendar.getInstance());
templateEngine.process("home", ctx, response.getWriter());
然后是模板
<p>
Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011span>
p>
变量不仅能用在#{ }上,还能用在* { }上。两者的区别在于* { }上的的变量首先是选定对象的变量。如果不选定对象,那么是整个上下文环境中的变量和#{ }相同
选择对象用什么呢?th:object标签属性。我们使用它在我们的用户配置文件(userprofile.html)页面:
${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="*{lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>
div>
这个用法等同于
<div>
<p>Name: <span th:text="${session.user.firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="${session.user.nationality}">Saturnspan>.p>
div>
当然,两种用法可以混合。
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>
div>
如果一个对象已经被选择,即th:object=”${session.user}”。那么我们也使用#object对象去引用。
<div th:object="${session.user}">
<p>Name: <span th:text="${#object.firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>
div>
就像之前说的,如果没有对象被选中,那么#{ }和* { }表达式的意义是相同的。
<div>
<p>Name: <span th:text="*{session.user.name}">Sebastianspan>.p>
<p>Surname: <span th:text="*{session.user.surname}">Pepperspan>.p>
<p>Nationality: <span th:text="*{session.user.nationality}">Saturnspan>.p>
div>