SpringBoot+FreeMaker

目录

  • 1.FreeMarker说明
  • 2.SpringBoot+FreeMarker快速搭建
    • Pom文件
    • application.properties文件
    • Controller文件
    • 目录结构
  • 3.FreeMarker数据类型
    • 3.1.布尔类型
    • 3.2.数值类型
    • 3.3.字符串类型
    • 3.4.日期类型
    • 3.5.空值类型
    • 3.6.sequence类型
    • 3.7.hash类型
  • 4.FreeMarker指令
    • assign自定义变量指令
    • if/elseif/else逻辑判断指令
    • list遍历指令
    • macro自定义指令(宏)
    • nested占位指令
    • import导入指令
    • include包含指令

1.FreeMarker说明

FreeMarker中文文档:http://freemarker.foofun.cn/index.html
学习视频:https://www.bilibili.com/video/BV1vq4y1p718
https://www.bilibili.com/video/BV1do4y1m7Pp
找到的别人的笔记及demo:
https://gitee.com/hhgs_admin/Freemarker_readme/blob/master/Freemarker%E7%AC%94%E8%AE%B0.md
https://gitee.com/mumasi/freemarker-demo

2.SpringBoot+FreeMarker快速搭建

参考文章:
(1)https://blog.csdn.net/xhf852963/article/details/116233053
(2)https://www.cnblogs.com/dw3306/p/9602139.html
(3)https://www.cnblogs.com/rainbowbridge/p/11410286.html
(4)https://blog.csdn.net/qq_46921028/article/details/130493378

Pom文件

<?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>com.asta</groupId>
    <artifactId>freemaker-hello</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 添加freemarker的maven依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

application.properties文件

server.port=8080
#HttpServletRequest 的属性是否可以覆盖controller中model 的同名项
spring.freemarker.allow-request-override=false
#H ttp Session 的属性是否可以覆盖 controller model 的同名项
spring.freemarker.allow-session-override=false
#是否开启缓存
spring.freemarker.cache=false
#模板文件编码
spring.freemarker.charset=UTF-8
#是否检查模板位置
spring.freemarker.check-template-location=true
#Content-Type的值
spring.freemarker.content-type=text/html
#是否将HttpServletRequest中的属性添加到Model中
spring.freemarker.expose-request-attributes=false
#是否将HttpSession中的属性添加到Model
spring.freemarker.expose-session-attributes=false
#模板文件后缀
spring.freemarker.suffix=.ftl
#模板文件位置
spring.freemarker.template-loader-path=classpath:/templates/

Controller文件

package com.asta.controller;
import com.asta.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.*;
/**
 * @Author:cs.cao
 * @Date:2024/4/14 15:42
 */
@Controller
@RequestMapping("/freemarker")
public class HelloController {

    @RequestMapping("/type")
    public ModelAndView hello() {
        String[] stars = new String[]{"周杰伦", "林俊杰", "陈奕迅", "五月天"};
        List<String> cities = Arrays.asList("北京", "上海", "南京", "杭州");
        List<User> userList = new ArrayList<>();
        userList.add(new User(1, "zhangsan", 22));
        userList.add(new User(2, "lisi", 23));
        userList.add(new User(3, "wangwu", 18));
        Map<String, Object> cityMap = new HashMap<>();
        cityMap.put("BJ", "北京");
        cityMap.put("SH", "上海");
        cityMap.put("HZ", "杭州");

        ModelAndView mv = new ModelAndView();
        // boolean类型
        mv.addObject("flag", true);
        // 数值类型
        mv.addObject("age", 18);
        mv.addObject("salary", 100000);
        mv.addObject("avg", 0.545);
        // 字符串类型
        mv.addObject("name", "cs.cao");
        // 日期类型
        mv.addObject("now", new Date());
        // 空值类型
        mv.addObject("nullValue", null);
        // sequence类型
        mv.addObject("stars", stars);
        mv.addObject("cities", cities);
        mv.addObject("userList", userList);
        // hash类型
        mv.addObject("cityMap", cityMap);
        mv.setViewName("hello");
        return mv;
    }
}

目录结构

在这里插入图片描述

3.FreeMarker数据类型

FreeMarker模板中的数据类型有如下几种:

  • 布尔型:等价于java中的Boolean类型,不同的是不能直接输出,可转换为字符串再输出。
  • 日期型:等价于java中的Date类型,不同的是不能直接输出,需要转换成字符串再输出。
  • 数值型:等价于java中的int,float,double等数值类型。有三种显示形式:数值型(默认)、货币型、百分比型。
  • 字符型:等价于java中的字符串,有很多内置函数
  • sequence类型:等价于java中的数组,list,set等集合类型。
  • hash类型:等价于java中的Map类型。

3.1.布尔类型

	<#--
	    boolean类型,需要转为字符串:
	    ${flag?c}
	    ${flag?string}
	    ${flag?string("yes","no")}
	-->
	<h3>boolean类型:</h3>
	${flag?c}<br/>
	${flag?string}<br/>
	${flag?string("yes","no")}<br/>

3.2.数值类型

	<#--
        数值类型,直接输出或转成字符串
        1.转字符串
            普通字符串:${num?c}
            货币型字符串:${num?string.currency}
            百分比型字符串:${num?string.percent}
        2.保留浮点型数值指定小数位数(#表示一个小数位)
            ${num?string["0.##"]}
    -->
    <h3>数值类型:</h3>
    ${age}<br/>
    ${salary}<br/>
    ${salary?c}<br/>
    ${salary?string.currency}<br/>
    ${avg?string.percent}<br/>
    ${avg?string["0.##"]}<br/>

3.3.字符串类型

	<#--
        字符串类型:
        1.截取字符串(左闭右开)${text?substring(start,end)}
        2.首字母小写输出:${text?uncap_first}
        3.首字母大写输出:${text?cap_first}
        4.字母转小写输出:${text?lower_case}
        5.字母转大写输出:${text?upper_case}
        6.获取字符串长度:${text?length}
        7.是否以指定字符开头(boolean类型)${text?starts_with("xx")?string}
        8.是否以指定字符结尾(boolean类型)${text?ends_with("xx")?string}
        9.获取指定字符的索引:${text?index_of("xx")}
        10.去除字符串前后空格:${text?trim}
        11.替换指定字符串:${text?replace("xx","xxx")}
    -->
    <h3>字符串类型:</h3>
    ${name?substring(1,4)}<br/>
    ${name?uncap_first}<br/>
    ${name?cap_first}<br/>
    ${name?lower_case}<br/>
    ${name?upper_case}<br/>
    ${name?length}<br/>
    ${name?starts_with("c")?string}<br/>
    ${name?ends_with("o")?string}<br/>
    ${name?index_of("cao")}<br/>
    ${name?trim}<br/>
    ${name?replace(".","-")}<br/>

3.4.日期类型

	<#--
        日期类型,需要先转成日期型或字符串:
        1.年月日:${now?date}
        2.时分秒:${now?time}
        3.年月日时分秒:${now?datetime}
        4.指定格式:${now?string("自定义格式")}
    -->
    <h3>日期类型:</h3>
    ${now?date}<br/>
    ${now?time}<br/>
    ${now?datetime}<br/>
    ${now?string("yyyy年MM月dd日 HH:mm:ss")}<br/>

3.5.空值类型

Freemarker的变量必须赋值,否则就会抛出异常。对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。

	<#--
        空值类型:
        Freemarker的变量必须赋值,否则就会抛出异常。对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。
        FreeMarker提供两个运算符来避免空值:
        1.!:指定缺失变量的默认值
            ${value!}:如果value值为空,则默认值为空字符串。
            $(value!"默认值"):如果value值为空,则默认值为字符串"默认值"2.??:判断变量是否存在
            如果变量存在返回true,否则返回false。
            ${(value??)?string}
    -->
    <h3>空值类型:</h3>
    ${nullValue!}<br/>
    ${nullValue!"空"}<br/>
    ${(nullValue??)?string}<br/>

3.6.sequence类型

	<#--
        sequence类型:序列类型(数组、List、Set)
        1.通过list执行输出序列:<#list 序列名 as 元素名>${名称}</#list>
        2.获取序列的长度:${序列名?size}
        3.获取序列元素的下标:${序列名?index}
        4.获取第一个元素:${序列名?first}
        5.获取最后一个元素:${序列名?last}
        6.倒序输出:序列名?reverse
        7.升序输出:序列名?sort
        9.降序输出:序列名?sort?reverse
        10.指定字段名排序:序列名?sort_by("字段名")
            注:一般是JavaBean集合,对应的字段名需要提供get方法。
    -->
    <h3>sequence序列类型:</h3>
    <#list stars as star>
        下标:${star?index}--名字:${star}<br/>
    </#list>
    数组的长度:${stars?size}<br/>
    第一个元素:${stars?first}<br/>
    最后一个元素:${stars?last}<br/>
    <#list cities?reverse as city>
        下标:${city?index}--城市:${city}<br/>
    </#list>
    <#list cities?sort as city>
        下标:${city?index}--城市:${city}<br/>
    </#list>
    <#list cities?sort?reverse as city>
        下标:${city?index}--城市:${city}<br/>
    </#list>
    <#list userList?sort_by("age") as user>
        序号:${user.index}--名称:${user.name}--年龄:${user.age}<br/>
    </#list>

3.7.hash类型

	<#--
        hash类型(Map)1.key遍历输出:
            <#list hash?keys as key>
                ${key} -- ${hash[key]}
            </#list>
        2.value遍历输出:
            <#list hash?values as value>
                ${value}
            </#list>
    -->
    <h3>hash类型:</h3>
    <#list cityMap?keys as key>
        key:${key}--城市:${cityMap[key]}<br/>
    </#list>
    <#list cityMap?values as value>
        城市:${value}<br/>
    </#list>

4.FreeMarker指令

assign自定义变量指令

使用assign指令可以创建一个新的变量,或者替换一个已经存在的变量。

	<#--
        assign自定义变量指令
        语法:
        <#assign 变量名=值>
        <#assign 变量名=值 变量名=值> (定义多个变量)
    -->
    <h3>assign自定义变量指令:</h3>
    <#assign num=1 names=["zhangsan","lisi","wangwu"]>
    ${num} -- ${names?join(",")}

if/elseif/else逻辑判断指令

可以使用if-elseif-else指令来判断是否满足某些条件

	<#--
        if/elseif/else逻辑判断指令:
        语法:
        <#if condition>
            ...
        <#elseif condition2>
            ...
        <#elseif condition3>
            ...
        <#else>
            ...
        </#if>
        注意:
        1.condition、condition2等:将被计算成布尔值的表达式
        2.elseif和else指令是可选的。
    -->
    <h3>if/elseif/else逻辑判断指令:</h3>
    <#assign score=80>
    <#if score < 60 >
        加油
    <#elseif score = 60  >
        及格万岁
    <#elseif score gt 60 && score lt 80 >
        小伙子还不错
    <#else>
        厉害
    </#if>
    <br/>
    <#assign list="">
    <#if list?? >
        数据存在
    <#else>
        数据不存在
    </#if>
    <br/>

list遍历指令

可以使用list指令对序列进行遍历

	<#--
        list遍历指令:
        格式1:
            <#list sequence as item>
                ...
            </#list>
        格式2:
            <#list sequence as item>
                ...
            <#else>
                当没有选项时执行else指令
            </#list>
        注:
        1.else部分是可选的
        2.sequence:想要迭代的项,可以是序列或集合的表达式
        3.item:循环变量的名称
        4.当没有迭代项时,才使用else指令,可以输出一些特殊的内容而不只是空在那里。
    -->
    <#assign nameList=[]>
    <#--判断数据部位空,再执行遍历(如果序列不存在时直接遍历会报错)-->
    <#if nameList??>
        <#list nameList?sort?reverse as name>
            下标:${name?index}--名称:${name}<br/>
        <#else>
            哈哈空的
        </#list>
    </#if>
    <br/>

macro自定义指令(宏)

可以使用macro指令自定义一些指令

	<#--
        macro自定义指令()1.基本使用
        格式:
            <#macro 指令名>
                指令内容
            </#macro>
        使用:
            <@指令名></@指令名>
        2.有参数的自定义指令
        格式:
            <#macro 指令名 参数名1 参数名2>
                指令内容
            </#macro>
        使用:
            <@指令名 参数名1=参数值1 参数名2=参数值2></@指令名>
        注:
        1.指令可以被多次使用
        2.自定义指令中可以包含字符串,也可以包含内置指令
    -->
    <h3>macro自定义指令:</h3>
    <#--自定义指令-->
    <#macro address>
        @1995-2024 The FreeMarker Project.
    </#macro>
    <#--使用指令-->
    <@address></@address><br/>
    <@address></@address><br/>

    <#--自定义指令(含参数)-->
    <#macro queryUserByParams uname uage>
        通过多个餐宿查询用户信息 - ${uname} - ${uage}
    </#macro>
    <@queryUserByParams uname="zhangsan" uage="18"></@queryUserByParams><br/>

    <#--自定义指令(其中包含内置指令)-->
    <#macro cfg>
        <#list 1..9 as i>
            <#list 1..i as j>
                ${i}*${j}=${i*j}&nbsp;
            </#list>
            <br/>
        </#list>
        <br/>
    </#macro>
    <@cfg></@cfg><br/>

nested占位指令

nested指令执行自定义指令开始和结束标签中间的模板片段。嵌套的片段可以包含模板中任意合法的内容。

<#--
        nested占位指令:
            nested相当于占位符,一般结合macro指令一起使用。
            可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时会将占位内容显示。
    -->
    <h3>nested占位指令:</h3>
    <#macro testNested>
        测试nested:
        <#nested>
        <#nested>
    </#macro>
    <#--使用指令-->
    <@testNested><p>占位的内容</p></@testNested><br/>

import导入指令

import指令可以引入一个库。也就是说,它创建一个新的命名空间,然后在那个命名空间中执行给定路径的模板。可以使用引入的空间中的指令。
commons.ftl文件

<#macro cfg>
    <#list 1..9 as i>
        <#list 1..i as j>
            ${i}*${j}=${i*j}&nbsp;
        </#list>
        <br/>
    </#list>
    <br/>
</#macro>

在其他ftl页面中通过import导入commons.ftl的命名空间,使用该命名空间的指令。

	<#--
        import导入指令:
        导入命名空间:<#import "ftl文件" as 命名空间>
        使用命名空间中的指令:<@命名空间.指令></@命名空间.指令>
    -->
    <h3>import导入指令:</h3>
    <#import "commons.ftl" as common>
    <@common.cfg></@common.cfg><br/>

include包含指令

可以使用include指令在你的模板中插入另一个FreeMarker模板文件。被包含模板的输出格式是在include标签出现的位置插入的。被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。

	<#--
        include包含指令:
        用来引入其他页面文件(如txt、ftl、html等)
    -->
    <h3>include包含指令:</h3>
    <#include "test.txt">
    <#include "test.ftl">
    <#include "test.html">

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML学习笔记:(一)基础方法

Html格式 里面文件使用平台为&#xff1a;w3school 1、基础功能&#xff1a; <html><head> <title>这是我的第一个html页面,会显示在浏览器的标题栏中</title> </head> <!--修改背景颜色 --> <body bgcolor"yellow"> …

QtQuick 学习笔记(二)按钮组件

1. QPushButton 功能 按压按钮&#xff0c;用于接受用户点击事件&#xff0c;可显示设定的字符串提示信息&#xff0c;但需要父组件作为容器&#xff0c;多用以执行命令或触发事件 常用函数 QPushButton&#xff1a;&#xff1a;QPushButton&#xff08;const QString &…

RHCE1

unit1.定时任务和延迟任务项目 1.在系统中设定延迟任务要求如下: 在系统中建立easylee用户&#xff0c;设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中确保延迟任务是使用非交互模式建立 再使用chmod修改权限&#xff1a; 确保…

HarmonyOS真机调试页面运行卡顿/黑屏解决方法,亲测有效

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 用mate40等发行时间相对较早但系统是HarmonyOS4.0的真机调试 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 程序点击容易卡顿或黑屏 原因分析&#xff1a; CPU兼容问题导致屏幕…

Text2sql的一些技巧

最近看到了一篇关于text2sql的文章&#xff0c;以及一些论文。对使用模型做text2sql给了一些不错的建议。 参考文章&#xff1a;24年大模型潜力方向&#xff1a;大浪淘沙后的Text-to-SQL和Agent - 知乎 论文&#xff1a;https://arxiv.org/pdf/2403.09732.pdf 关于模型的建议 …

STM32H7定时器TIM1-TIM17中断、PWM实现

STM32H7定时器TIM1-TIM17中断、PWM实现 高级定时器硬件框图定时器模式时基输出PWM定时器输入捕获 TIM1-TIM17的中断配置TIM1-TIM17的PWM输出 STM32H7 支持的定时器有点多&#xff0c;要简单的区分下。STM32H7 支持 TIM1-TIM8&#xff0c;TIM12-TIM17 共14 个定时器&#xff0c;…

使用API有效率地管理Dynadot域名,锁定账户中的域名

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

Zynq7000系列中的时钟管理

PS&#xff08;处理系统&#xff09;时钟子系统生成的所有时钟都源自三个可编程PLL&#xff08;锁相环&#xff09;中的一个&#xff1a;CPU、DDR和I/O。时钟子系统的主要组件如图25-1所示。 在正常工作期间&#xff0c;PLL被启用&#xff0c;并由PS_CLK时钟引脚驱动。在启用P…

6.6Python之集合的基本语法和特性

集合&#xff08;Set&#xff09;是Python中的一种无序、不重复的数据结构。集合是由一组元素组成的&#xff0c;这些元素必须是不可变数据类型&#xff0c;但在集合中每个元素都是唯一的&#xff0c;即集合中不存在重复的元素。 集合的基本语法&#xff1a; 1、元素值必须是…

24卫生高级职称报名时间汇总⏰报名全流程

⏰卫生高级职称&#xff08;网上报名&#xff09;时间汇总 ✔️陕西&#xff1a;4月23日-5月24日 ✔️上海&#xff1a;4月23日-5月24日 ✔️重庆&#xff1a;4月23日—5月24日 ✔️黑龙江&#xff1a;4月23日-5月24日 ✔️浙江&#xff1a;4月23日-5月24日 ✔️云南&#xff1…

面试自救指南:女生如何巧答私密问题

在面试过程中&#xff0c;女性应聘者可能会遇到一些私人问题&#xff0c;这些问题可能涉及婚姻、家庭、生育等方面。面对这些问题&#xff0c;如何回答才能既保持真实又不失礼节呢&#xff1f; 当遇到关于婚姻状况的问题时&#xff0c;您可以选择回答&#xff1a;“我目前的婚姻…

【Python深度学习系列】网格搜索神经网络超参数:权重初始化方法(案例+源码)

这是我的第262篇原创文章。 一、引言 在深度学习中&#xff0c;超参数是指在训练模型时需要手动设置的参数&#xff0c;它们通常不能通过训练数据自动学习得到。超参数的选择对于模型的性能至关重要&#xff0c;因此在进行深度学习实验时&#xff0c;超参数调优通常是一个重要的…

2024全新快递平台系统独立版小程序源码|带cps推广营销流量主+前端

本文来自&#xff1a;2024全新快递平台系统独立版小程序源码|带cps推广营销流量主前端 - 源码1688​​​​​ 应用介绍 快递代发快递代寄寄件小程序可以对接易达云洋一级总代快递小程序&#xff0c;接入云洋/易达物流接口&#xff0c;支持选择快递公司&#xff0c;三通一达&am…

【leetcode面试经典150题】57. 环形链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

电动车违停智能监测摄像机

电动车的普及带来了便利&#xff0c;但也衍生了一些问题&#xff0c;其中最常见的之一就是电动车的违停。电动车的违停不仅会影响交通秩序&#xff0c;还可能对周围环境和行人安全造成影响。为了监测和管理电动车的违停情况&#xff0c;可以使用电动车违停智能监测摄像机。这种…

退市危机袭来,环保行业能否逆境崛起?|中联环保圈

近年来&#xff0c;环保行业风波持续不断&#xff0c;众多环保大公司风险频出。博天环境的退市危机令人感慨&#xff0c;深圳星源因涉嫌信息披露违法违规而被警告退市&#xff0c;更是引发业界震动。 最近三年&#xff0c;证监会办理的上市公司信息披露违法案件多达 397 件&…

Linux内核之virt_to_page实现与用法实例(五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Python 使用 pip 安装 matplotlib 模块(精华版)

pip 安装 matplotlib 模块 1.使用pip安装matplotlib(五步实现):2.使用下载的matplotlib画图: 1.使用pip安装matplotlib(五步实现): 长话短说&#xff1a;本人下载 matplotlib 花了大概三个半小时屡屡碰壁&#xff0c;险些暴走。为了不让新来的小伙伴走我的弯路&#xff0c;特意…

IPAguard--iOS代码混淆工具(免费)

IPAguard是一款为iOS开发者设计的代码混淆工具&#xff0c;旨在为开发者提供方便制作和分析马甲包的解决方案。通过高效的匹配算法&#xff0c;IPAguard可以在保证代码混淆的同时&#xff0c;保证编译后的代码质量&#xff0c;减少了因混淆引起的bug&#xff0c;使得开发者能够…

写后端项目的分页查询时,解决分页不更新

写基于VueSpringBoot项目&#xff0c;实现分页查询功能时&#xff0c;改完代码后&#xff0c;发现页数不更新&#xff1a; 更改处如下&#xff1a; 显示如图&#xff1a; 发现页数没有变化&#xff0c;两条数据还是显示在同一页&#xff0c;而且每页都10条。且重启项目也没有更…
最新文章