浅浅入门SpringBoot之Thymeleaf模板

news2025/2/26 22:58:15

Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发模板引擎是一个技术名词,是跨领域跨平台的概念,在Java语言体系下有模板引擎,在C#、PHP语言体系下也有模板引擎,甚至在 Javascript中也会用到模板引擎技术,Java生态下的模板引擎有 Thymeleaf、 Freemaker、Ⅴ elocity、 Beetl(国产)等。

Thymeleaf对网络环境不存在严格的要求,既能用于web环境下,也能用于非web环境下。在非web环境下,他能直接显示模板上的静态数据;在web环境下,它能像Jsp一样从后台接收数据并替换掉模板上的静态数据。它是基于HTML的,以HIML标签为载体,Thymeleaf要寄托在HTML标签下实现。

Spring Boot集成了 Thymeleaf模板技术,并且 Spring boot官方也推荐使用 Thymeleaf来替代JSP技术, Thymeleaf是另外的一种模板技术,它本身并不属于 Spring Boot, Spring Boot只是很好地集成这种模板技术,作为前端页面的数据展示,在过去的 Java Web开发中,我们往往会选择使用Jsp去完成页面的动态渲染,但是jsp需要翻译编译运行,效率低

官网https://www.thymeleaf.org/

SpringBoot框架集成Thymealeaf,Thymealeaf代替jsp。

IDEA设置默认模板

SpringBoot简单实用Thymealeaf

@Controller

public class ControllerA {
    @RequestMapping("/hello")

    public String A(HttpServletRequest request){

        request.setAttribute("data","Thymeleaf hello world");

        //指定视图

        //逻辑名称

        return "A";

    }

}

<!DOCTYPE html>

<html lang="en" xmlns:th="http://www.thymeleaf.org">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

Thymeleaf显示数据:<p th:text="${data}"></p>

</body>

</html>

Thymeleaf模板之常用设置

application.properties配置

#开发阶段,关闭模板缓存,立即生效

spring.thymeleaf.cache=false
#编码格式

spring.thymeleaf.encoding=utf-8
#模型的类型(默认html)

spring.thymeleaf.mode=HTML
#模板前缀、模板引擎存放路径 默认classpath:/templates/

spring.thymeleaf.prefix=classpath:/templates/

#模板后缀 默认.html

spring.thymeleaf.suffix=.html

Thymeleaf模板之标准变量表达式

 表达式是在页面获取数据的一种Thymeleaf语法。列:${ key}

注意:th:text=””是Thymeleaf的一个属性,用于显示文本信息。

标准变量表达式用于访问容器(tomcat)上下文环境中的变量,功能和EL中的${}相同。Thymeleaf中的变量表达式使用${变量名}的方式获取Controller中model其中的数据(request作用域中的数据)。

标准变量表达式语法:${key},作用:获取key对于的文本数据,key是request作用域中的key,使用request.setAttribute(),model.addAttribute()

在html页面中获取数据th:text=”${key}”

@Controller

@RequestMapping("/t")

public class ControllerB {

    @RequestMapping("/hello2")

    public String B(Model model){

        model.addAttribute("Student",new Student(1,"小红","女"));

        System.out.println("ControllerB");

        return "abc";

    }

}

<body>
student:<p th:text="${Student.id}"></p>
<p th:text="${Student.name}"></p>
<p th:text="${Student.sex}"></p>
</body>

Thymeleaf模板之选择变量表达式

语法格式:*{key}             作用:获取key对应的数据库,*{key}需要和th:object这个属性一起使用。

@RequestMapping("/hello3")

public String C(Model model){

    model.addAttribute("Student",new Student(1,"小明","男"));

    System.out.println("ControllerC");

    return "C";

}

<div th:object="${Student}">
    <p th:text="*{id}"></p>
    <p th:text="*{name}"></p>
    <p th:text="*{sex}"></p>
</div>
<p th:text="*{Student.name}"></p>

Thymeleaf模板之链接表达式

语法:@{url}  作用:表示链接

列如:

<link href="...">

<a href="..."></a>

<script src="..."></script>

<form action="..."></form>

<img src="...">

//链接表达式

@GetMapping("/link")

public String link(Model model){

    model.addAttribute("userId",101);

    return "link";

}
@GetMapping("/link2")

@ResponseBody

public String link2(int id){

    return "id:"+id;

}
@GetMapping("/link3")

@ResponseBody

public String link3(int id ,String name){

    return "id+name:"+id+name;

}

<p>链接表达式</p>

绝对地址<br>

<a th:href="@{http://www.baidu.com}">百度链接</a>
相对地址<br>

<a th:href="@{/t/link}"></a>

相对地址,传递参数<br>

<a th:href="@{'/t/link2?id='+${userId}}">获取model数据,传递一个参数</a>

<a th:href="@{/t/link3(id=${userId},name='张三')}">传递多个参数</a>

 

Thymeleaf模板之属性使用

属性是放在html元素中的,就是html元素的属性,加上th,属性的值由模板引擎处理。

属性:th:action  th:method th:href th:src th:text th:style th:each

th:action

定义后台控制器的路径,类似<form>标准的action属性 th:action="@{/t/login}"

th:method

定义get,post方法  th:method="${method}"

th:href

定义超链接,结合URL表达式,获取动态变量

<a th:href="@{http://www.baidu.com}">百度链接</a>

th:src

用于引入外部资源,类似<script>标签

<script src="@{/js/jquery-3.6.1.js}" type="text/javascript"></script>

th:text

设置显示文本 ${key}

//Thymeleaf属性的使用

@GetMapping ("/property01")
public String property(Model model){
    model.addAttribute("id","12345");
    model.addAttribute("method","post");
    model.addAttribute("password","123455");
    model.addAttribute("color","color:#f76730");
    return "pro";
}
@PostMapping("/login")
@ResponseBody
public String login(int id,String password){
    return "账户id:"+id+"账户密码:"+password;
}

<body>
<p>属性的使用</p>
    <div style="margin-left:400px">
        <form th:action="@{/t/login}" th:method="${method}">
            <input th:type="text" th:name="id" th:value="${id}">
            <input th:type="password" th:name="password" th:value="${password}">
            <input th:type="submit" th:value="submit">
        </form>
    </div>
<p th:style="${color}">hello world</p>
<p th:style="'color:#f76730'">hello world</p>
<p th:style="'color:red'">hello world</p>
</body>

Thymeleaf模板之循环

th:each这个属性非常常用,与JSTL中的<c:forEach>类似.可以循环遍历集合,也可以循环变量数组和map

循环List

<div th:each="集合成员,循环的状态变量:${key}">
    <p th:text="${集合成员}"></p>
</div>

循环的状态变量

Index: 当前迭代对象的下标(0-n)

Count:当前迭代对象个数(0-n)

Size:被迭代对象的大小

Current:当前迭代变量

even/odd :布尔值,当前循环是否为偶数/奇数

first:是否第一个

last:是否最后一个

Controller

//    循环list

    @GetMapping("/eachList")
    public String eachList(Model model){
        List<String> strList = new ArrayList<>();
        strList.add("张三");
        strList.add("李四");
        strList.add("保国");
        model.addAttribute("strList",strList);

        List<Student> students = new ArrayList<>();
        students.add(new Student(10,"张三","男"));
        students.add(new Student(11,"李四","男"));
        students.add(new Student(12,"保国","男"));
        model.addAttribute("students",students);
        return "E";
    }

Html页面

<div th:each="集合成员,循环的状态变量:${key}">
    <p th:text="${集合成员}"></p>
</div>
<div th:each="list,strstate:${strList}">
    <p th:text="${list}"></p>
</div>

<div th:each="student,studentState:${students}">
    <p th:text="${student.id}"></p>
    <p th:text="${student.name}"></p>
    <p th:text="${student.sex}"></p>
</div>

<div>
    <table border="1" cellpadding="0" cellspacing="0">
        <thead>
            <tr>
                <td>下标</td>
                <td>id</td>
                <td>name</td>
                <td>sex</td>
            </tr>
        </thead>
        <tbody>
        <tr th:each="student,studentState:${students}">
            <td th:text="${studentState.index}"></td>
            <td th:text="${student.id}"></td>
            <td th:text="${student.name}"></td>
            <td th:text="${student.sex}"></td>
        </tr>
        </tbody>
    </table>
</div>

循环数组Array

controller

//循环数组

@GetMapping("/eachArray")

public  String array(Model model){
    String[] name =new String[3];
    name[0]="张三2";
    name[1]="李四2";
    name[2]="保国2";
    model.addAttribute("names",name);
    return "array";
}

Html页面

循环Array

<div>
  <table border="1" cellpadding="0" cellspacing="0">
    <thead>
    <tr>
      <td>编号</td>
      <td>name</td>
    </tr>
    </thead>
    <tbody>
    <tr th:each="name,nameState:${names}">
      <td th:text="${nameState.count}"></td>
      <td th:text="${name}"></td>
    </tr>
    </tbody>
  </table>
</div>

循环Map

Controller

//循环map

    @GetMapping("/eachMap")
    public String eachMap(Model model){
        Map<String,Student> map =new HashMap<>();
        map.put("stu1",new Student(11,"保国1","男"));
        map.put("stu2",new Student(12,"保国2","男"));
        map.put("stu3",new Student(13,"保国3","男"));
        map.put("stu4",new Student(14,"菜坤","男"));
        model.addAttribute("stuMap",map);
        return "Map";
    }

Html页面

循环Map

<div>
    <table border="1" cellpadding="0" cellspacing="0">
        <thead>
        <tr>
            <td>编号</td>
            <td>key</td>
            <td>id</td>
            <td>name</td>
            <td>sex</td>
        </tr>
        </thead>
        <tbody>
        <tr th:each="stu,stuState:${stuMap}">
            <td th:text="${stuState.count}"></td>
            <td th:text="${stu.key}"></td>
            <td th:text="${stu.value.id}"></td>
            <td th:text="${stu.value.name}"></td>
            <td th:text="${stu.value.sex}"></td>
        </tr>
        </tbody>
    </table>
</div>

循环List<Map<key,value>>

@GetMapping("/eachListMap")
public String eachListMap(Model model){

    List<Map<String,Student>> listMap =new ArrayList<>();
    Map<String,Student> map1 =new HashMap<>();
    map1.put("stu1",new Student(11,"保国11","男"));
    map1.put("stu2",new Student(12,"保国12","男"));
    map1.put("stu3",new Student(13,"保国13","男"));
    map1.put("stu4",new Student(14,"菜坤1","男"));

    Map<String,Student> map2 =new HashMap<>();
    map2.put("stu12",new Student(11,"保国112","男"));
    map2.put("stu22",new Student(12,"保国122","男"));
    map2.put("stu32",new Student(13,"保国132","男"));
    map2.put("stu42",new Student(14,"菜坤12","男"));
    listMap.add(map1);
    listMap.add(map2);
    model.addAttribute("ListMap",listMap);
    model.addAttribute("listMap",listMap);
    return "Map";
}

循环List-Map

<div>
    <table border="1" cellpadding="0" cellspacing="0">
        <thead>
        <tr>
            <td>编号</td>
            <td>key</td>
            <td>id</td>
            <td>name</td>
            <td>sex</td>
        </tr>
        </thead>
        <tbody>
        <div th:each="list:${ListMap}">
            <tr th:each="map,mapState:${list}">
                <td th:text="${mapState.count}"></td>
                <td th:text="${map.key}"></td>
                <td th:text="${map.value.id}"></td>
                <td th:text="${map.value.name}"></td>
                <td th:text="${map.value.sex}"></td>
            </tr>
        </div>
        </tbody>
    </table>
</div>

 

Thymeleaf模板之if和unless

语法:th:if”boolean条件”,条件为true显示体内容

Th:unless是th:if的一个相反操作

<div th:if="true">显示内容</div>

<div th:unless="true">显示内容</div>

用例

controller

@GetMapping("/ifl")

public String ifanUnless(Model model){

    model.addAttribute("name","z");
    model.addAttribute("login","true");
    model.addAttribute("age",30);
    model.addAttribute("empty1","");
    model.addAttribute("fnull",null);
    return "IfUnless";

}

html

<body>
<div th:if="${name=='z'}">张三</div>
<div th:if="${login}">登入成功</div>
<div th:if="${age < 40}">年龄小于40</div>
<!--""空字符是true-->
<div th:if="${empty1}">true</div>
<!--null为false-->
<div th:unless="${fnull}">为null</div>
</body>

Thymeleaf模板之switch-case

@GetMapping("/switch")
public String switchCase(Model model){
        model.addAttribute("sex",'m');
        return "switch";
    }

switch的使用
<div th:switch="${sex}">
    <p th:case="m">男</p>
    <p th:case="f">女</p>
    <p th:case="*">未知</p>
</div>

Thymeleaf模板之内联text

@GetMapping("/inline")
public String inlineDemo(Model model){
    model.addAttribute("name","z");
    model.addAttribute("age",30);
    model.addAttribute("sex","m");
    model.addAttribute("stu",new Student(14,"菜坤","男"));
return "inline";
}

<div th:inline="text">
  <!--/*[[${name}]]会转义,[(${name})]不会转义*/-->
  <p>名字[[${name}]]</p>
  <p>年龄[(${age})]</p>
  <p>[['I love yue']]</p>
  <p>[[${stu.id}]],[[${stu.name}]],[[${stu.sex}]]</p>
</div>

Thymeleaf模板之内联javascript

<script type="text/javascript" th:inline="javascript">
    var name = [[${name}]];
var age = [[${age}]];

    alert("获得模板中的数据:"+name+" "+age)
function fun(){
        alert("获得模板中的数据:"+name+" "+age)
      }
</script>

Thymeleaf模板之字面值

文本字面量

<p th:text="'名字'+${name}"></p>

数字字面量

<div th:if="${age < 40}">年龄小于40</div>

Bollean字面量

<div th:if="${login}">登入成功</div>

Null字面量

<p th:if="${name != null}">name不为null</p>
<!--""空字符是true-->
<div th:if="${empty1}">true</div>
<!--null为false-->
<div th:unless="${fnull}">为null</div>

Thymeleaf模板之字符串连接

方式1

<p th:text="'名字'+${name}+'年龄'+${age}"></p>

方式2

<p th:text="|名 字+${name}+年 龄+${age}|"></p>

Thymeleaf模板之运算符

算术运算符:+,-,*,/,%

关系比较:>,<,>=,<=  (gt,lt,ge,le)

相等判断:==,!=  (eq,ne)

@GetMapping("/inline")

public String inlineDemo(Model model){

    model.addAttribute("name","z");
    model.addAttribute("age",30);
    model.addAttribute("sex","m");
    model.addAttribute("stu",new Student(14,"菜坤","男"));
    model.addAttribute("fnull",null);
    model.addAttribute("login",true);

return "inline";
}

 运算符的使用

<div>
  <p th:text="${age > 10}">年龄大于10</p>
  <p th:text="${20 + 30}">结果</p>
  <p th:if="${fnull == null}">为null</p>
  三元运算符:<p th:text="${login == true ? '登入成功' : '登入失败'}"></p>
</div>

Thymeleaf模板之内置对象使用

//内置对象

@GetMapping("/object")

public String built_in_Object(Model model, HttpServletRequest request, HttpSession session){

    model.addAttribute("name","坤坤");
    request.setAttribute("requestFata","request作用域数据");
    request.getSession().setAttribute("sessionData","session作用域的数据");
    return "builtinObject";

}

hello builtinObject

<div>
    获取作用域中的数据
    <p th:text="${#request.getAttribute('requestFata')}">获取request域中的数据</p>
    <p th:text="${#session.getAttribute('sessionData')}"></p>
    <p th:text="${session.name}"></p>
</div>

Thymeleaf模板之内置#request对象方法

<div>

    使用内置对象的方法

    <p th:text="${#request.getRequestURL()}"></p>
    <p th:text="${#request.getRequestURI()}"></p>
    <p th:text="${#request.getContextPath()}"/>
    <p th:text="${#request.getServerName()}"/>
    <p th:text="${#request.getServerPort()}"/>

</div>

Thymeleaf模板之内置对象#session对象方法

Session表示HttpSession对象的,是#session的简单表示方式。

<div>

    <p th:text="${#session.getId()}"/>
    <p th:text="${#session.getAttribute('sessionData')}"/>

</div>

Thymeleaf模板之param对象

Param对象表示url请求的参数集合

<div>

    <p th:text="${param.id}"/>
    <p th:text="${param.name}"/>

</div>

Thymeleaf模板之内置工具类

#dates

@GetMapping("/unlist")

public String utileObject(Model model){

    model.addAttribute("Mdate",new Date());

    return "utileObject";

}

<div>

  日期类工具类对象

  <p th:text="${#dates.format(Mdate)}"/>
  <p th:text="${#dates.format(Mdate,'yyyy-MM-dd')}"/>
  <p th:text="${#dates.format(Mdate,'yyyy-MM-dd HH:mm:ss')}"/>
  <p th:text="${#dates.year(Mdate)}"/>
  <p th:text="${#dates.month(Mdate)}"/>
  <p th:text="${#dates.monthName(Mdate)}"/>
  <p th:text="${#dates.createNow()}"/>

</div>

#numbers

@GetMapping("/unlist")

public String utileObject(Model model){

    model.addAttribute("numbers",45.01);
    return "utileObject";

}

<div>

    <p th:text="${#numbers.formatCurrency(numbers)}"/>
    <p th:text="${#numbers.formatDecimal(numbers,6,2)}"/>

</div>

#strings

@GetMapping("/unlist")

public String utileObject(Model model){

    model.addAttribute("Stirng","1234fdghdtgjuefS");
    return "utileObject";

}

<div>

    <p th:text="${#strings.toUpperCase(Stirng)}"/>
    <p th:text="${#strings.indexOf(Stirng,'f')}"/>
    <p th:text="${#strings.substring(Stirng,2,6)}"/>
    <p th:text="${#strings.substring(Stirng,1)}"/>
    <p th:text="${#strings.concat(Stirng,'----java-----')}"/>

</div>

#lists

@GetMapping("/unlist")

public String utileObject(Model model){

    List<String> list = Arrays.asList("A","B","C");

    return "utileObject";

}

<div>

    <p th:text="${#lists.size(Mlist)}"/>
    <p th:text="${#lists.contains(Mlist,'A')}"/>
    <p th:text="${#lists.isEmpty(Mlist)}"/>

</div>

Null处理

@GetMapping("/unlist")

public String utileObject(Model model){

    Cat cat =new Cat();
    cat.setName("狸花猫");
    Dog dog =new Dog();
    dog.setName("阿拉斯加");
    Pet p =new Pet(cat,dog);
    model.addAttribute("pet",p);
    return "utileObject";

}

当cat值不为null时,才执行name

<div>

    null处理
    <p th:text="${pet.cat?.name}"/>
    <p th:text="${pet.dog?.name}"/>

</div>

Thymeleaf模板之自定义模板

自定义模板,在其他模板文件中多次使用

Hello为自定义模板名称

<div th:fragment="hello">

  <p>hello world</p>

</div>

引用模板

插入模板方式1

<div th:insert="~{custom.html :: hello}"></div>

                   

插入模板方式2

<div th:insert="custom.html :: hello"></div>

包含模板

<div th:include="~{custom.html :: hello}"></div>
方式2
<div th:include="custom.html :: hello"></div>

                 

html页面做模板

<div th:include="demo"></div>

<br>

<div th:include="demo :: html"></div>

<br>

<div th:insert="demo"></div>

使用其他目录中的模板

<div th:include="web/demo :: html"></div>
<div th:insert="web/demo"></div>

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

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

相关文章

【EMQX】EMQX管理控制台即EMQX Dashboard简介

EMQX管理控制台 一、EMQX Dashboard简介二、主要功能2.1 监控和管理 EMQX 集群中的相关信息与数据2.2 访问控制&#xff08;认证与授权&#xff09;管理2.3 数据集成2.4 在线配置热更新2.5 管理系统扩展能力2.6 全面的诊断工具 三、启动3.1 首次登录3.2 忘记密码 四、配置 Dash…

我老板:你根本不懂 React!

前言 我已经使用 React 多年&#xff0c;我确信我非常了解它&#xff0c;但最近我的老板对我说&#xff0c;“你根本不知道 React&#xff0c;你对它一无所知。” 我很生他的气&#xff0c;但他指出了我程序中的三个漏洞。我现在把它记录下来&#xff0c;也分享给还不知道的小…

用好ChatGPT,毕业直接走上人生巅峰

毕业论文交上去了&#xff0c;学分也攒齐了。考研没上岸的准毕业生们接下来要面对的不是惨烈的秋招&#xff0c;就是蹲家准备二战。生活终于要对各位小可爱们动手啦&#xff01; 不想默默承受社会的毒打&#xff1f; 不愿在屡战屡败屡败屡战的压力下秃头&#xff1f; 想必各位…

API 都有这些功能,你真的都知道么?

API&#xff08;应用程序编程接口&#xff09;可以提供以下功能&#xff1a; 数据传输&#xff1a;API可以在应用程序之间传输数据&#xff0c;包括发送和获取数据、更新数据等。 访问功能: API 可以调用另一个系统或应用程序的某些功能&#xff0c;例如获取天气&#xff0c;查…

基于无线传感器网络(WSN) 查找两个节点之间的最短路径并发送数据(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 本代码基于无线传感器网络&#xff0c;在两个节点&#xff08;源节点和目标节点&#xff09;之间找到最短路径&#xff0c;并开…

Java学习过程(韩顺平661-665)

网络通信是指在计算机网络中&#xff0c;通过网络连接的设备之间进行数据交换的过程。网络通信可以分为两种类型&#xff1a;有线网络通信和无线网络通信。 有线网络通信主要通过物理介质&#xff08;如光纤、双绞线等&#xff09;来传输数据&#xff0c;其中最常用的协议是以…

数字孪生新能源智慧充电桩Web3D可视化运维系统

放眼全球&#xff0c;近十年来&#xff0c;新能源汽车赛道堪称“热得发烫”。伴随着进入成年期的新能源汽车行业对相关配套设备支撑水平的提升&#xff0c;作为其“新基建”的充电桩领域表现更为突出的价值势能。过去&#xff0c;在一系列补贴政策和资本刺激下&#xff0c;充电…

七种MOS管栅极驱动电路

01 直接驱动 首先说一下电源IC直接驱动&#xff0c;下图是我们最常用的直接驱动方式&#xff0c;在这类方式中&#xff0c;我们由于驱动电路未做过多处理&#xff0c;因此我们进行PCB LAYOUT时要尽量进行优化。如缩短IC至MOSFET的栅极走线长度&#xff0c;增加走线宽度&#x…

《商用密码应用与安全性评估》第三章商用密码标准与产品应用3.4商用密码标准与产品

一、智能IC卡标准与产品 智能IC卡的分类 存储器卡&#xff1a;内部一般不包含密码安全机制&#xff0c;不具备信息处理能力&#xff0c;外部可对片内信息任意存取&#xff0c;因此存储器卡一般用于存放不需要保密的信息逻辑加密卡&#xff1a;逻辑加密卡内除了具有非易失性存…

redis缓存生产实践(一)---大key压缩

文章目录 前言一、缓存到底是使用String还是hash我该如何选择二、什么是大key及其影响2.1 什么是 Redis 大 key&#xff1f;2.2 大key带来的影响 三、大key压缩3.1 注解标记可能需要压缩的数据3.2 获取注解信息判断内存占用大小3.2 判断对象占用内存3.2 gzip压缩json3.2 判断当…

Reid之损失函数理论学习讲解

基于深度学习的Reid主要流程为输入图像-->CNN(提取特征)-->Global average pooling-->特征向量&#xff0c;将用这些特征来衡量图像的相似情况。并用这些特征进行检索&#xff0c;返回分类情况。 在训练网络的时候需要涉及损失函数&#xff0c;因此就引出了表征学习和…

大数据专业好找工作么

现在&#xff0c;在数字化转型的推动下&#xff0c;越来越多的企业意识到大数据的魅力&#xff0c;并不断在这个领域投入资金&#xff0c;Python大数据开发相关人才也备受青睐&#xff01; 学Python之前&#xff1a;这玩意真有传说中那么好么&#xff1f; 学Python之后&#…

【browser】浏览器跨域处理

好久没有更新博客了&#xff0c;前段时间在疯狂面试&#xff0c;最近工作了才有时间来写博客。 准备来讲讲面试里常问到的跨域处理吧。 说到跨域&#xff0c;我们可能会下意思的说出jsonp&#xff0c;服务端配置cors&#xff0c;node配置代理等&#xff0c;再多了&#xff0c;我…

加密脱胎于去中心化理想,但力求合规 细数各国政府态度之演变

比特币诞生之始&#xff0c;只是极客文化圈内流行的小众货币。如今&#xff0c;加密市场已经发展到无法忽视的程度&#xff0c;虽然全球仍未对加密货币形成共识&#xff0c;但监管已成为各国政府不得不考虑的问题。 美国&#xff1a;监管愈发模糊且不可测 美国始终是加密领域全…

八股文(Mybatis)

文章目录 1. Mybatis缓存机制2. 动态SQL语句3. 分页3. 1 几种分页方式3.2 MyBatis 是如何进行分页的&#xff1f;分页插件的原理是什么&#xff1f;3.3 逻辑分页和物理分页 1. Mybatis缓存机制 作用&#xff1a;避免每次都去查db 一级缓存是SqlSession级别的缓存&#xff0c;也…

Mysql统计分组后每组数据与每组数量区别

下边统计的是分组后每组的数量&#xff1a;结果是多个 select p.id (count(*)) from p group by p.id 如果想统计分组后&#xff0c;有多个分组&#xff0c;需要如下执行&#xff1a; select count(*) from (select p.id (count(*)) from p group by p.id) as a 此外&#xf…

大数据之Hadoop数据仓库Hive

目录&#xff1a; 一、简介二、HQL的执行流程三、索引四、索引案例五、Hive常用DDL操作六、Hive 常用DML操作七、查询结果插入到表八、更新和删除操作待完善。。。 一、简介 Hive 是一个构建在 Hadoop 之上的数据仓库&#xff0c;它可以将结构化的数据文件映射成表&#xff0c…

【Linux】线程-线程安全之互斥

操作系统核心数centos 3.10.032位单核 线程之线程安全 线程不安全的现象互斥死锁线程饥饿 线程不安全的现象 进程线程的背景概念&#xff1a; 临界资源&#xff1a;多线程执行流之间共享的资源 临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码 互斥&#xff1a…

设计模式——责任链

目录 1、传统方案&#xff0c;OA系统的采购审批项目 2、职责链模式基本介绍 3、职责链模式解决 OA 系统采购审批项目 4、职责链模式在 SpringMVC 框架应用的源码分析 责任链模式类似一个链表&#xff0c;每个具体处理人层层判断对请求的处理权限&#xff0c;没权限的话把请…