【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板
文章目录
- SpringBoot
- 第三章
- 1、整合mybatsPlus
- 1-2
- 3
- 4-6
- 7-10
- 问题
- 2、整合pageHelper分页
- 3、MP代码生成器
- 1、编写yml文件
- 2、导入依赖
- 3、创建mp代码生成器
- 4、生成代码
- 5、编写配置类扫描mapper类
- 6、编写控制器类
- 4、swagger
- 1、什么是swagger
- 2、作用
- 3、发展历程
- 4、一个简单的swagger项目
- 第四章
- 1、swagger
- 2、thymeleaf
- 1、使用步骤
- 2、thymeleaf中的表达式
- 1、标准变量表达式
- 2、选择变量表达式
- 3、路径表达式
- 3、标签语法
- 1、th:text
- 2、th:value
- 3、th:href
- 4、th:src
- 5、th:attr
- 6、th:each
- 7、内敛文本
- 8、内联脚本
- 9、th:switch
- 10、th:if
- 4、thymeleaf中的内置对象
- 1、日期
- 2、数值
- 3、统计
- 4、作用域
- 3、综合应用
- 1-2
- 3-5
- 6
- 7-8
- 页面两种跳转方式
SpringBoot
第三章
1、springboot操作mybatisPlus
2、mybatisPlus代码生成器
3、swagger
4、thymeleaf
1、整合mybatsPlus
@@@@@@如果使用Mybatis所有操作要自己编写sql语句,自己编写mapper接口中方法,mybatisPlus对Mybatis进行了封装,常见的方法不用自己声明,即可直接使用使用MybatisPlus后,常见的sql,mapper接口中的方法不需要自己编写了,由MybatisPlus直接提供,这样可以简化开发过程
步骤
1-2
@@@@@@@@在springboot中使用MybatisPlus1、创建springboot项目2、导入依赖1、web2、devtools 热部署3、mybatisPlus(需要手动导入)4、mysql (默认情况下,系统导入的是mysql 8.0,如果用的其他版本,就需要自己指定版本号)5、druid---------------这个依赖选不了,需要手动导入6、lombok注意:默认导入的mysql的依赖是:<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>需要更改为:<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>导入druid<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency><!--导入mybatisPlus的依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.0</version></dependency>
3
3、编写配置文件 application.yml#服务器端口号server:port: 9999#指定数据库连接spring:datasource:#使用druid连接池type: com.alibaba.druid.pool.DruidDataSource#数据库驱动driver-class-name: com.mysql.jdbc.Driver#连接地址url: jdbc:mysql:///d113#用户名及密码username: rootpassword: rootmybatis-plus:#对哪一个包下面的实体类生成别名,默认别名是类名的首字母小写type-aliases-package: org.java.entity#指定mybatis中生成的mapper.xml配置文件的位置mapper-locations: classpath:mapper/*Mapper.xml#输出org.java.dao这个包中操作数据库时的底层sql语句logging:level:org:java:dao: debug
4-6
4、编写实体类@Data@AllArgsConstructor@NoArgsConstructor@TableName("inf")//如果表名与类名一致,该注解可以省略public class Inf implements Serializable {//它表示当前对应的是数据表中的主键,当前id的值是由数据库自动分配@TableId(type = IdType.AUTO)private Integer id;@TableField("name")//描述当前属性与数据表中的哪一个字段有映射关系,如果同名可以省略不写private String name;private Integer score;}5、编写Mapper接口继承于BaseMapper@Repositorypublic interface InfMapper extends BaseMapper<Inf> {}6、编写配置类扫描Mapper接口@Configuration@EnableTransactionManagement@MapperScan(basePackages = "org.java.dao")public class WebConfig {}
7-10
7、编写Service接口8、编写service实现类@Servicepublic class InfServiceImpl implements InfService {@Autowiredprivate InfMapper infMapper;@Overridepublic void add(Inf inf) {infMapper.insert(inf);}@Overridepublic List<Inf> getList() {return infMapper.selectList(null);}}9、编写控制器类@RestControllerpublic class InfController {@Autowiredprivate InfService infService;@GetMapping("/init")public List<Inf> getList(){return infService.getList();}@PostMapping("/add")public void add(Inf inf){infService.add(inf);}}
10、测试
问题
@@@@@@@问题:如果我们要使用一个方法findByScore,但mybatisplus中没有这个方法,我们可以直接扩展1、在mapper接口指定方法@Repositorypublic interface InfMapper extends BaseMapper<Inf> {public List<Inf> findByScore();}2、编写mapper.xml<mapper namespace="org.java.dao.InfMapper"><select id="findByScore" parameterType="int" resultType="inf">select * from inf where score >=#{score}</select></mapper>3、在yml文件中配置mybatis的信息
mybatis-plus:mapper-locations: classpath:mapper/*Mapper.xmltype-aliases-package: org.java.entity
2、整合pageHelper分页
@@@@@@@@在springboot使用pageHelper实现分页1、导入pageHelper依赖<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.12</version></dependency>2、在控制器编写方法接收参数进行分页显示@GetMapping("/show/{page}/{rows}")public PageInfo<Inf> showPage(@PathVariable("page") Integer page, @PathVariable("rows") Integer rows){//分页加载数据PageInfo<Inf> pg = infService.showPage(page,rows);return pg;}3、编写InfService类中的方法,实现分页显示public PageInfo<Inf> showPage(Integer page, Integer rows) {//设置分页的信息PageHelper.startPage(page,rows);//创建一个queryWrapper对象,用于封装查询条件QueryWrapper<Inf> queryWrapper = new QueryWrapper<>();//分页查询PageInfo<Inf> pageInfo = new PageInfo<>(infMapper.selectList(queryWrapper));return pageInfo;}
3、MP代码生成器
使用MP代码生成器作用:在项目中使用MP的代码生成器可以生成通用的:Mapper接口,service接口,service实现类,实体
类,以及项目的基本结构
1、编写yml文件
#服务器端口号
server:port: 8099
#指定数据库连接
spring:datasource:#使用druid连接池type: com.alibaba.druid.pool.DruidDataSource#数据库驱动driver-class-name: com.mysql.jdbc.Driver#连接地址url: jdbc:mysql:///d118?useUnicode=true&characterEncoding=UTF-8&useSSL=false#用户名及密码username: rootpassword: 123456
mybatis-plus:#对哪一个包下面的实体类生成别名,默认别名是类名的首字母小写type-aliases-package: org.java.entity#指定mybatis中生成的mapper.xml配置文件的位置mapper-locations: classpath:mapper/*Mapper.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#输出org.java.dao这个包中操作数据库时的底层sql语句
#logging:
# level:
# org:
# java:
# mapper: debug
2、导入依赖
1、web
2、热部署
3、mysql<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>
4、druid<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency>
5、mybatis-plus<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency>
6、velocity--------------------------------生成代码时需要用到<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.0</version></dependency>
7、lombok
8、junit
3、创建mp代码生成器
导入生成代码的配置工具类,修改对应的信息,用于生成代码
注意:这个工具类一般放在test目录
package org.java.test;import org.junit.Test;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
/*** @author arjun* @title: CodeGenerator* @description: 描述信息* @date 2023.08.27 09:16*/
public class CodeGenerator {@Testpublic void run() {// 1、创建代码生成器AutoGenerator mpg = new AutoGenerator();// 2、全局配置GlobalConfig gc = new GlobalConfig();String projectPath = System.getProperty("user.dir");gc.setOutputDir("F:\\D118SpringBootFile\\item\\sb_MP" + "/src/main/java");gc.setAuthor("刘文君");gc.setOpen(false); //生成后是否打开资源管理器gc.setFileOverride(false); //重新生成时文件是否覆盖//UserServie// 默认情况下,接口的名称前会有一个字母i,如istuServicegc.setServiceName("%sService"); //去掉Service接口的首字母Igc.setIdType(IdType.AUTO); //主键策略gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型gc.setSwagger2(false);//开启Swagger2模式mpg.setGlobalConfig(gc);// 3、数据源配置DataSourceConfig dsc = new DataSourceConfig();dsc.setUrl("jdbc:mysql://localhost:3306/d118?serverTimezone=GMT%2B8");dsc.setDriverName("com.mysql.jdbc.Driver");dsc.setUsername("root");dsc.setPassword("123456");dsc.setDbType(DbType.MYSQL);mpg.setDataSource(dsc);// 4、包配置PackageConfig pc = new PackageConfig();pc.setModuleName(""); //模块名 可以为空//包pc.setParent("org.java");pc.setController("controller");pc.setEntity("entity");pc.setService("service");pc.setMapper("mapper");mpg.setPackageInfo(pc);// 5、策略配置StrategyConfig strategy = new StrategyConfig();strategy.setInclude("stu","studemo");//数据表名 可同时选择多个表(如果注释此行代码,意味着映射数据库中所有的表)strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作strategy.setRestControllerStyle(true); //restful api风格控制器strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符mpg.setStrategy(strategy);// 6、执行mpg.execute();}
}
4、生成代码
@Accessors(chain = true) //支持链式操作 new stu().setID(1)...;
注意要修改的地方:1、生成的xml包要重新放到resourses文件下,重命名为mapper
5、编写配置类扫描mapper类
@Configuration@MapperScan(basePackages = "com.qs.mapper")public class WebConfig {}
6、编写控制器类
@RestController@RequestMapping("/info")public class InfoController {@Autowiredprivate InfoService infoService;@GetMapping("/init")public List<Info> getList(){return infoService.list(null);}}
通过mybatisPlus生成器生成的代码中,如果没有需要的方法,此时我们可以在service接口以及
Mapper接口中自己声明方法即可
4、swagger
1、什么是swagger
答:Api文档在线自动生成工具
2、作用
根据在代码中使用自定义的注解来生成接口文档,它可以支持在线调试,这个在前后端分离的项目中很重
要。这样做的好处是 在开发接口时可以通过swagger将接口文档定义好,同时也方便以后的维护
3、发展历程
后端时代:前端只用管理静态页面,将整个html交给后端;后端的模板引擎JSP, 后端是主力。前后端分离时代:后端:后端控制层,服务层,数据访问层前端:前端控制层,视图层前端可以伪造后端的数据,通过json跟后端进行交互。现在已经不需要后端,前端工程依然可以运行起来。前后端交互方式:API接口前后端相对独立,松耦合前后端甚至可以部署到不同的服务器上面
产生的问题
1. 前后端集成联调,前端人员和后端人员无法做到及时协商以便尽快解决问题,最终将导致问题集中
爆发
2. 简单来讲,也就是前端不知道后端将提供给前端的接口名字以及后端将传送给前端的数据以及数据
类型
解决方案
首先应该指定计划,实时更新后端提供给前端的最新API,来降低集成的风险。1、比如早些年,会指定word计划文档前后端分离:前端测试后端的接口:postman后端提供接口,需要实时更新最新的消息以及改动不太方便:这样需要特定去下载安装postman2、Swagger:是世界上最流行的API框架RestFull Api文档在线自动生成工具==》Api文档与API接口定义同步更新直接运行,可以在线测试API接口支持多种语言:java、Php
4、一个简单的swagger项目
1、创建springboot项目
2、导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>swqgger主要的4个依赖<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.5.22</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>1.5.22</version></dependency>
步骤太多了。。还是直接看pdf吧
文件查看地址
第四章
1、swagger的使用
2、thymeleaf的使用
@Api(tags="用于描述当前类的信息")--放在控制类上@ApiOperration(value="基本描述信息",notes="详情描述信息")--放在方法上@ApiParam(value = "学生编号id",required = true)--放在参数里面@ApiResponses({@ApiResponse(code = 200,message = "删除成功!"),@ApiResponse(code = 204,message = "服务器成功处理了请求,但没返回任何内容!"),@ApiResponse(code = 400,message = "参数无效!"),@ApiResponse(code = 401,message = "用户未授权!"),@ApiResponse(code = 403,message = "服务器拒绝请求!"),@ApiResponse(code = 404,message = "请求的资源不存在!"),})-----自定义服务器状态 放在方法上@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "学生编号id", required = true,paramType = "query"),@ApiImplicitParam(name = "name", value = "学生姓名", required = true, paramType = "query"),@ApiImplicitParam(name = "score", value = "学生成绩", required = true, paramType = "query"),})---多个参数的设置,放在方法上/*************************实体类*************************/@ApiModel("学生实体类")--放在实体类上@ApiModelProperty(value = "学生编号(主键)", required = false,notes = "编号可以为空,为空则由数据库自动分配")--放在属性上
控制器类上的注解
@RestController---返回josn数据类型@Slf4j------------输出日志@RequestMapping("/studemo")---请求路径@Api(tags = "studemo的控制器类")---控制器类的描述信息
webconfig配置类
package com.java.config;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.VendorExtension;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.ArrayList;/*** @author arjun* @title: webConfig* @description: 描述信息* @date 2023.08.27 11:45*/
@Configuration
@MapperScan(basePackages = "com.java.mapper")
@EnableSwagger2
@EnableTransactionManagement
public class webConfig {//自定义设置swagger文档描述信息@Beanpublic Docket docket01() {//docket--一个docket就是一个swagger标签,用于描述swagger的信息Docket docket=new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("1、扫描所有控制器类");return docket;}@Beanpublic Docket docket02() {//docket--一个docket就是一个swagger标签,用于描述swagger的信息Docket docket=new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//设置条件
// .paths(PathSelectors.ant("/user/**"))// 1、仅对user开头的请求,生成接口文档.apis(RequestHandlerSelectors.basePackage("com.java.controller"))// 2、只对这个包下面的控制器生成接口文档.build().groupName("2、扫描自定义的控制器类");return docket;}//返回swagger的具体描述信息public static final Contact DEFAULT_CONTACT = new Contact("arjun", "https://arjunna.gitee.io", "arjunna@163.com");public ApiInfo apiInfo() {ApiInfo apiInfo=new ApiInfo("swagger的Api文档","所有接口的描述信息及使用方法","1.0","urn:tos",DEFAULT_CONTACT,"Apache 2.0","http://www.apache.org/licenses/LICENSE-2.0",new ArrayList<VendorExtension>());return apiInfo;}
}
1、swagger
看pdf就行
帮助文档:PDF地址
2、thymeleaf
在springboot中可以用jsp作为视图,呈现数据。但是,并不推荐springboot中推荐使用“模板引擎”作为视图呈现数据开发中常用的模板引擎:1、thymeleaf-----------百里香叶2、freemaker3、velocity更多的是使用thymeleaf作为springboot的视图组件,呈现数据
1、使用步骤
1、创建工程
2、导入依赖1、web2、热部署3、lombok4、thymeleaf
3、配置yml文件
server:port: 9999
spring:thymeleaf:enabled: true #启用thymeleafencoding: utf-8 #编码cache: false #页面不缓存数据suffix: .html #模板页面的后缀名mode: HTML #模板页面是以html为基础
4、编写第一个模板页面 index.html要求:模板页必须放在templates目录中如果名称叫作: index.html,则该页面会自动加载如果在页面使用thymeleaf标签,需要导入下列指令<html lang="en" xmlns:th="http://www.thymeleaf.org">
5、编写控制器类用于加载数据,然后在init.html页面显示此处的语法,与springmvc语法一致@Controllerpublic class InfoController {@GetMapping("/")public String init(Model model){//将数据存放在Model中(等同于request),在页面中显示数据model.addAttribute("msg","hello123");Info info = new Info(1,"bruce",99);model.addAttribute("info",info);return "/init";}}
6、在init.html页面,准备在页面中取到存储数据结果是: ${msg}----------- EL表达式取不值,它会原样显示原因是:thymeleaf页面中,不能直接使用EL表达式取值,thymeleaf它有自己的表达式在页面中引入th指令:<html lang="en" xmlns:th="http://www.thymeleaf.org">thymeleaf的表达式不能直接使用,只有在给html标签的属性赋值时才能使用<div th:属性=“${表达式}”></div>
2、thymeleaf中的表达式
在thymeleaf页面中使用thymeleaf标签的基本步骤:1、导入标签指令<html xmlns:th="http://www.thymeleaf.org">2、使用thymeleaf表达式动态取值要求:thymeleaf的表达式不能直接使用,必须作为标签的属性来使用表达式的分类:1、标准变量表达式2、选择变量表达式3、路径表达式
1、标准变量表达式
@@@@@标准变量表达式 ${xxx} ${xxx.属性} ${xxx.xx()}作用:用于从作用域取值,显示在当前位置中<标签 th:text="${xxxx}">静态内容</标签>例如: <span th:text="${msg}">消息</span>如果在容器中运行:那么就会显示${msg}的内容如果在非容器中显示,就只会显示 消息 两个字
2、选择变量表达式
@@@@@@选择变量表达式 *{xxx} *{xxx.属性} *{xxx.xx()}作用:用于从作用域取值,显示在当前位置中<标签 th:text="*{xxxx}">静态内容</标签>例如: <span th:text="*{msg}">消息</span>
3、路径表达式
作用:一般在路径中动态取值时使用语法: @{xxx} @{xxx.xxx} @{xxx.xxx()}
方式1: <a href="del/12345">删除数据1</a>href这种方式传递参数,只能传递固定参数,如果要动态取值向后传递,必须使用th:href@@@@@注意:在thymeleaf中,只有th开头的标签属性才允许动态取值
方式2: <a th:href="'del/'+${info.id}">删除数据2</a><Br>如果要使用th属性动态传递,静态内容要与动态内容分开,静态内容必须包含在‘’中这种方式的缺点:如果参数多了,这种写法很容易出错
方式3: <a th:href="@{|del/${info.id}|}">删除数据3</a><Br>通过路径表达式动态取值简化写法:以上代码可以进行简化 @{}可以省略不写<a th:href="|del/${info.id}|">删除数据4</a><Br>
显示图片<img src="/imgs/4.jpg">这种方式只能显示固定路径的图片<img th:src="'/imgs/'+${photo}"><img th:src="@{|/imgs/${photo}|}"><img th:src="|/imgs/${photo}|">
3、标签语法
1、th:text
th:text该标签属性,用于动态取值显示在当前位置<div th:text="${msg}"></div>
2、th:value
th:value该标签属性,用于动态取值显示在表单组件中,用于进行数据回显编号:<input type="text" th:value="${info.id}"><Br>姓名:<input type="text" th:value="${info.name}"><Br>成绩:<input type="text" th:value="${info.score}"><Br>
注意:有时候修改与新增共享同一个表单组件区别是:新增时表单数据为空,没有默认数据修改时,表单中是有默认数据的编号:<input type="text" th:value="${stu?.id}"><Br>姓名:<input type="text" th:value="${stu?.name}"><Br>成绩:<input type="text" th:value="${stu?.score}"><Br>?表示,如果stu对象存在,就执行后面的取值操作。如果不存在就不执行
3、th:href
作用:设置超连接路径,并且允许在连接路径中动态取值<a th:href="'del/'+${info.id}">删除数据2</a><<a th:href="@{|del/${info.id}|}">删除数据3</a><a th:href="|del/${info.id}|">删除数据3</a>(推荐使用)
4、th:src
作用:设置路径,允许在路径中动态取值<img th:src="'/imgs/'+${photo}"><img th:src="@{|/imgs/${photo}|}"><img th:src="|/imgs/${photo}|">
5、th:attr
作用:用于给标签的属性动态赋值<input type="text" th:attr="value='jack'"><Br>性别:<input type="radio" value="男" name="gender"th:attr="checked=${gender=='男'}">男<input type="radio" value="女" name="gender"th:attr="checked=${gender=='女'}">女
6、th:each
作用:用于对集合遍历,相当于C标签中的forEach<c:forEach items="${list}" var="info" varStatus="st">st:它用于保存当前对象在集合的状态${st.index}---------获得当前对象在集合中的下标 0${st.count}---------获得当前对象在集合中的个数 1${st.first}---------判断当前对象是否是集合中的第1个对象${st.last}---------获得当前对象是否是集合中的最后1个对象<tr th:each="info,st:${list}"><Td th:text="${info.id}"></Td><Td th:text="${info.name}"></Td><Td th:text="${info.score}"></Td><td th:text="${st.index}"></td><td th:text="${st.count}"></td><td th:text="${st.first}"></td><td th:text="${st.last}"></td></tr>
:list--------它表示对哪一个集合遍历info---------它表示从集合中取到的第一个对象st-----------它用于保存当前对象在集合的状态${st.index}---------获得当前对象在集合中的下标 0${st.count}---------获得当前对象在集合中的个数 1${st.first}---------判断当前对象是否是集合中的第1个对象${st.last}---------获得当前对象是否是集合中的最后1个对象
隐藏状态:<tr th:each="info:${list}"><Td th:text="${info.id}"></Td><Td th:text="${info.name}"></Td><Td th:text="${info.score}"></Td><td th:text="${infoStat.index}"></td><td th:text="${infoStat.count}"></td><td th:text="${infoStat.first}"></td><td th:text="${infoStat.last}"></td></tr>使用:在对象info后面加上Stat,则可以触发隐藏状态
7、内敛文本
作用:直接在页面中用表达取值语法:[[${msg}]] [[${info.name}]] [[${info.getScore()}]]msg:[[${msg}]]<Br>编号:[[${info.id}]]<Br>姓名:[[${info.name}]]<Br>成绩:[[${info.getScore()}]]<Br>
8、内联脚本
作用:用于在Js代码中,通过表达式直接取值<script th:inline="javascript">var msg = [[${msg}]];</script>
9、th:switch
作用:根据条件显示不同的结果,类似于java中的switch<div th:switch="${mylevel}"><div th:case="1">一级用户</div><div th:case="2">二级用户</div><div th:case="3">三级用户</div></div>
10、th:if
作用:用于进行逻辑判断<span><b th:if="${info.score>=60}" style="color: green">合格</b><b th:if="${info.score<60}" style="color: red">不合格</b></span><Td><b th:if="${info.score>=90}" style="color:green">优秀</b><b th:if="${info.score>=80 && info.score<90}"style="color:blue">良好</b><b th:if="${info.score>=60 && info.score<80}"style="color:gray">合格</b><b th:if="${info.score<60}" style="color:red">不合格</b></Td>
4、thymeleaf中的内置对象
1、日期
1、与日期相关的内置对象 #dates${#dates.format(属性名,'yyyy-MM-dd')}
作用:按指定格式显示数据出生日期:<b th:text="${#dates.format(bir,'yyyy-MM-dd')}"></b><Br>
出生日期2:<input type="date" th:value="${#dates.format(bir,'yyyy-MMdd')}"></input>
2、数值
2、与数值相关的内置对象 #numbers账户余额:<B th:text="${#numbers.formatCurrency(balance)}"></B>
将当前数值,转换成货币格式显示${#numbers.sequence(1,120)}从1开始到120结束,产生一个序列<select onchange="alert(this.value)"><option value="-1">请选择年龄</option><option th:value="${age}" th:each="age:${#numbers.sequence(1,120)}">[[${age}]]岁</option></select><select onchange="alert(this.value)"><option value="-1">请选择年龄</option><option th:attr="selected=${age==myAge}"th:value="${age}"th:each="age:${#numbers.sequence(1,120)}">[[${age}]]岁</option>
</select>
3、统计
3、与统计相关的内置对象${#aggregates.sum[集合.![属性名]}
作用:用于对集合遍历,得到集合中的对象的某一个属性值相加的总和例如:统计购物车的应付总金额
list集合中,所有学生的总分数为: <B th:text="${#aggregates.sum(list.!
[score])}"></B>
4、作用域
4、作用域相关的一组对象:${xxxx}--------------------它是从request范围中取值${session.xxxx}------------它是从session范围中取值${application.xxxx}-------它是从application范围中取值请求:<b th:text="${message}"></b> <Br>会话:<b th:text="${session.message}"></b> <Br>全局上下文:<b th:text="${application.message}"></b> <Br>/**/另外一种写法:请求: <b th:text="${#request.getAttribute('msg2')}"></b>会话: <b th:text="${#session.getAttribute('msg2')}"></b>上下文: <b th:text="${#servletContext.getAttribute('msg2')}"></b>
3、综合应用
1-2
1、创建工程
2、导入依赖1、web2、热部署3、mysql4、mybatis-plus(3.0.5)5、velocity(用于生成代码)6、thymeleaf7、druid8、lombok9、pagehable
依赖
<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.3.12.RELEASE</version></parent><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.12</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.0</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.5.22</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>1.5.22</version></dependency></dependencies>
3-5
3、导入代码生成的工具类4、生成代码5、编写yml文件
6
6、编写配置类@Configuration@MapperScan(basePackages = "com.qs.mapper")public class WebConfig {}
7-8
7、控制器类8、问题处理注意:thymeleaf的超连接不能直接跳转页面<A href="add.html">添加</A> -----------错误写法
页面两种跳转方式
方式1:编写配置类实现配置跳转@Configuration@MapperScan(basePackages = "com.qs.mapper")public class WebConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {//配置视图的跳转,指定发出什么请求,跳转到哪个页面registry.addViewController("/add").setViewName("add");}}
方式2:编写一个控制器类专门处理跳转@Controllerpublic class ForwardController {@GetMapping("/forward/{page}")public String forward(@PathVariable String page){return "/"+page;}}
注意:在提交表单数据时,如果有日期类型的数据,需要在实体类中日期类型的属性上加上如下注解
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date bir;
相关文章:

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板
文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题 2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类 4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项…...

【JavaWeb】前后端分离SpringBoot项目快速排错指南
1 发起业务请求 打开浏览器开发者工具,同时显示网络(Internet)和控制台(console) 接着,清空控制台和网络的内容,如下图 然后,点击你的业务按钮,发起请求。 首先看控制台…...
Go语言高级特性
目录 1. 并发编程 1.1 Goroutine轻量级线程 1.2 Channel通信机制 1.3 WaitGroup等待组 1.4 Mutex互斥锁 2. 垃圾回收机制 2.1 内存管理介绍 2.2 垃圾回收原理 2.3 性能调优策略 2.4 常见问题及解决方案 3. 接口与反射 3.1 接口定义与实现 3.2 空接口与类型断言 3…...

边缘计算安全有多重要
德迅云安全研究发现边缘安全是对存储或处理在网络边缘的数据的保护。边缘可以用不同的方式定义,但一般来说,它包括企业直接控制之外的任何设备或位置。这可能包括传感器、连接物联网的设备和移动设备。 边缘计算正在彻底改变商业运作方式。这引发了对边缘…...
Uniapp开发入门:构建跨平台应用的全面指南
引言 什么是Uniapp Uniapp是一款由DCloud公司推出的基于Vue.js的跨平台应用开发框架。它的核心理念是“一套代码,多端运行”,开发者只需编写一份代码,即可生成包括iOS、Android、H5、微信小程序、支付宝小程序、百度小程序等多平台的应用。…...
初级银行从业资格证知识点(十)
中国银保监会近年来启动了银行业保险业清廉金融文化建设活动,旨在通过全覆盖参与、全过程融入、全方位提升,增强金融从业人员清廉从业意识,培育清廉金融理念,通过文化的渗透力和影响力,厚植清廉根基,提升金…...
设计模式-13 - Prototype Design Pattern 原型设计模式
设计模式-13 - Prototype Design Pattern 原型设计模式 1.定义 原型设计模式是一种创建对象的方式,它通过复制一个现有的对象(原型)来创建一个新对象。 2.内涵 优点: 创建对象的高效方式:克隆一个对象比从头开始创建…...

05. 【Java教程】第一个 Java 程序
本节我们将以Windows操作系统为例,编写并执行第一个Java程序。在这之前,请确保你的操作系统上已经安装了JDK 1. 编译程序 大家可能有个疑问,为什么需要编译程序呢?计算机不能直接执行我们编写的源代码吗? 这是由于计…...
网易灵犀办公企业邮箱的IMAP和POP3服务器地址
IMAP 电子邮件地址:saleyouxiang.com 帐户类型:IMAP 接收邮件服务器:imaphz.qiye.163.com 发送邮件服务器:smtphz.qiye.163.com 用户名:saleyouxiang.comPOP3 电子邮件地址:saleyouxiang.com 帐户类型&…...

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5
目录 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周:优化算法 (Optimization algorithms)2.3 指数加权平均数(Exponential…...

【正版系统】海外短剧系统功能介绍,前端uniapp+开源。
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、海外短剧系统功能介绍 二、搭建要求 1.系统要求 总结 前言 短剧作为一种快速、紧凑的娱乐形式,正逐渐受到更多海外观众的喜爱。这种需求增长为…...

位图(c++)
文章目录 1.位图概念2.位图的实现3.应用(解决整形存在或次数问题)3.1存在问题3.2次数问题 5.搜索的方法对比: 1.位图概念 和哈希一样,都是一个表来记录某个元素的个数或者存在与否;不同的是哈希使用的计算机定义的完整…...

音源分离 | Hybrid Spectrogram and Waveform Source Separation
一、摘要 本文提出了基于Demucs架构的的时域频域的分离模型。提出的模型在2021年索尼组织的音乐分离挑战中获胜。该架构还包括其他改进,如压缩残差分支、局部注意力或奇异值正则化。 在MusDB HQ数据集上,所有源的信噪比(SDR)平均提…...

动态el-form表单以及动态禁用
当右侧下拉框选中为 长期有效,那么左侧输入框为禁用状态; <el-form-item label"证明有效期" class"is-required"><div v-for"(item,index) in form.arrayDat" :key"index" style"width: 100%;display: flex;justify-co…...

【Web后端】web后端开发简介_Servlet简介
1.web后端开发简介 Java企业级开发,也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态,简单了解即可web后端开发,基于B/S模式的开发体系。…...

Taylor Francis科技期刊数据库文献去哪里获取
一、Taylor & Francis科技期刊数据库简介: Taylor & Francis 科技期刊数据库(T&F ST Library)提供超过520种经专家评审的高质量科学与技术类期刊, 其中超过85%的期刊被Web of Science收录,内容最早至1997年。该科技期…...

C#学习笔记12:Winform网页操作-CefSharp内嵌浏览器
今日学习使用Winform操作网页,先从从窗体内嵌一个浏览器开始吧: 文章提供测试代码讲解、测试效果图、整体测试工程下载 目录 CefSharp介绍与安装: 创建解决方案安装CefSharp: 控件放置: 整体代码贴出: 更改…...

NSSCTF | [SWPUCTF 2021 新生赛]babyrce
打开题目,显示了一个php脚本 我们来分析一下这个脚本是什么意思 <?php error_reporting(0); header("Content-Type:text/html;charsetutf-8"); highlight_file(__FILE__); if($_COOKIE[admin]1) {include "../next.php"; } elseecho &quo…...
环保不只是口号,绿葆自助取袋机助力1000多家医院环保行动!
2023年1月1日起,国家的“限塑令”范围进一步扩大,2023年6月20日起,《商务领域经营者使用、报告一次性塑料制品管理办法》开始实施。从国家到地方,对一次性塑料制品的污染问题治理正在越来越严格。为了响应国家环保政策并为患者提供…...

DELL服务器配置ILO(idrac)地址、修改管理员密码
服务器型号:DELL PowerEdge R630 1、重启服务器选择F2进入BIOS 2、重启服务器选择F2进入BIOS 3、选择“Network” 4、配置iDRAC的IP,掩码网关,DNS等信息 5、Esc返回,下滑选择“User Configuration” 6、配置iDRAC的用户名密码以及…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)
Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...