Thymeleaf快速入门(Spring版)

news2024/12/23 19:16:09

文章目录

  • Thymeleaf快速入门(Spring版)
    • 1、Thymeleaf概述
    • 2、Thymeleaf快速入门
    • 3、Thymeleaf基础语法
      • 3.1 th属性
      • 3.2 标准表达式语法
        • 3.2.1 变量表达式
        • 3.2.2 选择表达式
        • 3.2.3 URL表达式
        • 3.2.3 链接表达式
        • 3.2.4 国际化表达式
        • 3.2.5 片段引用表达式

Thymeleaf快速入门(Spring版)

在这里插入图片描述

1、Thymeleaf概述

  • 什么是Thymeleaf

    Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎

    官网:Thymeleaf

  • 什么是Java模板引擎?

    模板引擎不是某一特定领域的技术,它是跨领域跨平台的概念。本文要讲的Java领域的模板引擎,Java模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档(这个特定的文档可以称之为模板,模板中套用不同的数据展示不同的视图,从而实现动态交互),用于网站的模板引擎就会生成一个标准的HTML文档

    简而言之,Java模板引擎本质就是一个特定的文档,当我们注入不同的数据,该文档会被解析成不同的HTML文档,从而展示不同的网页


    较为常见的Java模板引擎有:JSPThymeleaf、FreeMaker、Velocity等模板引擎

  • Thymeleaf的特点

    • 动静结合。Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果,也可以通过 Web 应用程序进行访问,查看动态页面效果。
    • 开箱即用。Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
    • 多方言支持。它提供了 Thymeleaf 标准和 Spring 标准两种方言,可以直接套用模板实现 JSTL、 OGNL 表达式;必要时,开发人员也可以扩展和创建自定义的方言。
    • 与SpringBoot完美整合。SpringBoot 为 Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 设置了视图解析器,因此 Thymeleaf 可以与 Spring Boot 完美整合
  • Thymeleaf的优点

    • 动态交互。一个模板注入不同的数据,会展示不同的网页

    • 动静分离。 Thymeleaf使用HTML通过一些特定标签语法代表其含义,但并未破坏HTML结构,即使无网络、不通过后端渲染也能在浏览器成功打开,大大方便界面的测试和修改(解决了JSP调试困难的弊端)

    • 降低了项目的复杂性。Thymeleaf将前后端分离开来,让专业的人干专业的事,避免了JSP的前后端混写的缺点,大大提高了开发效率

    • 易于使用。Thymeleaf模板引擎被主流的Springboot框架集成,Springboot官方做了很多默认配置,开发者只需编写对应html即可,大大减轻了上手难度和配置复杂度

  • Thymeleaf的作用

    • 渲染1页面。让页面能够动态展示数据
    • 提高用户体验。即使不启动Web应用,也可以直接在浏览器中打开并正确显示模板页面

2、Thymeleaf快速入门

t_book表:

image-20220924203100539

创建Maven项目
导入依赖
编写组件
测试
编写web.xml
编写实体类
编写Thymeleaf
  • Step1:创建Maven项目

    目录结构:

    image-20220924190943471

  • Step2:导入依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>Thymeleaf</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>war</packaging>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <!--mysql驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.16</version>
            </dependency>
            <!--servlet-api-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
            </dependency>
    
            <!--===========thymeleaf所依赖的jar包===============-->
            <!--attoparser,用于解析thymeleaf-->
            <dependency>
                <groupId>org.attoparser</groupId>
                <artifactId>attoparser</artifactId>
                <version>2.0.5.RELEASE</version>
            </dependency>
            <!--javassist,用来处理Java字节码的类库-->
            <dependency>
                <groupId>org.javassist</groupId>
                <artifactId>javassist</artifactId>
                <version>3.28.0-GA</version>
            </dependency>
            <!--log4j-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <!--slf4j-->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.30</version>
            </dependency>
            <!--slf4j-log4j12-->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.25</version>
            </dependency>
            <!--ngnl,-->
            <dependency>
                <groupId>ognl</groupId>
                <artifactId>ognl</artifactId>
                <version>3.1.26</version>
            </dependency>
            <!--thymeleaf核心依赖-->
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf</artifactId>
                <version>3.0.12.RELEASE</version>
            </dependency>
            <!--unbescape,Java的转义库-->
            <dependency>
                <groupId>org.unbescape</groupId>
                <artifactId>unbescape</artifactId>
                <version>1.1.6.RELEASE</version>
            </dependency>
            <!--========================================-->
        </dependencies>
    
        <build>
            <plugins>
                <!--tomcat7插件-->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <port>8080</port>
    <!--                    <path>/index</path>-->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
  • Step3:编写web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <!-- 在上下文参数中配置 -->
        <!--配置视图前缀-->
        <context-param>
            <param-name>view-prefix</param-name>
            <param-value>/html/</param-value>
        </context-param>
        <!--配置视图后缀-->
        <context-param>
            <param-name>view-suffix</param-name>
            <param-value>.html</param-value>
        </context-param>
    </web-app>
    
  • Step4:编写实体类

    略……

  • Step5:编写组件

    1)数据访问层……

    2)业务逻辑层……

    3)控制层

    ViewBaseServlet

    package com.hhxy.controller;
    
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.WebContext;
    import org.thymeleaf.templatemode.TemplateMode;
    import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author ghp
     * @date 2022/9/21
     */
    public class ViewBaseServlet extends HttpServlet {
    
        private TemplateEngine templateEngine;
    
        /**
         * 初始化方法
         */
        @Override
        public void init() throws ServletException {
    
            // 1、获取ServletContext对象
            ServletContext servletContext = this.getServletContext();
    
            // 2、创建Thymeleaf解析器对象
            ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(servletContext);
    
            // 3、给解析器对象设置参数
            // 3.1 HTML是默认模式,明确设置是为了代码更容易理解
            templateResolver.setTemplateMode(TemplateMode.HTML);
    
            //3.2 设置前缀
            String viewPrefix = servletContext.getInitParameter("view-prefix");
    
            templateResolver.setPrefix(viewPrefix);
    
            //3.3 设置后缀
            String viewSuffix = servletContext.getInitParameter("view-suffix");
    
            templateResolver.setSuffix(viewSuffix);
    
            //3.4 设置缓存过期时间(毫秒)
            templateResolver.setCacheTTLMs(60000L);
    
            //3.5 设置是否缓存
            templateResolver.setCacheable(true);
    
            //3.6 设置服务器端编码方式
            templateResolver.setCharacterEncoding("utf-8");
    
            // 4、创建模板引擎对象
            templateEngine = new TemplateEngine();
    
            // 5、给模板引擎对象设置模板解析器
            templateEngine.setTemplateResolver(templateResolver);
    
        }
    
        /**
         * 处理模板
         * @param templateName 模板的名字
         */
        protected void processTemplate(String templateName, HttpServletRequest req, HttpServletResponse resp) throws IOException {
            // 1、设置响应体内容类型和字符集
            resp.setContentType("text/html;charset=UTF-8");
    
            // 2、创建WebContext对象
            WebContext webContext = new WebContext(req, resp, getServletContext());
    
            // 3、处理模板数据
            templateEngine.process(templateName, webContext, resp.getWriter());
        }
    }
    

    IndexServlet

    package com.hhxy.controller;
    
    import com.hhxy.pojo.Book;
    import com.hhxy.service.BookService;
    import com.hhxy.service.imp.BookServiceImp;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    import java.util.List;
    
    /**
     * @author ghp
     * @date 2022/9/21
     */
    @WebServlet("/indexServlet")
    public class IndexServlet extends ViewBaseServlet {
        //1、获取BookService对象
        private BookService bookService = new BookServiceImp();
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //2、调用BookService对象的方法,获取数据
            List<Book> books = bookService.selectAll();
            //3、将数据保存到Session域对象中
            HttpSession session = request.getSession();
            session.setAttribute("books",books);
    
            /*
            thymeleaf会将 逻辑视图名称 对应到 物理视图名称
            逻辑视图名称:index
            物理视图名称:view-prefix(前缀) + 逻辑视图名称 + view-suffix(后缀)
            真实的视图名称:   /html/          index       .html (看web.xml中的配置)
             */
            super.processTemplate("index",request,response);
    
        }
    }
    
  • Step6:编写Thymeleaf

    <!DOCTYPE html>
    <!--一定要记得设置thymeleaf的命名空间-->
    <html xmlns:th="http://www.thymeleaf.org">
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>index</title>
    </head>
    <body>
    <table border="1px" align="center">
        <tr>
            <td>书名</td>
            <td>书的单价</td>
            <td>书的库存</td>
        </tr>
        <tr th:if="${#lists.isEmpty(session.books)}">
            <td colspan="4">对不起,库存为空!</td>
        </tr>
        <tr th:unless="${#lists.isEmpty(session.books)}" th:each="book : ${session.books}">
            <td th:text="${book.getName()}"></td>
            <td th:text="${book.getPrice()}"></td>
            <td th:text="${book.getStock()}"></td>
        </tr>
    </table>
    </body>
    </html>
    
  • Step7:测试

    image-20220924202932777

3、Thymeleaf基础语法

在使用Thymeleaf之前,我们首先要在页面的html标签中声明命名空间。

<html xmlns:th="http://www.thymeleaf.org">
  • 为什么要引入命名空间?

    引入命名空间的目的是为了避免命名冲突,比如在Thymeleaf中我们是使用$符获取域对象中的值的,当我们页面中引入了JQuery后,在JQuery中使用$是获取结点对象,这就会产生冲突导致页面无法正常展示。当然不声明Thymeleaf命名空间也是能够使用Thymeleaf的。

Thymeleaf 作为一种模板引擎,它拥有自己的语法规则。Thymeleaf 语法分为以下 2 类:

  • th属性
  • 标准表达式语法

3.1 th属性

image-20220924210028307

  • th:eache

    • status中,有count(获取循环的次数,从1开始)、first(判断是否为第一次循环)、index(获取循环的索引号,从0开始)、event(判断count是否为偶数)、last(判断是否是最后一次循环)、odd(判断count是否为奇数)、size(获取集合的长度)

          <tr th:each="employee,status : ${employees}">
              <td th:text="${status.count}"></td>
          </tr>
      

拓展:

  • th:field:获取域对象的属性值,后台不能用reques.setAttribute()来传值,可以用model.addAttribute()来传值;而这两种方式th:value都可以接收;在单选框中,当th:field中的属性值与value的值一样,单选框就会被选中

3.2 标准表达式语法

Thymeleaf 模板引擎支持多种表达式:

  • 变量表达式${...}
  • 选择变量表达式*{...}
  • 链接表达式@{...}
  • 国际化表达式#{...}
  • 片段引用表达式~{...}

知识拓展

变量表达式和国际化表达式都属于OGNL(Objects-Graph Navigation Language,对象导航图语言)是应用于Java中的一个开源的表达式语言

3.2.1 变量表达式

变量表达式(Variable Expressions):用于在模板中引用和显示变量的值。例如,${variable}表示引用名为variable的变量

  • 使用 ${} 包裹的表达式被称为变量表达式,该表达式具有以下功能:

    • 获取对象的属性或方法

    • 获取内置的基本对象并使用

    • 获取内置的工具对象并使用

  • ${对象.属性/方法名}:获取对象的属性或方法

    //获取对象的方法
    ${book.getName()}
    
  • ${#内置的基本对象}:获取内置的基本对象并使用

    • ctx :上下文对象
    • vars :上下文变量
    • locale:上下文的语言环境
    • request:HttpServletRequest 对象(仅在 Web 应用中可用)
    • response:HttpServletResponse 对象(仅在 Web 应用中可用)
    • session:HttpSession 对象(仅在 Web 应用中可用)
    • servletContext:ServletContext 对象(仅在 Web 应用中可用)
    //获取Session域对象中存储的List集合对象
    //方式一:
    ${#session.getAttribute('books')
    //方式二:
    ${session.books}
    
  • ${#内置的工具对象}:获取内置的工具对象并使用

    • strings:字符串工具对象,常用方法有:equals、equalsIgnoreCase、length、trim、toUpperCase、toLowerCase、indexOf、substring、replace、startsWith、endsWith,contains 和 containsIgnoreCase 等
    • numbers:数字工具对象,常用的方法有:formatDecimal 等
    • bools:布尔工具对象,常用的方法有:isTrue 和 isFalse 等
    • arrays:数组工具对象,常用的方法有:toArray、length、isEmpty、contains 和 containsAll 等
    • lists/sets:List/Set 集合工具对象,常用的方法有:toList、size、isEmpty、contains、containsAll 和 sort 等
    • maps:Map 集合工具对象,常用的方法有:size、isEmpty、containsKey 和 containsValue 等
    • dates:日期工具对象,常用的方法有:format、year、month、hour 和 createNow 等
    //使用内置工具对象 strings 的 equals 方法,来判断字符串与对象的某个属性是否相等
    ${#strings.equals('张三',name)}
    
3.2.2 选择表达式

选择表达式(Selection Expressions):用于从对象中选择属性或方法。例如,*{user.name}表示选择user对象的name属性。

选择变量也可以称为星号表达式,表达式与变量表达式功能基本一致,只是在变量表达式的基础上增加了与 th:object 的配合使用。当使用 th:object 存储一个对象后,我们可以在其后代中使用选择变量表达式*{...}获取该对象中的属性,其中,*即代表该对象

<div th:object="${session.user}" >
    <!--直接获取user对象中的userName属性的值-->
    <p th:text="*{userName}">firstname</p>
</div>
3.2.3 URL表达式

URL表达式(URL Expressions):用于生成动态URL链接。例如,@{/path}会生成相对于当前上下文路径的URL。

  • 链接表达式的形式结构如下:
    • 无参请求:@{/xxx}
    • 有参请求:@{/xxx(k1=v1,k2=v2)}
3.2.3 链接表达式

链接表达式(Link Expressions):类似于URL表达式,用于生成页面内部的锚点链接。例如,#fragmentId会生成一个指向具有相应片段标识符的位置的链接。

链接表达式是用于生成页面内部的锚点链接(即片段标识符)。它们使用#符号作为前缀,后跟片段标识符。例如,#fragmentId会生成一个指向具有相应片段标识符的位置的链接。链接表达式主要用于在同一页面内部进行导航和定位。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Link and URL Expression Demo</title>
</head>
<body>
    <h1>Link and URL Expression Demo</h1>
    
    <p>Link Expression:</p>
    <a th:href="#section1">Go to Section 1</a>
    <a th:href="#section2">Go to Section 2</a>
    
    <p>URL Expression:</p>
    <a th:href="@{/path1}">Link to Path 1</a>
    <a th:href="@{/path2}">Link to Path 2</a>

    <!-- Assume there are corresponding sections and paths in the application -->
    <section id="section1">
        <h2>Section 1</h2>
        <p>This is section 1 content.</p>
    </section>
    <section id="section2">
        <h2>Section 2</h2>
        <p>This is section 2 content.</p>
    </section>
</body>
</html>

在上面的示例中,我们使用Thymeleaf的链接表达式和URL表达式创建了一些链接。

链接表达式使用#符号,并通过th:href属性生成到相应片段标识符的锚点链接。例如,<a th:href="#section1">Go to Section 1</a>会生成一个链接,点击后将滚动至具有section1片段标识符的位置。

URL表达式使用@符号,并通过th:href属性生成动态的URL链接。例如,<a th:href="@{/path1}">Link to Path 1</a>会生成相对于当前上下文路径的URL,点击后将导航到/path1

3.2.4 国际化表达式

国际表达式使用的基本步骤:

  1. 配置国际化资源文件:首先,在项目中配置对应的国际化资源文件,按照不同语言创建不同的属性文件,如messages_en.properties(英语)、messages_zh_CN.properties(中文)等。每个属性文件中包含了对应语言的键值对,用于表示不同语言下的文本信息。
  2. 设置 Locale 解析器:在 Spring MVC 中,需要配置 LocaleResolver 来解析用户的语言偏好,并将其应用到 Thymeleaf 视图中。常见的 LocaleResolver 有 CookieLocaleResolverSessionLocaleResolver等,你可以根据需求选择合适的LocaleResolver。
  3. 在 Thymeleaf 模板中使用国际化表达式:在 Thymeleaf 模板中,可以使用国际化表达式来获取对应语言的文本信息。通过#{}来包裹键名,Thymeleaf 会根据当前 Locale 自动寻找对应的属性值。例如,<span th:text="#{welcome.message}"></span> 表示从国际化资源文件中获取键为 “welcome.message” 的文本信息并显示在HTML中。
3.2.5 片段引用表达式

Thymeleaf的片段引用表达式(Fragment Expression)是一种在模板中引用和渲染片段的方式。它允许将一个或多个片段从其他模板中提取出来并在当前模板中进行引用和渲染。

Thymeleaf的片段引用表达式使用~{}包裹片段名称,并可以传递参数。以下是使用片段引用表达式的基本语法:

复制代码<div th:insert="~{templateName :: fragmentName(parameter1='value1', parameter2='value2')}"></div>

其中,templateName表示模板文件名,fragmentName表示片段名称。通过::符号来连接模板文件名和片段名称。在片段引用表达式中,还可以传递参数给被引用的片段。参数以键值对的形式传递,使用逗号分隔。

示例中的parameter1parameter2是片段中定义的参数名称,value1value2是要传递的实际值。

使用片段引用表达式可以将片段从其他模板中提取出来并插入到当前模板的指定位置。这有助于模块化开发和代码复用,可以将通用的部分抽离出来,减少重复代码的编写。

需要注意的是,被引用的片段必须在对应的模板文件中存在,并且在片段定义处使用th:fragment属性进行标记。例如,在templateName.html模板文件中定义一个片段:

html复制代码<div th:fragment="fragmentName">
    <!-- 片段内容 -->
</div>

然后在另一个模板中使用片段引用表达式来引用和渲染该片段:

html复制代码<div th:insert="~{templateName :: fragmentName}"></div>

通过使用Thymeleaf的片段引用表达式,我们可以方便地将模板中的特定部分提取出来并在其他模板中重复使用,提高了代码的可维护性和重用性。

参考文章

  • Thymeleaf教程(10分钟入门)
  • 代码重工
  • OGNL 表达式_MyBatis 入门教程
  • ognl概念和原理详解
  • cloudfavorites/favorites-web: 云收藏 Spring Boot 2.X 开源项目 (github.com):

  1. 渲染就是将Java对象中的数据显示到网页上的这个过程 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习——一元线性回归构造直线,并给出损失函数

目 录 Question 问题分析 1.概念补充 2.流程分析 3.注意 具体实现 最终成果 代码 思考&#xff1a; Question 在二维平面有n个点&#xff0c;如何画一条直线&#xff0c;使得所有点到该直线距离之和最短 如果能找到&#xff0c;请给出其损失函数 问题分析 1.概念…

BASH shell脚本篇2——条件命令

这篇文章介绍下BASH shell中的条件相关的命令&#xff0c;包括&#xff1a;if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令&#xff0c;请参考&#xff1a;BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…

visio将形状、图形、文字、符合进行任意角度旋转(已解决)

第一步&#xff1a;选择一个形状&#xff0c;并选定它&#xff0c;如下图 第二步&#xff1a;在视图中&#xff0c;按顺序点击 会弹出一个位置框&#xff0c;如下图。 这里设置 角度的值 为 35deg&#xff0c;按“回车键”&#xff0c;如下图

爆肝整理,常问接口自动化测试面试题+答案(详全)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

LLMs: 强化学习从人类反馈中学习Reinforcement learning from human feedback (RLHF)

让我们考虑一下文本摘要的任务&#xff0c; 即使用模型生成一段简短的文本&#xff0c;捕捉 较长的文章中最重要的观点。 您的目标是通过向模型 展示人工生成的摘要示例&#xff0c;使用微调来提高模型的总结能力。 2020年&#xff0c;OpenAI的研究人员发表了一篇论文&#xff…

【SQL】mysql创建定时任务执行存储过程--20230928

1.先设定时区 https://blog.csdn.net/m0_46629123/article/details/133382375 输入命令show variables like “%time_zone%”;&#xff08;注意分号结尾&#xff09;设置时区&#xff0c;输入 set global time_zone “8:00”; 回车,然后退出重启&#xff08;一定记得重启&am…

定时任务管理平台青龙 QingLong

一、关于 QingLong 1.1 QingLong 介绍 青龙面板是支持 Python3、JavaScript、Shell、Typescript 多语言的定时任务管理平台&#xff0c;支持在线管理脚本和日志等。其功能丰富&#xff0c;能够满足大部分需求场景&#xff0c;值得一试。 主要功能 支持多种脚本语言&#xf…

《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.6.1 函数类 如果把模型看作一个函数&#xff0c;我们设计的更强大的模型则可以看作范围更大的函数。为了使函数能逐渐靠拢到最优解&#xff0c;应尽量使函数嵌套&…

Java 基于 SpringBoot 的在线学习平台

1 简介 基于SpringBoot的Java学习平台&#xff0c;通过这个系统能够满足学习信息的管理及学生和教师的学习管理功能。系统的主要功能包括首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;课程信息管理&#xff0c;类型管理&#xff0c;作业信息…

F12报错前端对应请求接口未在NetWork显示

问题背景 今天看到一个接口在部分情况下为正常渲染数据 发现是后端发送数据有问题&#xff0c;但是在NetWork里面怎么都找不到 问题原因 翻看代码&#xff0c;发现是一种异步请求 内部报错了&#xff0c;所以浏览器看不到接口 具体情况 翻看控制台&#xff1a; 发现属性未…

QT用户登录注册,数据库实现

登录窗口头文件 #ifndef LOGINUI_H #define LOGINUI_H#include <QWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QMessageBox>#include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> …

【力扣每日一题】2023.9.28 花期内花的数目

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个二维数组来表示花期&#xff0c;在一段花期之内花是开的。另外给我们一个一维数组表示来人的时间&#xff0c;要我们返回一个一…

使用Vue3+elementPlus的Tree组件实现一个拖拽文件夹管理

文章目录 1、前言2、分析3、实现4、踩坑4.1、拖拽辅助线的坑4.2、数据的坑4.3、限制拖拽4.4、样式调整 1、前言 最近在做一个文件夹管理的功能&#xff0c;要实现一个树状的文件夹面板。里面包含两种元素&#xff0c;文件夹以及文件。交互要求如下&#xff1a; 创建、删除&am…

三子棋小游戏(简单详细)

设计总体思路 实现游戏可以一直玩&#xff0c;先打印棋盘&#xff0c;玩家和电脑下棋&#xff0c;最后分出胜负。 如果编写较大的程序&#xff0c;我们可以分不同模块 例如这个三子棋&#xff0c;我们可以创建三个文件 分别为&#xff1a; game.h 函数的声明game.c 函数…

求臻医学:乳腺癌治疗与基因检测 探索个性化医疗的未来

乳腺癌是全球女性最常见的恶性肿瘤&#xff0c;2020年全球新发乳腺癌病例约为230万&#xff0c;发病率超过肺癌&#xff0c;位居全部恶性肿瘤首位&#xff01;本文将为您总结乳腺癌的治疗策略与基因检测&#xff0c;揭示个性化医疗的重要意义。 乳腺癌的诊疗 早期乳腺癌通常不…

小程序echarts折线图去除圆圈

如图&#xff0c;默认的折线图上面是有圆圈的&#xff0c;鼠标放上去或者手指触摸的话会有对应的文字出现&#xff0c;但很多时候我们不需要这个圆圈&#xff0c;怎么办呢&#xff0c;其实很简单&#xff0c;只要在 series 中设置属性 showSymbol 为false 就好啦 symbol: none,…

SpringCloud Gateway--Predicate/断言(详细介绍)下

&#x1f600;前言 本篇博文是关于SpringCloud Gateway–Predicate/断言&#xff08;详细介绍&#xff09;下&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以…

(三)Python变量类型和运算符

所有的编程语言都支持变量&#xff0c;Python 也不例外。变量是编程的起点&#xff0c;程序需要将数据存储到变量中。 变量在 Python 内部是有类型的&#xff0c;比如 int、float 等&#xff0c;但是我们在编程时无需关注变量类型&#xff0c;所有的变量都无需提前声明&#x…

从C语言到C++:C++入门知识(2)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关C的基础知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

云原生之使用Docker部署PDF多功能工具Stirling-PDF

云原生之使用Docker部署PDF多功能工具Stirling-PDF 一、Stirling-PDF介绍1.1 Stirling-PDF简介1.2 Stirling-PDF功能 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Stirli…