Skip to content

Web上下文命名空间(用于请求/会话属性等)

在 Web 环境中使用 Thymeleaf 时,你可以通过一系列快捷命名空间来访问请求参数、会话属性和应用上下文属性:

INFO

需要注意的是:这些并非上下文对象,而是以变量形式添加到上下文的 Map 集合,因此访问时无需加 # 符号。从功能上看,它们相当于一组“命名空间”。

1. param:获取请求参数

${param.foo} 会返回一个 String[] 数组,包含请求参数 foo 的所有值,因此通常用 ${param.foo[0]} 获取第一个值。

/*
 * ============================================================================
 * 可参考 API 文档:org.thymeleaf.context.WebRequestParamsVariablesMap
 * ============================================================================
 */

${param.foo}              // 获取请求参数 'foo' 的值(String[] 类型)
${param.size()}           // 获取请求参数的总数
${param.isEmpty()}        // 判断是否有请求参数
${param.containsKey('foo')} // 判断是否存在 'foo' 这个请求参数
...

2. session:获取会话(Session)属性

/*
 * ======================================================================
 * 可参考 API 文档:org.thymeleaf.context.WebSessionVariablesMap
 * ======================================================================
 */

${session.foo}                 // 获取会话属性 'foo' 的值
${session.size()}              // 获取会话属性的总数
${session.isEmpty()}           // 判断会话中是否有属性
${session.containsKey('foo')}  // 判断会话中是否存在 'foo' 属性
...

3. application:获取应用/ Servlet 上下文属性

/*
 * =============================================================================
 * 可参考 API 文档:org.thymeleaf.context.WebServletContextVariablesMap
 * =============================================================================
 */

${application.foo}              // 获取 ServletContext 属性 'foo' 的值
${application.size()}           // 获取 ServletContext 属性的总数
${application.isEmpty()}        // 判断 ServletContext 中是否有属性
${application.containsKey('foo')} // 判断 ServletContext 中是否存在 'foo' 属性
...

需要注意的是:访问请求属性(request attributes)无需指定命名空间(与请求参数区分开)——因为所有请求属性都会被自动添加到上下文根节点作为变量,直接访问即可:

html
${myRequestAttribute} // 直接获取名为 myRequestAttribute 的请求属性

补充示例

为了让你更直观理解,以下是在模板中使用这些命名空间的完整示例:

html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
  <!-- 获取请求参数:比如URL为?username=张三 时,显示“张三” -->
  <p>请求参数username:<span th:text="${param.username[0]}">默认值</span></p>
  
  <!-- 获取会话属性:比如登录后存入session的用户ID -->
  <p>会话中的用户ID:<span th:text="${session.userId}">1001</span></p>
  
  <!-- 获取应用上下文属性:比如全局配置的网站名称 -->
  <p>网站名称:<span th:text="${application.siteName}">虚拟杂货店</span></p>
  
  <!-- 直接获取请求属性:比如控制器中model.addAttribute("msg", "欢迎") -->
  <p>请求属性msg:<span th:text="${msg}">默认欢迎语</span></p>
</body>
</html>

总结

  1. Web 环境下 Thymeleaf 提供 param/session/application 三个快捷命名空间(本质是 Map 变量),无需 # 即可访问对应作用域的属性;
  2. param 对应请求参数(返回数组),session 对应会话属性,application 对应应用上下文属性;
  3. 请求属性(request attributes)无需命名空间,可直接通过变量名访问,是最常用的页面传值方式。