龙空技术网

【SpringBoot系列教程二】SpringBoot集成Thymeleaf

猿学堂 445

前言:

此刻我们对“spring boot thymeleaf 表单提交”大体比较看重,我们都想要了解一些“spring boot thymeleaf 表单提交”的相关内容。那么小编在网络上搜集了一些关于“spring boot thymeleaf 表单提交””的相关文章,希望看官们能喜欢,各位老铁们一起来了解一下吧!

SpringBoot主要支持Thymeleaf、Freemarker、Mustache、Groovy Templates等模板引擎。

SpringBoot更倾向于继承Thymeleaf,因为Thymeleaf语法并不会破坏文档的结构,并且Thymeleaf依然是有效的HTML文档,可以实时预览,Thymeleaf在项目运行时会替换掉对应的值。

因此在SpringBoot开发中如果不使用前后端分离,则通常使用Thymeleaf作为模板引擎。

2.1 Thymeleaf简介

Thymeleaf是一个XML/XHTML/HTML5模板引擎,Thymeleaf提供了一个用于整合Spring MVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP,或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可,并且该模板引擎也是SpringBoot官方推荐使用的模板引擎。

2.2 Thymeleaf简易教程

在使用Thymeleaf之前,需要先了解一些基础内容,下面简单列举一下Thymeleaf常用的表达式、标签和函数。

2.2.1 常用表达式

Thymeleaf中的表达式通常用于获取请求参数,请求属性,会话属性和应用属性,以及设置链接等。常用的表达式如下:

表达式

说明

${}

变量表达式

@{}

链接表达式

*{}

选择表达式

2.2.1.1 ${}表达式

Thymeleaf提供了专门获取WebContext中请求参数、请求属性、会话属性和应用属性的表达式,这些表达式和JSP中EL表达式的功能非常相似。

${x}:获取Thymeleaf上下文中的变量x或者请求(HttpServletRequest)范围内的x属性的值等价于request.getAttribute()。${param.x}:返回名为x的请求参数的值,等价于HttpRequest对象的getParameter()或者getParameterValues()。${session.x}:返回会话(HttpSession)范围内的x的属性,等价于session.getAttribute()

获取变量值用“$”符号,Thymeleaf表达式同样支持属性路径的写法,例如${session.abc.xyz}表示访问HttpSession范围内abc属性的getXyz()方法的返回值。

2.2.1.2 @{}表达式

Thymeleaf对URL地址通过@{}语法来完成的。

<a th:href="@{}">Byte学院</a><a th:href="@{/}">相对路径</a><a th:href="@{css/index.css}">链接静态资源</a>
2.2.2 常用标签

Thymeleaf还提供了类似JSTL的标签,这些标签可以指定标签ID,替换标签内的文字,读取对象中的成员变量,遍历数组、集合,条件判断等功能,本小节将对常用标签进行示例并讲解。常用标签如下:

标签名称

功能介绍

案例

th:id

替换id

<input th:id="'xxx' + ${collect.id}"/>

th:text

文本替换

<p th:text="${collect.description}">description</p>

th:utext

支持html的文本替换

<p th:utext="${htmlcontent}">content</p>

th:object

替换对象

<div th:object="${session.user}">

th:value

属性赋值

<input th:value = "${user.name}" />

th:with

变量赋值运算

<div th:with="isEvens = ${prodStat.count}%2 == 0"></div>

th:style

设置样式

<div th:style="'display:' + @{(${sitrue} ? 'none' : 'inline-block')} + ''"></div>

th:onclick

点击事件

<td th:onclick = "'getCollect()'"></td>

th:each

循环迭代

<tr th:each = "user:${users}">

th:if

判断条件

<a th:if = "${userId == collect.userId}">

th:unless

和th:if判断相反

<a th:href="@{/login} th:unless=${session.user != null}">Login</a>

th:href

链接地址

<a th:href="@{/login}" th:unless=${session.user != null}>Login</a>

th:switch

多路选择配合th:case使用

<div th:switch="${user.role}">

th:case

th:switch的一个分支

<p th:case = "'admin'">User is an administrator</p>

th:src

图片类地址引入

<img class="img-responsive" alt="App Logo" th:src="@{/img/logo.png}" />

th:action

表单提交的地址

<form action="subscribe.html" th:action="@{/subscribe}">

2.2.3 内置对象

试图页面还有一些常用的工具方法,这些工具方法有Thymeleaf的内置对象负责提供,这些内置对象课通过“#”直接访问。内置对象一般都以“s”结尾,如dates、lists、numbers等。

Thymeleaf的内置对象主要有:

#dates:负责处理日期格式化的内置对象。具体用法可参考 Date、DateFormat 等类。#calendars:类似于#dates,只是功能类似于 java.util.Calendar 类。#numbers:负责数字格式化的内置对象。#strings:负责字符串格式化的内置对象,具体用法可参考 java.lang.String等类。#objects:具体用法可参考 java.lang.Object类。#books:负责处理 boolean 类型的内置对象。#arrays:负责操作数组的内置对象,具体用法可参考 javautil.Arrays 类。#lists:负责操作列表的内置对象,具体用法可参考java.util.List类。#sets:负责操作 Set 的内置对象,具体用法可参考java.util.Set 类。#maps:负责操作 Map 的内置对象,具体用法可参考 java.util.Map 类。#aggregates:负责对集合和数组执行聚集运算的内置对象。#messages:负责处理消息的内置对象。

示例代码如下:

<span th:text="S{#dates.format(publishDate,'yyyy-MM-dd HH:mm:ss')i"></span>

使用内置对象 dates 的 format0方法即可对日期进行格式化,format()方法的第一个参数是日期

对象,第二个参数为日期格式(就像 SimpleDateFormat 一样)。

<span th:text="${#numbers.formatDecimal(price, 0, 2)}"></span>

以上代码表示 price 变量只保留 2 位小数。

<span th:text="${#numbers.formatDecimal(price, 3, 2)}"></span>

以上代码表示 price 变量的整数部分保留 3 位(不够前面补 0),小数部分只保留 2 位。

<span th:text="${#strings.length(str)}"></span>

以上代码表示获取变量 str 的长度。

<span th:text="${#lists.size(datas)}"></span>

以上代码表示使用#ists.size()来获取 datas 集合的长度。

总之,记住一句话:Thymeleaf 模板主要就是在标准 HTML 标签中添加一些 th:*属性,该属性指定的表达式的值将会取代该 HTML 标签的内容。

2.3 SpringBoot集成Thymeleaf

要使用Thymeleaf模板引擎,需要在pom.xml文件中引入如下的依赖(依赖引入之后,记得刷新依赖),具体代码如下:

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

Thymeleaf提供了一些默认设置,通常这些设置并不是必须的:

#Thymeleaf配置spring:  thymeleaf:    #模板的模式,支持如HTML5、XML、TEXT、JavaScript等    mode: HTML    #字符编码,可以不用配    encoding: UTF-8    #配置模板路径,默认就是templates,可不用配置    prefix: classpath:/templates/    #开发配置为false,避免修改模板时重启服务器    cache: false

这里要注意的是,Thymeleaf模板引擎默认会读取项目下的资源文件夹resource下的templates目录,这个目录是用来存放模板引擎文件的。

需要注意的是,使用Thymeleaf模板,首先要改写<html>标签,并引入命名空间,将该标签的修改为如下形式:

<html xmlns:th=";>
2.4 SpringBoot集成JSP

虽然SpringBoot推荐使用Thymeleaf作为模板引擎,但由于早期大量SpringMVC项目都是使用JSP作为视图页面,因此SpringBoot依然提供了JSP的支持。

实际上,真正支持JSP的并不是SpringBoot,而是SpringMVC,因此SpringBoot只要为SpringMVC的Servlet提供自动配置支持,就会支持JSP,所以,SpringBoot在org.springframework.boot.autoconfigure.web.servlet包下,并提供了相关类来支持SpringMVC的自动配置。

整合JSP与整合普通模板引擎的最大区别在于:JSP本质上是一个Servlet,因此需要把JSP视图放在Web目录下,对于Maven项目而言,Web目录就是src/main目录下的webapp目录,该目录与java目录、resource目录并列,这意味着SpringBoot加载JSP视图页面的基本路径就是src/main/webapp/目录,而在application.yml中spring.mvc.view.prefix指定的路径,也是以该路径为基路径的。下面以一个例子演示在SpringBoot中集成JSP。

首先,添加依赖。

<!--添加JSTL依赖--><dependency>    <groupId>javax.servlet</groupId>    <artifactId>jstl</artifactId></dependency><!--Jasper是Tomcat中使用的JSP引擎,SpringBoot默认依赖的Tomcat不包含JSP引擎--><dependency>    <groupId>org.apache.tomcat.embed</groupId>    <artifactId>tomcat-embed-jasper</artifactId></dependency>

上面第一段粗体字代码添加了 JSTL 依赖库,这是为了在 JSP 视图页面中使用 JSTL 来执行分支、迭代循环、输出表达式等功能。上面第二段粗体字代码添加了 tomcat-embed-jasper 依赖库,它是 Tomncat 内置的 JSP 引擎,由于 spring-boot-starter-web 所依赖的 tomcatembed-core jar 并未包含JSP 引擎,因此必须自行添加 tomcat-embed-jasper 作为 JSP 引擎。

在应用的 src/main /目录下创建 webapp 目录,该目录就是 Spring Boot 加载 JSP 视图页面的基路径,然后在 webapp 目录下创建 WEB-INF目录,本例打算将 JSP 视图页面放在该目录下,因此需要在 application.yml 文件中配置如下代码:

spring:  mvc:    view:      prefix: /WEB-INF/

最后,还需要在开发工具中进行设置,在File菜单中选择Project Structure选项。

如上图所示,点击Moudles选项卡,并点击图中Web选项,并点击图中3处所示“+”号,选择新建的webapp目录,点击OK按钮即可。

至此,已经完成了SpringBoot对JSP的集成,接下来,在webapp目录下新建index.jsp。因为该目录受保护的目录,不能直接访问,需要使用控制器进行跳转。因此还需要新建Controller,代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>  <html>    <head>      <title>Title</title>    </head>    <body>      Hello-SpringBoot    </body>  </html>
@Controllerpublic class IndexController {    @RequestMapping(value = "/")    public String index(Model model){        return "index.jsp";    }}

启动服务后,在浏览器中输入即可访问JSP页面。如下图所示:

在开发过程中上述配置已经成功了,项目开发完成后通常需要打包部署,这时就需要将webapp目录编译进项目中,在pom.xml文件中<build></build>标签内还需要加入如下配置。

<build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>        <!--           SpringBoot项目默认推荐使用的前端引擎是thymeleaf           要使用SpringBoot集成jsp,手动指定jsp最后编译的路径           同时SpringBoot集成jsp编译jsp的路径是规定好的:META-INF/resources          -->        <resources>            <resource>                <!-- 源文件夹 -->                <directory>src/main/webapp</directory>                <!-- 指定编译到的路径为 META-INF/resources -->                <targetPath>META-INF/resources</targetPath>                <!-- 指定源文件夹中的哪些资源需要进行编译 -->                <includes>                    <include>*.*</include>                </includes>            </resource>        </resources>    </build>

标签: #spring boot thymeleaf 表单提交