thymeleaf3中文手册,thymeleaf pdf

http://www.itjxue.com  2023-01-05 08:09  来源:未知  点击次数: 

SpringBoot页面展示Thymeleaf

开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了。SpringBoot支持如下页面模板语言

上面并没有列举所有SpringBoot支持的页面模板技术。其中Thymeleaf是SpringBoot官方所推荐使用的,下面来谈谈Thymeleaf一些常用的语法规则。

要想使用Thhymeleaf,首先要在pom.xml文件中单独添加Thymeleaf依赖。

Spring Boot默认存放模板页面的路径在 src/main/resources/templates 或者 src/main/view/templates ,这个无论是使用什么模板语言都一样,当然默认路径是可以自定义的,不过一般不推荐这样做。另外Thymeleaf默认的页面文件后缀是 .html

在MVC的开发过程中,我们经常需要通过 Controller 将数据传递到页面中,让页面进行动态展示。

创建一个Controller对象,在其中进行参数的传递

在SpringBoot默认的页面路径下创建show.html文件,内容如下

可以看到在 p 标签中有 th:text 属性,这个就是thymeleaf的语法,它表示显示一个普通的文本信息。

如果我们要显示的信息是存在资源文件中的,同样可以在页面中显示,例如资源文件中定义了内容 welcome.msg=欢迎{0}光临! 。可以在页面中将其显示

另外,在 th:utext 中还能做一些基础的数学运算

如果我们想要传递到的页面的信息,它本身是带有CSS样式的,这个时候如何在页面中将携带的样式信息也显示出来?此时我们的控制器方法这样写。

此时页面中需要借助 th:utext 属性进行显示

通过浏览器查看页面源码可以看出 th:utext 和 th:text 的区别是: th:text 会对 和 进行转义,而 th:utext 不会转义。

我们常常需要将一个bean信息展示在前端页面当中。

上面给出了两种展现方式,一种是通过${属性},另外一种是通过 {属性}。

关于“${属性}”和“ {属性}”的区别?

$访问完整信息,而访问指定对象中的属性内容, 如果访问的只是普通的内容两者没有区别;

在 thymeleaf 之中提供有相应的集合的处理方法,例如:在使用 List 集合的时候可以考虑采用 get()方法获取指定索引的数据,那么在使用 Set 集合的时候会考虑使用 contains()来判断某个数据是否存在,使用 Map 集合的时候也希望可以使用 containsKey()判断某个 key 是否存在,以及使用get()根据 key 获取对应的 value,而这些功能在之前并不具备,下面来观察如何在页面中使用此类操作

在传统WEB工程开发时,路径的处理操作是有点麻烦的。SpringBoot中为我们简化了路径的处理。

页面之间的跳转也能通过@{}来实现

虽然在这种模版开发框架里面是不提倡使用内置对象的,但是很多情况下依然需要使用内置对象进行处理,所以下面来看下如何在页面中使用JSP内置对象。

thymeleaf 考虑到了实际的开发情况,因为 request 传递属性是最为常用的,但是 session 也有可能使用,例如:用户登录之后需要显示用户 id,那么就一定要使用到 session,所以现在必须增加属性范围的形式后才能够正常使用。在 thymeleaf 里面也支持有 JSP 内置对象的获取操作,不过一般很少这样使用。

所有的页面模版都存在各种基础逻辑处理,例如:判断、循环处理操作。在 Thymeleaf 之中对于逻辑可以使用如下的一些运算符来完成,例如:and、or、关系比较(、、=、=、==、!=、lt、gt、le、ge、eq、ne)。

通过控制器传递一些属性内容到页面之中:

不满足条件的判断

通过swith进行分支判断

在实际开发过程中常常需要对数据进行遍历展示,一般会将数据封装成list或map传递到页面进行遍历操作。

我们常常需要在一个页面当中引入另一个页面,例如,公用的导航栏以及页脚页面。thymeleaf中提供了两种方式进行页面引入。

可以看到页面当中还存在一个变量projectName,这个变量的值可以在引入页面中通过 th:with="projectName=百度" 传过来。

一篇文章搞懂Thymeleaf

在控制器中往页面传递几个变量:

在页面中使用变量表达式${}来获取它们:

可以看到变量表达式不但可以获取变量的属性值,甚至还可以访问变量的方法(getName()和upcaseName())。session代表HttpSession对象。

*{}代指th:object所指定的对象,即${session.user}。

URL链接表达式会给URL自动添加上下文的名字。比如:

解析后的href值为 。

当需要在URL中传递参数时,比如这样 ,可以如下操作:

传递多个参数:

路径变量的写法:

后端接受路径变量:

除了使用'...' + ${}来连接字面量和变量外,还可以使用|...|来代替,比如:

等价于:

注意: 在| ... |字面替换中只允许有变量表达式${...}

条件表达式实际上就是三目运算符。比如:

条件表达式也可以使用括号嵌套:

else表达式也可以省略,在这种情况下,如果条件为false,则返回空值:

默认表达式是一种特殊类型的条件值,不带then部分。比如:

表示,当${session.user.sex}为null时,值为sex is unknown,否则为表达式的值。这就好像为表达式指定了一个默认值一样。其等价于:

Thymeleaf默认提供了丰富的表达式工具类,这里列举一些常用的工具类。

比如:

注意事项 :

值得注意的是,在使用工具类对某个表达式进行处理时候,你可能会写成:

${#strings.isEmpty(${session.user.name})}。

实际上这种写法是错误的,将抛出异常。正确的写法为:

${#strings.isEmpty(session.user.name)}。

在Thymeleaf中,使用 th:each 标签可对集合类型进行迭代,支持的类型有:

1.任何实现了 java.util.List 的对象;

2.任何实现了 java.util.Iterable 的对象;

3.任何实现了 java.util.Enumeration 的对象;

4.任何实现了 java.util.Iterator 的对象;

5.任何实现了 java.util.Map 的对象。当迭代maps时,迭代变量是 java.util.Map.Entry 类型;

6.任何数组。

一个简单的例子:

其中${prods}为迭代值,prod为迭代变量。除此之外,我们还可以通过状态变量获取迭代的状态信息,比如:

其中stat就是状态变量。默认为迭代变量加上Stat后缀,在本例中,不直接申明stat,则状态变量名称为prodStat。状态变量包含以下信息:

1.index,当前迭代下标,从0开始;

2.count,当前迭代位置,从1开始;

3.size,迭代变量中的总计数量;

4.current,每次迭代的迭代变量;

5.even/odd,当前迭代是偶数还是奇数;

6.first,当前迭代的是不是第一个;

7.last,当前迭代的是不是最后一个;

例子:

页面显示如下:

当prod.comments不为空时,页面将渲染出该a标签。

另外,th:if有一个反向属性th:unless,用于代替上面的not:

th:case="*"表示默认选项,相当于default:

在模板的编写中,通常希望能够引入别的模板片段,比如通用的头部和页脚。Thymeleaf模板引擎的 th:include , th:insert 和 th:replace 属性可以轻松的实现该需求。不过从Thymeleaf 3.0版本后, 不再推荐使用 th:include 属性。

在index.html页面路径下创建一个footer.html:

在footer.html中,使用 th:fragment 属性定义了 footer 片段,然后在index.html中引用它:

其中footer为被引用的模板名称(templatename),copy为th:fragment标记的片段名称(selector),~{...}称为片段表达式,由于其不是一个复杂的片段表达式,所以可以简写为:

页面显示如下:

通过观察渲染出的源码可发现th:include,th:insert和th:replace的区别所在:

注意: 引用本页面的片段可以略去templatename,或者使用this来代替。

如果片段不包含th:fragment属性,我们可以使用CSS选择器来选中该片段,如:

引用方式:

使用th:fragment定义的片段可以指定一组参数:

然后在引用的时候给这两个参数赋值,有如下两种方式:

对于第二种方式,onevar和twovar的顺序不重要,并且使用第二种方式引用片段时,片段可以简写为:

比如有如下片段:

当value为all时,页面渲染为:

当value为body时,页面渲染为:

当value为tag时,页面渲染为:

当value为all-but-first时,页面渲染为:

在Thymeleaf模板引擎中,使用 th:with 属性来声明一个局部变量

在上面div中, th:width 属性声明了一个名为firstPer的局部变量,内容为 ${persons[0]} 。该局部变量的作用域为整个div内。

也可以一次性定义多个变量:

th:with属性允许重用在同一个属性中定义的变量:

参考:

使用thymeleaf模板引擎抽取公共页面

1、把公共部分放到一个公共页面common.html,注意:页面里边需要使用thymeleaf的名称空间xmlns:th=""

2、使用thymeleaf中的fragment定义截取片段th:fragment,或者使用id定义

3、定义片段完成后,需要参照官方文档里边的内容,引用片段,有th:insert、th:replace、th:include

这三种内容的区别是:

(1)th:insert:

总结:insert会把标签里边里面的所有内容给插入进去,div依旧保存

(2)th:replace方法

区别是div不见了,也就是说,把div给替换掉了,只保留片段的所有内容

(3)th:include方法

使用include之后,是把片段里边的内容给包含进去

4、演示使用include插入公共片段:(1)先把它的公共样式给删除

(2)使用th:include插入

SpringBoot2中使用thymeleaf3自定义分页方言

### 1、定义方言Dialect

继承AbstractProcessorDialect

```

public class PagingDialect extends AbstractProcessorDialect {

? ? private static final String DIALECT_NAME = "PagingDialect";//定义方言名称

? ? public PagingDialect() {

? ? ? ? super(DIALECT_NAME, "paging", StandardDialect.PROCESSOR_PRECEDENCE);

? ? ? ? //优先级:值必须为:StandardDialect.PROCESSOR_PRECEDENCE

? ? }

? ? @Override

? ? public Set getProcessors(String dialectPrefix) {

? ? ? ? Set processors = new HashSet();

? ? ? ? //添加我们定义的标签

? ? ? ? processors.add(new PagingTagProcessor(dialectPrefix));

? ? ? ? processors.add(new StandardXmlNsTagProcessor(TemplateMode.HTML, dialectPrefix));

? ? ? ? return processors;

? ? }

}

```

### 2、添加自定义处理程序Processor

继承AbstractElementTagProcessor

```

public class PagingTagProcessor extends AbstractElementTagProcessor {

? ? private static final String TAG_NAME = "pager";//标签名

? ? private static final int PRECEDENCE = 10000;//优先级,必须是10000,否则读取不到标签的赋值

? ? public PagingTagProcessor(String dialectPrefix) {

? ? ? ? super(

? ? ? ? ? ? ? ? TemplateMode.HTML,? ? ? // 此处理器将仅应用于HTML模式

? ? ? ? ? ? ? ? dialectPrefix,? ? ? ? ? // 要应用于名称的匹配前缀

? ? ? ? ? ? ? ? TAG_NAME,? ? ? ? ? ? ? // 标签名称:匹配此名称的特定标签

? ? ? ? ? ? ? ? true,? ? ? ? ? ? ? ? ? // 没有要应用于标签名称的前缀

? ? ? ? ? ? ? ? null,? ? ? ? ? ? ? ? ? // 无属性名称:将通过标签名称匹配

? ? ? ? ? ? ? ? false,? ? ? ? ? ? ? ? ? // 没有要应用于属性名称的前缀

? ? ? ? ? ? ? ? PRECEDENCE? ? ? ? ? ? ? // 优先(内部方言自己的优先)

? ? ? ? );

? ? }

? ? @Override

? ? protected void doProcess(ITemplateContext context,

? ? ? ? ? ? ? ? ? ? ? ? ? ? IProcessableElementTag tag,

? ? ? ? ? ? ? ? ? ? ? ? ? ? IElementTagStructureHandler structureHandler) {

? ? ? ? String url = ((WebEngineContext) context).getRequest().getRequestURL().toString();

? ? ? ? String queryString = ((WebEngineContext) context).getRequest().getQueryString();

? ? ? ? String pageUrl = "";

? ? ? ? if (StringUtils.isEmpty(queryString)) {

? ? ? ? ? ? pageUrl = url + "?page=";

? ? ? ? } else {

? ? ? ? ? ? pageUrl = url + "?" + queryString + "page=";

? ? ? ? }

? ? ? ? ApplicationContext appCtx = SpringContextUtils.getApplicationContext(context);

? ? ? ? //读取标签内容(当前页),注意标签必须是自带标签才能正常读取值

? ? ? ? String pageIndexString = tag.getAttributeValue("value");

? ? ? ? //读取标签内容(页码大小)

? ? ? ? String pageSizeString = tag.getAttributeValue("size");

? ? ? ? //读取标签内容(数据大小)

? ? ? ? String totalSizeString = tag.getAttributeValue("rows");

? ? }

}

```

### 3、使用@Bean注解完成方言注入

在SpringBoot Application类中加入注入

```

? ? @Bean

? ? public PagingDialect paging() {

? ? ? ? return new PagingDialect();

? ? }

```

### 4、页面应用

```

```

关于thymeleaf的使用

浏览器忽略一切不能够识别的属性

例如 th:text="xxxx" ,这样的属性浏览器会忽略,对于html5的标准属性写法 也是支持的

属性只需要 data-开头? 例如 :data-th-text(html5标准写法)=th:text写法

加入这个原因官方解释为了 不让我们的IDE在校验html文件时 出现烦人的警告。

常用属性

th:text--计算表达式的值,把结果 填充到 当前的标签内 即tags 的 body替换,类似于 jquery 的 text() 方法。

th:utext--与 th:text类似 但是其不转码表达式的计算结果? 比如 这种标签类的文本计算出来后 会被 th:text转码

表达式语法

变量访问表达式 ${....},例如 ${user.name}

消息访问表达式 #{...},主要是访问 配置文件中的值 支持国际化的显示

url表达式 @{....} 处理url使用

片段表达式 ~{...} 引入其他片段使用

表达式中 可用的字面量

字符串:用单引号包裹 ‘this is demo’? 例如

111

param.true22

也可以省略 单引号

数字 : 123.1? 0.1 9?

-1.5

布尔:true false?

null 字面量: null

字面量标记: one? param1 等

字符串连接 用加号? ‘this is’+'demo'

文字替换 |this is demo ${test}|? 其中 test为 某个变量或者 变量的字面量标记

二元运算符? + - * / %? 加 减 乘 除 取余

一元运算符 - 取负

二元逻辑运算? or? and

一元逻辑运算 ! not? 都是取反的意思

比较运算符? , , = , = ( gt , lt , ge , le )

等值比较? == , != ( eq , ne )

条件判断? (if)? (then)

(if) ? (then) : (else)

(value) ?: (defaultvalue)

多语言的支持

Welcome to our grocery store!

thymeleaf

th:text="#{}"---获取 properties文件中的 数据

html5的格式可以写成? data-th-text=""

${x} will return a variable x stored into the Thymeleaf context or as a request attribute.

${param.x} will return a request parameter called x (which might be multivalued).

${session.x} will return a session attribute called x .

${application.x} will return a servlet context attribute called x .

想要 th:text展示标签 即富文本展示的时候 采用? 等 ? 使用 th:utext代替

like ${user.name} for “get the variable called user, and call its getName() method”).

Variable Expressions: ${...}

Selection Variable Expressions: *{...}

Message Expressions: #{...}

Link URL Expressions: @{...}

Fragment Expressions: ~{...}

一个综合的表达式

'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))

消息中嵌入参数

Welcome to our grocery store, Sebastian Pepper!

多个参数用逗号分开?

key值也可以用参数

Welcome to our grocery store, Sebastian Pepper!

#ctx : the context object.

#vars: the context variables.

#locale : the context locale.

#request : (only in Web Contexts) the HttpServletRequest object.

#response : (only in Web Contexts) the HttpServletResponse object.

#session : (only in Web Contexts) the HttpSession object.

#servletContext : (only in Web Contexts) the ServletContext object.

Established locale country: US.

使用星号表达式

Name: Sebastian.

Surname: Pepper.

Nationality: Saturn.

而且 $和 *的取值方式还能通用

第十一节:Thymeleaf内置对象

一:基础对象

1.ctx: the context object ?

????ctx对象继承org.thymeleaf.context.IContext或者org.thymeleaf.context.IWebContext,取决于当前环境是不是web环境。

????如果程序集成了spring,那么将会是org.thymeleaf.spring[3|4].context.SpringWebContext

????#org.thymeleaf.context.IContext

????${#ctx.locale}

????${#ctx.variables}

????#org.thymeleaf.context.IWebContext

????${#ctx.applicationAttributes}

????${#ctx.httpServletRequest}

????${#ctx.httpServletResponse}

????${#ctx.httpSession}

????${#ctx.requestAttributes}

????${#ctx.requestParameters}

????${#ctx.servletContext}

????${#ctx.sessionAttributes}

2.vars: the context variables

????访问VariablesMap所有上下文中的变量

????#org.thymeleaf.context.VariablesMap

????${#vars.get('foo')}

????${#vars.containsKey('foo')}

????${#vars.size()}

3.locale: the context locale

????java.util.Locale对象的访问

4.request: (only in Web Contexts) the HttpServletRequest object

5.response: (only in Web Contexts) the HttpServletResponse object

6.session: (only in Web Contexts) the HttpSession object( 需要contoller/action(HttpSession session) )

7.servletContext: (only in Web Contexts) the ServletContext object

二:web环境对象

1.#httpServletRequest :javax.servlet.http.HttpServletRequest对象实例

? ??${#httpServletRequest.getAttribute('foo')}

????${#httpServletRequest.getParameter('foo')}

????${#httpServletRequest.getContextPath()}

????${#httpServletRequest.getRequestName()}

2.#httpSession( 需要contoller/action(HttpSession session) )

? ??${#httpSession.getAttribute('foo')}

????${#httpSession.id}

????${#httpSession.lastAccessedTime}

三:spring环境对象

? ??#themes : 提供和“ spring:theme JSP tag.”同样的功能。

????${#themes.code('foo')}

四:web环境中访问request/session等属性

? ? 1.param :获取请求的参数.

? ??????${param.foo} // Retrieves a String[] with the values of request parameter 'foo'

????????${param.size()}

????????${param.isEmpty()}

????????${param.containsKey('foo')}

? ? 2.session:访问session属性

? ??????${session.foo} // Retrieves the session atttribute 'foo'

????????${session.size()}

????????${session.isEmpty()}

????????${session.containsKey('foo')}

? ? 3.application:获取应用程序/ servlet上下文属性

? ??????${application.foo} // Retrieves the ServletContext atttribute 'foo'

????????${application.size()}

????????${application.isEmpty()}

????????${application.containsKey('foo')}

五:直接访问spring注册对象

????div th:text="${@authService.getUserName()}"...?

六:示例

(责任编辑:IT教学网)

更多

推荐DNS服务器文章