前面章节我们已经提到,${...} 表达式实际上是在当前上下文中包含的变量映射上执行 OGNL 表达式。
从 OGNL 的语法中,我们知道:
<p> Today is: <span th:text="${today}">13 february 2011</span>. </p>
${today} 实际上相当于:
ctx.getVariable("today");
但是 OGNL 表达式允许我们创建更强大的表达式,就像这样:
<p th:utext="#{home.welcome(${session.user.name})}"> Welcome to our grocery store, Sebastian Pepper! </p>
注意:上面代码片段中,#{} 是国际表达式,${} 是变量表达式,该变量表达式将从 session 上下文获取 user 变量保存的对象的 name 属性的值。
当然,你也可以通过执行以下操作获取用户名:
((User) ctx.getVariable("session").get("user")).getName();
但 getter 方法导航只是 OGNL 的功能之一,下面是更多 OGNL 用法:
/* * 使用点(.)访问属性。相当于调用属性 getter。 */ ${person.father.name} /* * 对属性的访问也可以通过使用括号([]),并将属性的名称写成一个变量或单引号之间来实现。 */ ${person['father']['name']} /* * 如果该对象是一个 map,点和括号的语法都等同于对其执行 get(...) 方法调用。 */ ${countriesByCode.ES} ${personsByName['Stephen Zucchini'].age} /* * 对数组或集合的索引访问也是用括号进行的,写索引时不加引号 */ ${personsArray[0].name} /* * 方法可以被调用,甚至可以带参数。 */ ${person.createCompleteName()} ${person.createCompleteNameWithSeparator('-')}
在计算上下文变量上的 OGNL 表达式时,Thymeleaf 的一些内置对象可用于 OGNL 表达式以获得更高的灵活性。这些内置对象将以 # 符号开始引用(根据 OGNL 标准):
#ctx:上下文对象
#vars:上下文变量
#locale:上下文的语言环境
#request:(仅在Web上下文中)HttpServletRequest 对象
#response:(仅在Web上下文中)HttpServletResponse 对象
#session:(仅在Web上下文中)HttpSession 对象
#servletContext:(仅在Web上下文中)ServletContext 对象
所以我们可以这样做:
Established locale country: <span th:text="${#locale.country}">US</span>.
除了上面介绍的基础对象,Thymeleaf 为我们提供了一组实用对象,帮助我们在表达中执行常见的任务。
#execInfo:关于正在处理的模板的信息。
#messages:在变量表达式中获取外部化信息的方法,与使用 #{...} 语法获取信息的方式相同。
#uris:用于转义 URLs/URI 部分的方法。
#conversions:执行配置的转换服务的方法(如果有的话)。
#dates:java.util.Date 对象的方法,如:格式化、组件提取等。
#calendars:类似于 #dates,但是针对 java.util.Calendar 对象。
#numbers:用于格式化数字对象的方法。
#strings:字符串对象的方法,如:contains, startsWith, prepending/appending 等等。
#objects:一般对象的方法。
#bools:布尔运算的方法。
#arrays:数组的方法。
#lists::列表的方法。
#sets::集合的方法。
#maps:Map的方法。
#aggregates:在数组或集合上创建聚合的方法。
#ids:处理可能被重复的 id 属性的方法(例如:作为一个迭代的结果)。
现在我们了解了这些实用程序对象,我们可以使用它们来更改我们在主页中显示日期的方式。而不是在我们的 HomeController 中执行此操作:
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, response, 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 2011</span> </p>