Thymeleaf 教程

变量(Variables)

前面章节我们已经提到,${...} 表达式实际上是在当前上下文中包含的变量映射上执行 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>
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号