一、使用SSM整合进行web项目开发遇到的问题
1.1 web开发的技术栈
- JSP、Servlet、JDBC----小米商城
- JSP+SSM(SpringMVC、MyBatis、Spring)—微分销管理平台
1.2 SSM整合的开发的问题
-
配置文件
- 步骤多
- 文件多
-
容器依赖
- SSM开发的web项目必须依赖Tomcat运行
- 项目部署步骤比较繁杂
-
思考:有没有一个工具能够解决这些问题呢 ?
- 整合mybatis: 添加依赖—mybatis配置文件—spring整合mybatis配置
- 整合redis:添加依赖—连接属性文件—spring整合redis配置
-
SpringBoot—为简化项目的整合而生–简化框架整合的复杂配置
二、SpringBoot简介
2.1 概念
- 随着动态语言的发展(node.js、Ruby)、Java语言显得特别笨重:配置繁多、开发效率低、项目部署比较复杂、整合第三方技术的难度大。
- 在这种情况下,SpringBoot就应运而生了。采用
习惯优于配置/约定大于配置
的理念让我们的项目可以快速的搭建并运行起来。(将大量的约定的习惯性配置内置到项目中,我们无需手动配置) - SpringBoot采用了
习惯优于配置
的理念快速搭建项目的开发环境,我们无需或者很少进行相关的spring配置,就可以让项目快速的运行起来。
2.2 优点
- 快速构建项目
- SpringBoot对主流的开发框架都提供了无配置的集成
- 即使SpringBoot没有提供内置配置的框架也可以通过手动配置进行整合
- SpringBoot的web项目可以独立运行(内置了servlet容器—tomcat)
- 极大提高了项目的开发、部署效率
- 提供了运行时监控系统
- 与云计算可以天然集成
2.3 缺点
- 由于配置都是内置的,报错很难定位
- 版本迭代速度比较快、而且一些模块改动也比较大
- 互联网上线程的解决方案还比较有限
三、 第一个SpringBoot应用
3.1 File–New–Project
说明:SpringBoot应用是在远程服务器完成创建down到本地使用的
- spring远程服务器:https://start.spring.io
- aliyun远程服务器:https://start.aliyun.com/
3.2 填写项目信息
3.3 选择SpringBoot并添加项目依赖
3.4 选择项目的存储路径
3.5 通过网页完成项目创建
-
打开网页创建项目 :https://start.spring.io
-
点击
GENERATE
生成并下载SpringBoot项目模板 -
将下载的模板压缩包解压到workspace
-
用idea打开此项目,加入到maven管理
- help—find action—输入maven—点击+Add Maven Projects
- 选择当前项目的pom文件
3.6 SpringBoot应用的项目结构
3.7 pom.xml
-
parent: 所有的springboot应用都继承自spring-boot-starter-parent
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
-
starter POM: 内置应用场景,一个starter表示不是一个依赖而是对应的这个开发场景所需的一组依赖,当我们引入一个stater的时候这个场景所以的依赖都会被引入。
四、SpringBoot应用的自定义Banner
- 在 Spring Boot 启动的时候会有一个默认的启动图案
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.9.RELEASE)
- 我们在 src/main/resources 目录下新建一个 banner.txt,通过 http://patorjk.com/software/taag 网站生成字符串,将网站生成的字符复制到 banner.txt 中,再次运行这个程序
// _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永不宕机 永无BUG //
五、全局配置文件
-
SpringBoot应用使用了一个全局配置文件application.properties进行全局配置;当我们需要对SpringBoot默认配置进行修改时,可以在此文件完成
server.port=8090 server.servlet.context-path=/demo1
-
SpringBoot应用的全局配置文件默认是properties属性文件,但是它提供了除属性配置以外的另一种语法支持-yaml语言(文件后缀名为yml)
-
application.properties
server.port=8090 server.servlet.context-path=/demo1 spring.datasource.url=jdbc:mysql://localhost:3306/db_wfx spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.username=root spring.datasource.password=admin123
-
application.yml
server: port: 9090 servlet: context-path: /dem01 spring: datasource: url: jdbc:mysql://localhost:3306/db_wfx driver-class-name: com.mysql.jdbc.Driver username: root password: admin123
-
六、Java配置方式
6.1 Spring容器管理类的三种配置方式
-
xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="book" class="com.qfedu.springboot.demo1.beans.Book"></bean> </beans>
-
注解配置
@Component public class Book { // }
-
Java配置方式:使用Java类取代配置文件
@Configuration public class SpringBeansConfig { @Bean public Book getBook(){ return new Book(); } }
6.2 Spring版本
- Spring 1.x 所有bean的配置都必须使用xml完成
- Spring 2.x 基于JDK1.5对注解进行支持,Spring2.x开始使用注解进行配置
- Spring 3.x 开始提供了Java配置方式的支持
- Spring 4.x 开始提倡使用Java配置方式
七、starter POM
starter POM: 内置应用场景,一个starter表示不是一个依赖而是对应的这个开发场景所需的一组依赖,当我们引入一个stater的时候这个场景所以的依赖都会被引入。
https://docs.spring.io/spring-boot/docs/2.1.9.RELEASE/reference/html/using-boot-build-systems.html#using-boot-starter
-
一个starter就是一个应用场景
-
SpringBoot为我们提供了企业开发中所需的绝大多场景的支持(内置了多个starter),当我们需要某种开发场景时只需引入对应的starter,相关的配置就会被内置进来,从而消除了人工配置。
-
SpringBoot提供了绝大多数场景的starter,但并不是所有;当我们要集成一个springBoot未内置的第三方框架则需进行手动配置。
-
常见的starter:
Spring Boot application starters
Name Description Pom spring-boot-starter
Core starter, including auto-configuration support, logging and YAML Pom spring-boot-starter-activemq
Starter for JMS messaging using Apache ActiveMQ Pom spring-boot-starter-amqp
Starter for using Spring AMQP and Rabbit MQ Pom spring-boot-starter-aop
Starter for aspect-oriented programming with Spring AOP and AspectJ Pom spring-boot-starter-artemis
Starter for JMS messaging using Apache Artemis Pom spring-boot-starter-batch
Starter for using Spring Batch Pom spring-boot-starter-cache
Starter for using Spring Framework’s caching support Pom spring-boot-starter-cloud-connectors
Starter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and Heroku Pom spring-boot-starter-data-cassandra
Starter for using Cassandra distributed database and Spring Data Cassandra Pom spring-boot-starter-data-cassandra-reactive
Starter for using Cassandra distributed database and Spring Data Cassandra Reactive Pom spring-boot-starter-data-couchbase
Starter for using Couchbase document-oriented database and Spring Data Couchbase Pom spring-boot-starter-data-couchbase-reactive
Starter for using Couchbase document-oriented database and Spring Data Couchbase Reactive Pom spring-boot-starter-data-elasticsearch
Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch Pom spring-boot-starter-data-jdbc
Starter for using Spring Data JDBC Pom spring-boot-starter-data-jpa
Starter for using Spring Data JPA with Hibernate Pom spring-boot-starter-data-ldap
Starter for using Spring Data LDAP Pom spring-boot-starter-data-mongodb
Starter for using MongoDB document-oriented database and Spring Data MongoDB Pom spring-boot-starter-data-mongodb-reactive
Starter for using MongoDB document-oriented database and Spring Data MongoDB Reactive Pom spring-boot-starter-data-neo4j
Starter for using Neo4j graph database and Spring Data Neo4j Pom spring-boot-starter-data-redis
Starter for using Redis key-value data store with Spring Data Redis and the Lettuce client Pom spring-boot-starter-data-redis-reactive
Starter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce client Pom spring-boot-starter-data-rest
Starter for exposing Spring Data repositories over REST using Spring Data REST Pom spring-boot-starter-data-solr
Starter for using the Apache Solr search platform with Spring Data Solr Pom spring-boot-starter-freemarker
Starter for building MVC web applications using FreeMarker views Pom spring-boot-starter-groovy-templates
Starter for building MVC web applications using Groovy Templates views Pom spring-boot-starter-hateoas
Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS Pom spring-boot-starter-integration
Starter for using Spring Integration Pom spring-boot-starter-jdbc
Starter for using JDBC with the HikariCP connection pool Pom spring-boot-starter-jersey
Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web
Pom spring-boot-starter-jooq
Starter for using jOOQ to access SQL databases. An alternative to spring-boot-starter-data-jpa
orspring-boot-starter-jdbc
Pom spring-boot-starter-json
Starter for reading and writing json Pom spring-boot-starter-jta-atomikos
Starter for JTA transactions using Atomikos Pom spring-boot-starter-jta-bitronix
Starter for JTA transactions using Bitronix Pom spring-boot-starter-mail
Starter for using Java Mail and Spring Framework’s email sending support Pom spring-boot-starter-mustache
Starter for building web applications using Mustache views Pom spring-boot-starter-oauth2-client
Starter for using Spring Security’s OAuth2/OpenID Connect client features Pom spring-boot-starter-oauth2-resource-server
Starter for using Spring Security’s OAuth2 resource server features Pom spring-boot-starter-quartz
Starter for using the Quartz scheduler Pom spring-boot-starter-security
Starter for using Spring Security Pom spring-boot-starter-test
Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito Pom spring-boot-starter-thymeleaf
Starter for building MVC web applications using Thymeleaf views Pom spring-boot-starter-validation
Starter for using Java Bean Validation with Hibernate Validator Pom spring-boot-starter-web
Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container Pom spring-boot-starter-web-services
Starter for using Spring Web Services Pom spring-boot-starter-webflux
Starter for building WebFlux applications using Spring Framework’s Reactive Web support Pom spring-boot-starter-websocket
Starter for building WebSocket applications using Spring Framework’s WebSocket support Pom
八、基于SpringBoot的SSM整合
8.1 创建SpringBoot应用,添加依赖
- lombok
- web — spring web
- SQL — mysql driver
- SQL — MyBatis framework
8.2 配置application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_bims?characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: admin123
mybatis:
type-aliases-package: com.qfedu.springboot.demo2.beans
mapper-locations: classpath:mappers/*Mapper.xml
8.3 在启动类中添加@MapperScan
注解,
- 指定DAO接口的包
@SpringBootApplication
@MapperScan(basePackages = "com.qfedu.springboot.demo2.dao")
public class SpringbootDemo2Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemo2Application.class, args);
}
}
九、整合Druid
9.1 添加druid的starter
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
9.2 配置application.yml
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/db_bims?characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: admin123
十、SpringBoot的自动配置过程
10.1 SpringBoot应用的启动类
@SpringBootApplication
@MapperScan(basePackages = "com.qfedu.springboot.demo2.dao")
public class SpringbootDemo2Application {
public static void main(String[] args) {
// SpringApplication.run 用于启动当前SpringBoot应用
SpringApplication.run(SpringbootDemo2Application.class, args);
}
}
10.2 SpringApplication
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
//SpringbootDemo2Application.class ==》 Class[] primarySource
return run(new Class[]{primarySource}, args);
}
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
//SpringApplication sa = new SpringApplication(SpringbootDemo2Application.class)
//return sa.run(args); --- 此SpringApplication对象sa 就表示当前SpringBoot应用
return (new SpringApplication(primarySources)).run(args);
}
public ConfigurableApplicationContext run(String... args) {
//...
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList();
//...
//获取当前SpringBoot应用对象工厂实例
exceptionReporters = this.getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[]{ConfigurableApplicationContext.class}, context);
//...
}
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
//...
Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
//....
}
10.3 SpringFactoriesLoader
public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}
private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
//加载spring依赖中的spring.factories文件,此文件就是SpringBoot应用支持的自动配置的列表
//-----------------spring-boot-autoconfig: MATE-INF/spring.factories
//-----------------自定义的依赖包: MATE-INF/spring.factories
//-----------------第三方的依赖包: MATE-INF/spring.factories
//依次扫描spring.factories文件列表中所有的自动配置类(扫描并不意味着初始化)
//在扫描自定配置类时,如果满足当前自定配置类的初始化条件则会自定进行初始化
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
}
十一、SpringBoot常用注解
11.1 @SpringBootApplication
@SpringBootApplication
用于声明SpringBoot应用的入口类- @ComponentScan 声明Spring容器的扫描范围(启动类所在的包)
- @EnableAutoConfiguration 开启自动配置
- @SpringBootConfiguration 声明SpringBoot入口类同时可以作为配置类使用
11.2 IoC注解
11.2.1 组件注册
@Component
@Repository
@Service
@Controller/@RestController
11.2.2 依赖注入
@Autowired/@Inject
@Qualifier
@Resource
11.2.3 作用于、生命周期
@Scope
@PostConstruct/@PreDestory
11.3 AOP注解
@Aspect
@Pointcut
@Before@After@Around
11.4 SpringMVC注解
@Controller/@RestController
@RequestMapping
@RequestParam、@PathVariable、@RquestBody
@ResponseBody
十二、日志框架
12.1 介绍
在项目的开发、运维过程中,为了清楚的了解项目在服务器中的运行过程,我们通常在项目中的关键代码中输出一些项目运行相关的关键信息——项目运行跟踪
如何实现项目运行跟踪?
- 最开始我们可以通过输出语句完成关键信息的打印 System.out.println()——不便于跟踪和维护;
- 慢慢的就出现了一个/一些框架帮助我们进行日志信息的输出——日志框架
日志框架 —— 专门用于项目的运行跟踪信息输出的框架
- 常见的日志框架
- Log4j
- Logback
- 日志接口规范
- JCL(jakatra commons logging)
- SLF4J(Simple Logging Facade For Java)
- JBOSS-Logging
12.2 SLF4J
SLF4J(Simple Logging Facade For Java)简单日志门面,定义了一套日志的规范,但是本身并没有具体的实现
- SLF4J接口规范的实现框架:
- logback
- slf4j-simple
12.3 slf4j-simple
-
添加slf4j-simple依赖
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency>
-
创建日志对象,输出日志
package com.qfedu.springboot.demo2.service.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Service public class BookServiceImpl implements BookService { @Resource private BookDAO bookDAO; Logger logger = LoggerFactory.getLogger(BookServiceImpl.class); @Override public List<Book> listBooks() { logger.info("listBooks"); return bookDAO.listBooks(); } }
12.4 log4j
log4j 日志框架并没有完全遵守slf4j,需要通过slf4j-log412完成适配
-
添加依赖
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> <scope>test</scope> </dependency>
-
log4j支持通过配置文件自定义日志信息的输出规范
在resources目录下创建一个log4.xml文件,在文件中进行日志的配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration> <appender name="myConsole" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{dd HH:mm:ss,SSS\} ] %-5p [%t] %c{2\} - %m%n" /> </layout> <!--过滤器设置输出的级别--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="debug" /> <param name="levelMax" value="warn" /> <param name="AcceptOnMatch" value="true" /> </filter> </appender> <appender name="myFile" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="D:/output.log" /><!-- 设置日志输出文件名 --> <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 --> <param name="Append" value="true" /> <param name="MaxBackupIndex" value="10" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%p (%c:%L)- %m%n" /> </layout> </appender> <!-- 根logger的设置--> <root> <priority value ="debug"/> <appender-ref ref="myConsole"/> <appender-ref ref="myFile"/> </root> </log4j:configuration>
12.5 logback
-
添加依赖
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <scope>test</scope> </dependency>
-
通过配置文件进行日志输出配置
- 非springBoot应用,日志文件名 logback-test.xml
- springBoot应用中,日志文件名 logback-spring.xml
<?xml version='1.0' encoding='UTF-8'?> <configuration> <appender name='stdout' class='ch.qos.logback.core.ConsoleAppender'> <encoder> <springProfile name='dev'> <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line~~%msg%n</pattern> </springProfile> <springProfile name='!dev'> <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line~~%msg%n</pattern> </springProfile> <!--日志的编码格式--> <charset>UTF-8</charset> </encoder> </appender> <!--这个就表示的是要把 日志输出到文件(FileAppender)--> <appender name='file' class='ch.qos.logback.core.FileAppender'> <file>D:/log/output.log</file> <!--设置日志是否追加--> <append>true</append> <encoder> <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern> <charset>UTF-8</charset> </encoder> <!--设置日志写入是否线程安全--> <prudent>false</prudent> </appender> <appender name='timeFile' class='ch.qos.logback.core.rolling.RollingFileAppender'> <!--TimeBasedRollingPolicy 基于时间的滚动策略--> <rollingPolicy class='ch.qos.logback.core.rolling.TimeBasedRollingPolicy'> <fileNamePattern>d:/log/log-%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n</pattern> <charset>UTF-8</charset> </encoder> </appender> <appender name='fixedFile' class='ch.qos.logback.core.rolling.RollingFileAppender'> <file>d:/log/fixedFile.log</file> <rollingPolicy class='ch.qos.logback.core.rolling.FixedWindowRollingPolicy'> <fileNamePattern>log/fixedFile%i.log</fileNamePattern> <minIndex>1</minIndex> <maxIndex>10</maxIndex> </rollingPolicy> <!--SizeBasedTriggeringPolicy--> <triggeringPolicy class='ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy'> <maxFileSize>5MB</maxFileSize> </triggeringPolicy> <encoder> <pattern>%d{yyyy-MM-dd-HH:mm:ss.SSS} %level [%thread]-%class:%line>>%msg%n </pattern> <charset>UTF-8</charset> </encoder> </appender> <!-- <logger name='com.qf.springboot.controller' level='info' addtivity='false'>--> <!-- <appender-ref ref='file' />--> <!-- <appender-ref ref='timeFile' />--> <!-- <appender-ref ref='fixedFile' />--> <!-- </logger>--> <root level='info'> <appender-ref ref='stdout' /> <appender-ref ref='timeFile'/> </root> </configuration>
12.6 SpringBoot应用的日志配置
SpringBoot应用默认集成logback,在全局配置文件进行如下日志配置:
十三、Thymeleaf
13.1 JSP动态网页技术
- 优点
- 动态显示数据
- 支持Java代码
- 支持逻辑控制(分支、循环)
- 缺点
- JSP必须依赖web容器(tomcat)才能运行
- JSP中可以包含HTML\CSS\JS\Java\JSTL\自定义标签、导致JSP可读性比较差
13.2 Thymeleaf介绍
- Thymeleaf是一个用于前端数据动态显示的模版引擎,它可以完全替代JSP,同时弥补了JSP的不足
- 特点:
- 基于HTML动态网页技术,并且支持逻辑控制
- 直接基于浏览器运行可以看到页面的静态效果,基于服务器运行又能看到动态数据
- 开发便捷、高效
13.3 Thymeleaf的基本使用
-
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
-
在全局配置文件中配置thymeleaf设置(有默认配置)
spring: thymeleaf: prefix: classpath:/templates/ suffix: .html cache: false mode: HTML5 encoding: UTF-8
-
创建控制器
@Controller @RequestMapping("/test") public class TestController { @RequestMapping("/index") public String index(Model model){ System.out.println("------index"); model.addAttribute("str","这是从控制器传递的数据!"); return "index"; // --- /templates/index.html } }
-
在HTML中引入th的命名空间
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <label th:text="${str}"></label> </body> </html>
-
注意:
-
对于SpringBoot应用static目录的资源为静态资源,可以直接访问
-
Thymeleaf模板存放在templates目录下,必须通过控制器跳转;如果某些模板允许被直接访问,则可以通过PageController进行配置
@Controller //@RequestMapping("/page") public class PageController { @RequestMapping("login.html") public String login(){ return "login"; } }
-
13.4 Thymeleaf常用语法
13.4.1 取值
-
简单数据
<label th:text="${str}">从前有座山</label><br/>
-
对象数据
<!--对象数据--> <label th:text="${book.bookName}"></label><br/> <!-- *的使用 --> <div th:object="${book}"> <p th:text="*{bookId}"></p> <p th:text="*{bookName}"></p> <p th:text="*{bookAuthor}"></p> <p th:text="*{bookPrice}"></p> <p th:text="*{bookImg}"></p> </div>
13.4.2 运算符
-
算术运算、三目运算、逻辑运算
<!-- 三目运算 --> <label th:text="${book.bookName} =='Java'?'买买买':'才不买'"></label> <!-- 算术运算 --> <label th:text="${book.bookPrice}*0.8" style="font-size: 18px;color: orange"></label> <label th:text="${book.bookPrice + 3}" ></label> <!-- 字符串拼接 --> <label th:text="'作者:'+${book.bookAuthor}"></label>
13.4.3 内联使用
-
在HTML标签、style标签、script标签内部获取控制器传递的数据
<label th:inline="text">[[${str}]]</label> <style type="text/css" th:inline="css"> label{color:[[${labelColor}]]} </style> <script type="text/javascript" th:inline="javascript"> var color = [[${labelColor}]]; alert(color); </script>
13.4.4 流程控制
-
循环
<table class="layui-table"> <tr> <th>编号</th> <th>名称</th> <th>作者</th> <th>价格</th> <th>图片</th> <th>操作</th> </tr> <tr th:each="b:${books}"> <td th:text="${b.bookId}"></td> <td th:text="${b.bookName}"></td> <td th:text="${b.bookAuthor}"></td> <td th:text="${b.bookPrice}"></td> <td th:text="${b.bookImg}"></td> <td> <a th:href="'/book/del?bid='+${b.bookId}">删除</a> <a th:href="'/book/query?bid='+${b.bookId}">修改</a> </td> </tr> </table>
-
分支
<!-- 如果条件成立,则显示当前标签内容 --> <label th:if="${book.bookPrice}>20">太贵了</label> <label th:if="${book.bookPrice}<=20">价格可以接受</label> <!-- 如果条件不成立,则显示当前标签内容 --> <label th:unless="${book.bookPrice}<20">太贵了</label> <div th:switch="${book.bookName}"> <div th:case="Java">1</div> <div th:case="C">2</div> <div th:case="Python">3</div> <div th:case="*">4</div> </div>
13.5 Thymeleaf碎片使用
-
碎片介绍
-
碎片定义
-
head.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div style="background: pink; height: 80px" th:fragment="fragment1"> head </div> </body> </html>
-
menu.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div style="background:deepskyblue; width:180px; height:600px" th:fragment="fragment2"> menu </div> </body> </html>
-
-
引用碎片
-
th:include 将碎片标签中的内容引入到当前标签中
-
th:replace 使用碎片标签替代当前标签
-
page1.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table style="height: 760px; width: 100%"> <tr height="80"> <td colspan="2" > <!-- <div th:include="head::fragment1"></div>--> <div th:replace="head::fragment1"></div> </td> </tr> <tr> <td width="180"> <div th:include="menu::fragment2"></div> </td> <td></td> </tr> </table> </body> </html>
-
width:180px; height:600px" th:fragment=“fragment2”>
menu
</body>
</html>
```
-
引用碎片
-
th:include 将碎片标签中的内容引入到当前标签中
-
th:replace 使用碎片标签替代当前标签
-
page1.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table style="height: 760px; width: 100%"> <tr height="80"> <td colspan="2" > <!-- <div th:include="head::fragment1"></div>--> <div th:replace="head::fragment1"></div> </td> </tr> <tr> <td width="180"> <div th:include="menu::fragment2"></div> </td> <td></td> </tr> </table> </body> </html>
-