六:Day01_Spring Boot01

news2024/9/24 9:28:36

一、Spring Boot简介

1. 概念简介

Spring Boot是Spring公司的一个顶级项目,和Spring Framework是一个级别的。

Spring Boot实际上是利用Spring Framework 4 自动配置特性完成。编写项目时不需要编写xml文件。

2. 启动器介绍

Spring Boot的启动器实际上就是一个依赖。这个依赖中包含了整个这个技术的相关jar包,还包含了这个技术的自动配置,以前绝大多数XML配置都不需要配置了。当然了,启动器中自动配置无法实现所有内容的自动配置,在使用Spring Boot时还需要进行少量的配置(这个配置不是在xml中了,而是在properties或yml中即可)。如果是Spring自己封装的启动器的artifact id名字满足:spring-boot-starter-xxxx,如果是第三方公司提供的启动满足:xxxx-spring-boot-starter。

3. Spring Boot特征

  1. 使用Spring Boot可以创建独立的Spring应用程序。

  2. 在Spring Boot中直接嵌入了Tomcat、Jetty、Undertow等Web 容器,所以在使用SpringBoot做Web开发时不需要部署WAR文件。

  3. 通过提供自己的启动器(Starter)依赖,简化项目构建配置。

  4. 尽量的自动配置Spring和第三方库。

  5. 绝对没有代码生成,也不需要XML配置文件。

5. Spring Boot的核心

起步依赖: 起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

自动配置: Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

二、基于Maven工程的Spring Boot项目

1. 配置依赖

  • 在pom.xml中添加一个继承(引入springmvc启动器)

    1. 继承依赖

    2. 继承插件

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.17</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

2. 新建启动类

Spring Boot的启动类的作用是启动Spring Boot项目,是基于Main方法来运行的。

注意:启动类在启动时会做注解扫描(@Controller、@Service、@Repository......),扫描位置为同包或者子包下的注解,所以启动类的位置应放于包的根下。

2.1 启动类与启动器区别

启动类表示项目的启动入口。启动器表示jar包的坐标,必须在包中新建这个类,不能直接放入到java文件夹。

三、resources目录结构

1. 目录结构

2. 说明

  1. static

    • 存放静态资源(图片,css,js,静态html等)。

    • 注意: static目录是SpringBoot可以直接识别的目录,会将其中的静态资源编译到web项目中,并放到tomcat中使用。静态资源的访问路径中无需声明static。例如: http://localhost:8080/a.png。

    • IDEA中经常出现放在static下的静态文件即使重启也不被编译。需要通过Maven面板进行清空缓存,重新编译启动即可识别。

  2. templates

    • thymeleaf,FreeMarker等视图模板。

  3. 自定义cofig目录(也可以直接写配置文件)

    • 存储配置文件application.properties。

四、Spring Boot配置文件

Spring Boot提供一个名称为application的全局配置文件,支持两种格式properteis格式与YML格式。

1. properties格式

  • 例如:配置Tomcat监听端口,配置部署项目名。

server.port=8888
server.servlet.context-path=/test

2. yaml|yml格式

YML格式配置文件的扩展名可以是yaml或者yml,非常适合用来做以数据为中心的配置文件。

2.1基本格式要求
  1. 大小写敏感

  2. 使用缩进代表层级关系

  3. 缩进不允许使用tab,只允许空格

  4. 相同的部分只出现一次

  5. '#'表示注释

3. 配置文件存放位置

  1. 当前项目根目录中

  2. 当前项目根目录下的一个/config子目录中

  3. 项目的resources即classpath类路径中

  4. 项目的resources即classpath类路径下的/config目录中

4. 配置文件加载顺序

4.1 不同格式的加载顺序

如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。

如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。

4.2 不同位置的加载顺序(排序就是依次加载顺序)
  1. config/application.properties

  2. config/application.yml

  3. application.properties

  4. application.yml

  5. resources/config/application.properties

  6. resources/config/application.yml

  7. resources/application.properties

  8. resources/application.yml

五、Spring Boot整合MyBatis

1. 依赖启动器

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>


<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
</dependency>

2. 配置配置文件

在application.yml中添加

# 数据源(数据库连接池) 配置
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  # 加载mybatis配置文件(mybatis有特殊配置时使用)
  # config-location: classpath:mybatis/mybatis-config.xml  
  
  # 加载MyBatis的mapper.xml映射文件(映射接口和映射文件路径不一致时使用)
  # mapper-locations: classpath:mapper/*.xml              
  
  type-aliases-package: com.xxx.pojo        # 实体类定义别名

3. 修改启动类

        1. 使用@MapperScan注解(全局设置)

           在启动类上添加@MapperScan注解,表示mapper接口所在位置

        2.使用@Mapper注解 (局部设置)

           不在启动类上添加@MapperScan必须在UserMapper接口上添加 @Mapper注解。

六、Spring Boot整合Druid

1.添加依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.11</version>
</dependency>

2.编写配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf8
    username: root
    password: root
    # 使用的连接池
    type: com.alibaba.druid.pool.DruidDataSource
     # 连接池的配置信息(可以不用配置)
    druid:
      # 初始化大小,最小,最大
      initial-size: 5
      max-active: 30
      min-idle: 5
      # 配置获取连接等待超时的时间
      max-wait: 60000
      validation-query: SELECT 1 FROM DUAL
      #配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 300000
      test-while-idle: true
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j
      # 配置DruidStatViewServlet
      stat-view-servlet:
        # 登录名
        login-username: admin
        # 登录密码
        login-password: admin
        url-pattern: /druid/*
        # IP白名单(没有配置或者为空,则允许所有访问)
        allow: 192.167.10.1,127.0.0.1
        reset-enable: false
        # 必须启用,要不会404
        enabled: true

七、SpringBoot整合Junit

1. 添加依赖

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

2. 测试类的编写

注意:

  1. 测试类不能叫做Test

  2. 测试方法返回值必须是void

  3. 测试方法必须没有参数

在springBoot2.4之前使用整合单元测试需要写 @SpringBootTest (classes={启动器类名.class})和RunWith(SpringRunner.class)


@SpringBootTest//必须添加此注解
public class MyTest {
    @Autowired
    UserMapper userMapper;
    @Test
    public void test(){
        User user = userMapper.selectById(1L);
    }
} 

如果测试类与启动器不在同一个包下面(com.lyx),需要写成@SpringBootTest (classes={启动器类名.class})

八、Spring Boot整合PageHelper(分页)

Spring Boot整合PageHelper不需要做任何配置文件的配置,添加依赖后就可以直接使用。

1. 添加依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.2</version>
</dependency>

2. 编写代码

代码中一定要注意,要把PageHelper.startPage()写在查询数据库代码之上。

@Service
@Transactional
public class UserServiceImpl implements UserService{
    @Autowired
    private UserMapper userMapper;
    public PageInfo<User> queryByPage(int pageNumber, int pageSize){
        // pageNumber当前页码   pageSize每页显示的条数
        PageHelper.startPage(pageNumber,pageSize);
        
        // 查询全部,查询方法必须是查询多行结果,且没有分页语法。否则无法在sql后面拼接limit子句。
        List<User> users = userMapper.selectAll();
        
        // PageInfo是分页查询所有查询结果封装的类,所有的结果都从这个类取
        PageInfo<Book> pageInfo = new PageInfo<>(users);
        return pageInfo;
    }
}

九、Spring Boot整合logback

Spring Boot默认使用Logback组件作为日志管理。Logback是由log4j创始人设计的一个开源日志组件。在Spring Boot项目中我们不需要额外的添加Logback的依赖,因为在spring-boot-starter或者spring-boot-starter-web中已经包含了Logback的依赖。

1. Logback读取配置文件的步骤

  1. 在classpath下查找文件logback-test.xml

  2. 如果文件不存在,则在classpath下查找logback.xml

2. 使用默认的logback.xml

logging:
  level:
    # 根日志级别
    root: warn
    # 具体包日志级别
    com.xxx.mapper: debug
  file:
    name: mylogs/my.log

3. 自定义logback.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
 <configuration>
    <!--定义日志文件的存储地址-->  
    <property name="LOG_HOME" value="logs/" />  
     
    <!-- 控制台输出 -->   
    <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
       <!-- 日志输出编码 -->  
        <layout class="ch.qos.logback.classic.PatternLayout">   
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </layout>   
    </appender>   
     
    <!-- 按照每天生成日志文件 -->   
    <appender name="RollingFile"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>   
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>   
        <layout class="ch.qos.logback.classic.PatternLayout">  
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
       </layout> 
        <!--日志文件最大的大小-->
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>10MB</MaxFileSize>
       </triggeringPolicy>
    </appender>     

    <!-- 日志输出级别 -->
    <root level="info">   
        <appender-ref ref="Stdout" />   
        <appender-ref ref="RollingFile" />   
    </root>

    <logger name="com.xxx.mapper" level="Trace"></logger>
</configuration>

十、Spring Boot整合JSP

1. 添加依赖

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

2. 在项目中创建webapp目录并将其设置为资源目录

3. 在 yml配置文件中配置视图解析器参数

spring:
  #设置响应路径的前缀和后缀
  mvc:
    view:
      prefix: /WEB-INF/
      suffix: .jsp

4. 在控制类中声明单元方法请求转发jsp资源

@Controller
public class PageController {

    @RequestMapping("page/{pageName}")
    public String toPage(@PathVariable String pageName){
        return pageName;
    }
}

十一、SpringBoot整合Thymeleaf

常用的java模板引擎有Jsp、Freemarker、Thymeleaf 、Velocity 等。

1. Thymeleaf介绍

Thymeleaf是原生的,可以作为静态原型, 不依赖于标签库,它能够在接受原始HTML的地方进行编辑和渲染。

Thymeleaf在Spring Boot项目中放入到resources/templates中。是无法通过浏览器URL直接访问的(和WEB-INF效果一样),必须先走控制器。

模板引擎的示意图:(模板+数据模型=输出)   

2. 使用

1 .添加依赖

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

2.在resources下新建templates文件夹。新建index.html

3.创建页面访问控制器

4.Thymeleaf视图解析器自动加上前缀和后缀

3. Thymeleaf语法

添加命名空间,添加后可以使用提示。

<html xmlns:th="http://www.thymeleaf.org" >
3.1 th:text属性
  • 向指定标签中添加文本节。

<!-- 将th:text中的值添加到标签文本节点中,标签中有内容会覆盖 -->
<h2 th:text="hello"></h2>
3.2 获取域对象中数据
3.2.1 HttpServletRequest
@RequestMapping("page/{pageName}")
public ModelAndView toPage(@PathVariable String pageName, HttpServletRequest request){
    ModelAndView mv = new ModelAndView();
    mv.setViewName(pageName);
    /* 请求域添加数据 */
    request.setAttribute("req", "HttpServletRequest");
    mv.addObject("mod", "HttpServletRequest");
    User user = new User(1, "张三", "123");
    mv.addObject("user", user);
    return mv;
}
<!-- 将th:text中的值添加到标签文本节点中,标签中有内容会覆盖 -->
<span th:text="${#httpServletRequest.getAttribute('req')}"></span>
<span th:text="${#httpServletRequest.getAttribute('mod')}"></span>
<span th:text="${#httpServletRequest.getAttribute('user')}"></span>
<span th:text="${#httpServletRequest.getAttribute('user').uid}"></span>
<hr>
<span th:text="${#request.getAttribute('req')}"></span>
<span th:text="${#request.getAttribute('mod')}"></span>
<span th:text="${#request.getAttribute('user')}"></span>
<span th:text="${#request.getAttribute('user').uname}"></span>
<hr>
<span th:text="${req}"></span>
<span th:text="${mod}"></span>
<span th:text="${user}"></span>
<span th:text="${user.password}"></span>
3.2.2 HttpSession
 <!-- 将th:text中的值添加到标签文本节点中,标签中有内容会覆盖 -->
<span th:text="${#httpSession.getAttribute('ses')}"></span>
<span th:text="${#httpSession.getAttribute('mod')}"></span>
<span th:text="${#httpSession.getAttribute('user')}"></span>
<span th:text="${#httpSession.getAttribute('user').uid}"></span>
<hr>
<span th:text="${#session.getAttribute('ses')}"></span>
<span th:text="${#session.getAttribute('mod')}"></span>
<span th:text="${#session.getAttribute('user')}"></span>
<span th:text="${#session.getAttribute('user').uname}"></span>
<hr>
<span th:text="${session.ses}"></span>
<span th:text="${session.mod}"></span>
<span th:text="${session.user}"></span>
<span th:text="${session.user.password}"></span>
3.2.3 ServletContext
<!-- 将th:text中的值添加到标签文本节点中,标签中有内容会覆盖 -->
<span th:text="${#servletContext.getAttribute('app')}"></span>
<span th:text="${#servletContext.getAttribute('mod')}"></span>
<span th:text="${#servletContext.getAttribute('user')}"></span>
<span th:text="${#servletContext.getAttribute('user').uname}"></span>
<hr>
<span th:text="${application.app}"></span>
<span th:text="${application.mod}"></span>
<span th:text="${application.user}"></span>
<span th:text="${application.user.password}"></span>
3.3 th:value
  • 设置表单元素value属性时使用。

<input type="text" th:value="${name}"/>
3.4 th:if
  • 进行逻辑判断。如果成立该标签生效(显示),如果不成立,此标签无效(不显示)。

  • 注意:判断条件中逻辑判断符号写在${}外面的

<span th:if="${name}!='张三'">会显示</span>
3.5 th:each
  • 循环遍历。

     <!--
        1. th:each=”u,i :${list}” 其中i表示迭代状态。
        2. index:当前迭代器的索引 从0开始
        3. count:当前迭代对象的计数 从1开始
        4. size:被迭代对象的长度
        5. even/odd:布尔值,当前循环是否是偶数/奇数 从0开始
        6. first:布尔值,当前循环的是否是第一条,如果是返回true否则返回false
        7. last:布尔值,当前循环的是否是最后一条,如果是则返回true否则返回false 
      -->
    <table border="1" width="500">
        <tr>
            <td>编号</td>
            <td>姓名</td>
        </tr>
        <tr th:each="u : ${list}">
            <td th:text="${u.uid}" ></td>
            <td th:text="${u.uname}"></td>
        </tr>
    </table>
    3.6 th:href
  • 设置href属性的。取值使用@{}取值 。

<a th:href="@{/del(uid=1,uname='zs')}">跳转一</a>
<!-- 获取作用域值-->
<a th:href="@{/del(uid=${uid)}">跳转二</a>
3.7 th:onclick
  • 点击传递参数的单击事件

<a href="javascript:void(0)"  th:onclick="'del('+${user.uid}+')'">删除</a>
<script>
    function del(id) {
        console.log("接收的数据:" , id);
    }
</script>
3.8 字符串操作

Thymeleaf提供了一些内置对象,内置对象可直接在模板中使用。

  1. 引用内置对象需要使用#

  2. 大部分内置对象的名称都以s结尾。如:strings、numbers、dates

方法解释
${#strings.isEmpty(key)}判断字符串是否为空,如果为空返回true,否则返回false
${#strings.contains(msg,'T')}判断字符串是否包含指定的子串,如果包含返回true,否则返回false
${#strings.startsWith(msg,'a')}判断当前字符串是否以子串开头,如果是返回true,否则返回false
${#strings.endsWith(msg,'a')}判断当前字符串是否以子串结尾,如果是返回true,否则返回false
${#strings.length(msg)}返回字符串的长度
${#strings.indexOf(msg,'h')}查找子串的位置,并返回该子串的下标,如果没找到则返回-1
${#strings.substring(msg, 0, 3)}

截取字串。前包含,后不包含

3.9 日期格式化处理
方法解析
${#dates.format(key)}格式化日期,默认的以浏览器默认语言为格式化标准
${#dates.format(key,'yyyy/MM/dd')}按照自定义的格式做日期转换
${#dates.day(key)}Year:取年
${#dates.month(key)}Month:取月
${#dates.year(key)}Day:取日

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

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

相关文章

CMA、CNAS资质对于第三方软件检测公司意味着什么?

软件企业在了解软件检测时&#xff0c;会常常看到CMA、CNAS字样&#xff0c;那么作为软件行业内重要的合作伙伴第三方软件检测公司来说&#xff0c;CMA、CNAS资质分别是什么?又有什么意义呢? 1、CMA   CMA是中国计量认证的英文简称&#xff0c;是由省级以上人民政府计量行…

电商营销场景的RocketMQ实战01-RocketMQ原理

架构图 Broker主从架构与集群模式 RocketMQ原理深入剖析 Broker主从架构原理 HAConnection与HAClient Broker基于raft协议的主从架构 Consumer运行原理 基础知识 001_RocketMQ架构设计与运行流程分析 RocketMQ这一块&#xff0c;非常关键的一个重要的技术&#xff0c;面试的时候…

操作系统--中断异常

操作系统第一章易错总结 1.操作系统的功能 ⭐ 编译器是操作系统的上层软件&#xff0c;不是操作系统需要提供的功能。 ⭐注意&#xff1a; 1.批处理的主要缺点是缺乏交互性 2.输入/输出指令需要中断操作&#xff0c;中断必须在核心态下执行 3.多道性是为了提高系统利用率和…

使用easyExcel框架报错:服务器缺少字体

后台服务使用easyExcel框架生成表格&#xff0c;但是生成的时候报如下的错误&#xff1a; 这种报错其实就是部署服务的服务器缺少字体&#xff0c;正确的方法是安装字体。需要注意的是&#xff0c;测试环境服务器与生产环境服务器的在配置版本上可能存在差异&#xff0c;因此需…

再探Java集合系列—LinkedHashMap

LinkedHashMap 继承了 HashMap 所以LinkedHashMap也是一种k-v的键值对&#xff0c;并且内部是双链表的形式维护了插入的顺序 LinkedHashMap如何保证顺序插入的&#xff1f; 在HashMap中时候说到过HashMap插入无序的 LinkedHashMap使用了双向链表&#xff0c;内部的node节点包含…

YOLOv8改进 | 2023 | 通过RFAConv重塑空间注意力(深度学习的前沿突破)

一、本文介绍 本文给大家带来的改进机制是RFAConv&#xff0c;全称为Receptive-Field Attention Convolution&#xff0c;是一种全新的空间注意力机制。与传统的空间注意力方法相比&#xff0c;RFAConv能够更有效地处理图像中的细节和复杂模式(适用于所有的检测对象都有一定的…

Python---文件

文件--- 内存中存放的数据在计算机关机后就会消失。要长久保存数据&#xff0c;就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索&#xff0c;引入了“文件”的概念。 一篇文章、一段视频、一个可执行程序&#xff0c;都可以被保存为一个文件&#xff0c;并赋予一个…

一篇文章带你掌握MongoDB

文章目录 1. 前言2. MongoDB简介3. MongoDB与关系型数据库的对比4. MongoDB的安装5. Compass的使用6. MongoDB的常用语句7. 总结 1. 前言 本文旨在帮助大家快速了解MongoDB,快速了解和掌握MongoDB的干货内容. 2. MongoDB简介 MongoDB是一种NoSQL数据库&#xff0c;采用了文档…

每日一练2023.11.30——谁先倒【PTA】

题目链接&#xff1a;谁先倒 题目要求&#xff1a; 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就输了&#xff0…

只需根据接口文档,就能轻松开发 get 和 post 请求的脚本

一般的接口文档描述的内容&#xff1a; 开发get请求的脚本&#xff0c;接口文档的描述如下&#xff1a; 在loadrunner里面创建一个空脚本&#xff1a; 在action空白处&#xff0c;点击insert—>step 输入web_custom_request&#xff0c;双击选择该函数&#xff0c;填入如下几…

教育企业CRM选择技巧

教育行业的发展一波三折&#xff0c;要想在激烈的赛道脱颖而出&#xff0c;就需要有一套有效的CRM系统&#xff0c;来帮助教育机构提升招生效率、增加学员留存、提高教学质量。下面说说&#xff0c;教育企业选择CRM系统要具备的四大功能。 1、招生管理功能 教育机构的首要目标…

keepalive路由缓存实现前进刷新后退缓存

1.在app.vue中配置全局的keepalive并用includes指定要缓存的组件路由name名字数组 <keep-alive :include"keepCachedViews"><router-view /></keep-alive>computed: {keepCachedViews() {console.log(this.$store.getters.keepCachedViews, this.…

因为jsp for循环的一个空格引起的错误

<c:forEach items"${user.role} " var"role"> <c:forEach items"${user.role}" var"role"> 去掉空格正确显示 &#xff0c;为此排查了2个小时代码逻辑

怎样搭建好Google关键词广告账号结构

搭建好Google关键词广告账号结构对于实现广告效果的最大化至关重要。本文小编将为您提供一些关于如何搭建好Google关键词广告账号结构的建议和步骤。 1、设定目标和策略 在开始搭建广告账号结构之前&#xff0c;首先需要明确您的广告目标和策略。您想要增加网站流量还是提高转…

设计模式之装饰模式(2)--有意思的想法

目录 背景概述概念角色 基本代码分析❀❀花样重难点聚合关系认贼作父和认孙做父客户端的优化及好处继承到设计模式的演变过程 总结 背景 这是我第二次写装饰模式&#xff0c;这一次是在上一次的基础上进一步探究装饰模式&#xff0c;这一次有了很多新的感受和想法&#xff0c;也…

盘点:信息化、智能化、可视化监控系统EasyCVR能给高危行业带来哪些好处

在当前社会中&#xff0c;高危行业的安全问题备受关注。为了有效预防事故的发生&#xff0c;信息化、智能化和可视化监控系统被广泛应用于各个高危行业。本文将从多个角度分析并总结&#xff0c;这些系统给高危行业带来的好处。 一、实时监控与预警能力 国标GB28181视频平台E…

【Java Web学习笔记】0 - 技术体系的说明

B/S软件开发架构简述 B/S架构 1.B/S框架&#xff0c;意思是前端(Browser浏览器)和服务器端( Server )组成的系统的框架结构。 2. B/S架构也可理解为web架构&#xff0c;包含前端、后端、数据库三大组成部分。 3.示意图 ●前端 前端开发技术工具包括三要素: HTML、CSS和Jav…

WIN10系统自带硬盘测速工具使用

前段时间在捣腾电脑硬盘这一块&#xff0c;因为现在固态硬盘价格比较低了&#xff0c;所以想换一下&#xff0c;给自己的电脑升个级。现在硬盘有多种接口&#xff0c;常见的就是SATA&#xff0c;mSATA&#xff0c;m.2, NVME&#xff0c;PCIE。这里PCIE的接口是直连的&#xff0…

基于Java SSM框架+Vue实现汉服文化平台网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现汉服文化平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

zookeeper 单机伪集群搭建简单记录(实操课程系列)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper 1、官方下载加压后&#xff0c;根目录下新建data和log目录&#xff0c;然后分别拷贝两份&#xff0c;分别放到D盘&#xff0c;E盘&#xff0c;F盘 2、data目录下面…