SpringBoot

一、使用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

    NameDescriptionPom
    spring-boot-starterCore starter, including auto-configuration support, logging and YAMLPom
    spring-boot-starter-activemqStarter for JMS messaging using Apache ActiveMQPom
    spring-boot-starter-amqpStarter for using Spring AMQP and Rabbit MQPom
    spring-boot-starter-aopStarter for aspect-oriented programming with Spring AOP and AspectJPom
    spring-boot-starter-artemisStarter for JMS messaging using Apache ArtemisPom
    spring-boot-starter-batchStarter for using Spring BatchPom
    spring-boot-starter-cacheStarter for using Spring Framework’s caching supportPom
    spring-boot-starter-cloud-connectorsStarter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and HerokuPom
    spring-boot-starter-data-cassandraStarter for using Cassandra distributed database and Spring Data CassandraPom
    spring-boot-starter-data-cassandra-reactiveStarter for using Cassandra distributed database and Spring Data Cassandra ReactivePom
    spring-boot-starter-data-couchbaseStarter for using Couchbase document-oriented database and Spring Data CouchbasePom
    spring-boot-starter-data-couchbase-reactiveStarter for using Couchbase document-oriented database and Spring Data Couchbase ReactivePom
    spring-boot-starter-data-elasticsearchStarter for using Elasticsearch search and analytics engine and Spring Data ElasticsearchPom
    spring-boot-starter-data-jdbcStarter for using Spring Data JDBCPom
    spring-boot-starter-data-jpaStarter for using Spring Data JPA with HibernatePom
    spring-boot-starter-data-ldapStarter for using Spring Data LDAPPom
    spring-boot-starter-data-mongodbStarter for using MongoDB document-oriented database and Spring Data MongoDBPom
    spring-boot-starter-data-mongodb-reactiveStarter for using MongoDB document-oriented database and Spring Data MongoDB ReactivePom
    spring-boot-starter-data-neo4jStarter for using Neo4j graph database and Spring Data Neo4jPom
    spring-boot-starter-data-redisStarter for using Redis key-value data store with Spring Data Redis and the Lettuce clientPom
    spring-boot-starter-data-redis-reactiveStarter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce clientPom
    spring-boot-starter-data-restStarter for exposing Spring Data repositories over REST using Spring Data RESTPom
    spring-boot-starter-data-solrStarter for using the Apache Solr search platform with Spring Data SolrPom
    spring-boot-starter-freemarkerStarter for building MVC web applications using FreeMarker viewsPom
    spring-boot-starter-groovy-templatesStarter for building MVC web applications using Groovy Templates viewsPom
    spring-boot-starter-hateoasStarter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOASPom
    spring-boot-starter-integrationStarter for using Spring IntegrationPom
    spring-boot-starter-jdbcStarter for using JDBC with the HikariCP connection poolPom
    spring-boot-starter-jerseyStarter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-webPom
    spring-boot-starter-jooqStarter for using jOOQ to access SQL databases. An alternative to spring-boot-starter-data-jpa or spring-boot-starter-jdbcPom
    spring-boot-starter-jsonStarter for reading and writing jsonPom
    spring-boot-starter-jta-atomikosStarter for JTA transactions using AtomikosPom
    spring-boot-starter-jta-bitronixStarter for JTA transactions using BitronixPom
    spring-boot-starter-mailStarter for using Java Mail and Spring Framework’s email sending supportPom
    spring-boot-starter-mustacheStarter for building web applications using Mustache viewsPom
    spring-boot-starter-oauth2-clientStarter for using Spring Security’s OAuth2/OpenID Connect client featuresPom
    spring-boot-starter-oauth2-resource-serverStarter for using Spring Security’s OAuth2 resource server featuresPom
    spring-boot-starter-quartzStarter for using the Quartz schedulerPom
    spring-boot-starter-securityStarter for using Spring SecurityPom
    spring-boot-starter-testStarter for testing Spring Boot applications with libraries including JUnit, Hamcrest and MockitoPom
    spring-boot-starter-thymeleafStarter for building MVC web applications using Thymeleaf viewsPom
    spring-boot-starter-validationStarter for using Java Bean Validation with Hibernate ValidatorPom
    spring-boot-starter-webStarter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded containerPom
    spring-boot-starter-web-servicesStarter for using Spring Web ServicesPom
    spring-boot-starter-webfluxStarter for building WebFlux applications using Spring Framework’s Reactive Web supportPom
    spring-boot-starter-websocketStarter for building WebSocket applications using Spring Framework’s WebSocket supportPom

八、基于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>
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值