FreeMarker基础知识

news2024/11/14 3:07:24

1、总览

思维导图
官网:http://freemarker.foofun.cn/
视频地址:https://www.bilibili.com/video/BV1zZ4y1u7iA

2、FreeMarker概述

2.1 FreeMarker概念

FreeMarker 是⼀款 模板引擎: 即⼀种基于模板和要改变的数据, 并⽤来⽣成输出⽂本(HTML⽹⻚,电⼦邮件,配置⽂件,源代码等)的通⽤⼯具。 是⼀个Java类库。
FreeMarker 被设计⽤来⽣成 HTML Web ⻚⾯,特别是基于 MVC 模式的应⽤程序,将视图从业务逻辑中抽离处理,业务中不再包括视图的展示,⽽是将视图交给 FreeMarker 来输出。虽然 FreeMarker 具有⼀些编程的能⼒,但通常由 Java 程序准备要显示的数据,由 FreeMarker ⽣成⻚⾯,通过模板显示准备的数据(如下图)
架构图

FreeMarker不是⼀个Web应⽤框架,⽽适合作为Web应⽤框架⼀个组件。
FreeMarker与容器⽆关,因为它并不知道HTTP或Servlet。FreeMarker同样可以应⽤于⾮Web应⽤程序环境。
FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使⽤JSP标记库。

2.2 FreeMarker特性

[1]通用目标

能够⽣成各种⽂本:HTML、XML、RTF、Java 源代码等等
易于嵌⼊到你的产品中:轻量级;不需要 Servlet 环境
插件式模板载⼊器:可以从任何源载⼊模板,如本地⽂件、数据库等等
可以按你所需⽣成⽂本:保存到本地⽂件;作为 Email 发送;从 Web 应⽤程序发送它返回给 Web 浏览器

[2]强大的模板语言

所有常⽤的指令:include、if/elseif/else、循环结构
在模板中创建和改变变量
⼏乎在任何地⽅都可以使⽤复杂表达式来指定值
命名的宏,可以具有位置参数和嵌套内容
名字空间有助于建⽴和维护可重⽤的宏库,或将⼤⼯程分成模块,⽽不必担⼼名字冲突
输出转换块:在嵌套模板⽚段⽣成输出时,转换HTML转义、压缩、语法⾼亮等等;你可以定义⾃⼰的转换

[3]通用数据模型

FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量⽅式在模板中显示
可以使⽤抽象(接⼝)⽅式表示对象(JavaBean、XML⽂档、SQL查询结果集等等),告诉模板开发者使⽤⽅法,使其不受技术细节的打扰

[4]为Web准备

在模板语⾔中内建处理典型Web相关任务(如HTML转义)的结构
能够集成到Model2 Web应⽤框架中作为JSP的替代
⽀持JSP标记库
为MVC模式设计:分离可视化设计和应⽤程序逻辑;分离⻚⾯设计员和程序员

3、基本语法

3.1 注释语法

<!--
    html注释语法
    浏览器中注释可见
-->
<#--
    freemarker 注释语法
        浏览器中注释不可见
        1.在FreeMarker中,html所有标签均使用
        2.js/css均适用,语法一致
-->
 
  ${msg}

3.2 数据类型

Freemarker 模板中的数据类型由如下⼏种:

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

布尔类型

Java代码

/**
 * 布尔类型
 *
 * @author  Promsing(张有博)
 * @since  2022/12/31 - 19:27
 * @version 1.0.0
 */
@WebServlet("/f02")
public class Freemarker02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setAttribute("flag",true);
        //转发给ftl文件中
        req.getRequestDispatcher("template/fmk02.ftl").forward(req,resp);
    }
}



HTML文件

<#--
    布尔类型
    布尔类型不能在FreeMarker页面输出,需要改成String输出
        方式一: ?c,推荐
        方式一: ?string('ture','false')
    官网:http://freemarker.foofun.cn/ref_builtins_boolean.html

-->
<h2>布尔类型</h2>
<h2>${flag?c}</h2>
<h2>${flag?string}</h2>
<h2>${flag?string('喜欢','不喜欢')}</h2>



日期类型

Java文件

/**
 * 日期类型
 *
 * @author  Promsing(张有博)
 * @since  2022/12/31 - 19:27
 * @version 1.0.0
 */
@WebServlet("/f03")
public class Freemarker03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setAttribute("time",new Date());
        //转发给ftl文件中
        req.getRequestDispatcher("template/fmk03.ftl").forward(req,resp);
    }
}

HTML文件

<#--
    日期类型
    日期类型不能在FreeMarker页面输出,需要改成日期型或者String输出
        方式一:年月日         ?date
        方式二:时分秒         ?time
        方式三:年月日时分秒   ?datetime
        方式四:指定格式      ?string("自定义格式")
                             y:年 M:⽉ d:⽇
                             H:时 m:分 s:秒
    官网:http://freemarker.foofun.cn/ref_builtins_date.html
-->
<h2>日期类型</h2>
<h2>${time?date}</h2>
<h2>${time?time}</h2>
<h2>${time?datetime}</h2>
<h2>${time?string("yyyy年MM月dd日 HH:mm:ss")}</h2>

数值类型

Java文件

/**
 * 数值类型
 *
 * @author  Promsing(张有博)
 * @since  2022/12/31 - 19:27
 * @version 1.0.0
 */
@WebServlet("/f04")
public class Freemarker04 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setAttribute("age",18);
        req.setAttribute("num",10000);
        req.setAttribute("avg",0.05688);
        //转发给ftl文件中
        req.getRequestDispatcher("template/fmk04.ftl").forward(req,resp);
    }
}

HTML文件

<#--
    数值类型
    在FreeMarker中数值类型可以直接输出
        1.转字符串
            普通字符串   ?c
            货币类型字符串   ?string.currency
            百分比字符串     ?string.percent
        2.保留浮点型数值指定小数位(#表示一个小数位)
            ?string["0.##"]
     官方网址:http://freemarker.foofun.cn/ref_builtins_number.html
-->
<h2>数值类型</h2>
<h2>${age}</h2>
<h2>${num}</h2>
<h2>${avg}</h2>
<h2>普通字符串${num?c}</h2>
<h2>货币类型${num?string.currency}</h2>
<h2>百分比类型${avg?string.percent}</h2>
<h2>小数一位${avg?string["0.##"]}</h2>

字符串类型

Java文件

/**
 * 字符串类型
 *
 * @author  Promsing(张有博)
 * @since  2022/12/31 - 19:27
 * @version 1.0.0
 */
@WebServlet("/f05")
public class Freemarker05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       req.setAttribute("str","小小张自由");
       req.setAttribute("string","www.BAIDU.com");
        //转发给ftl文件中
        req.getRequestDispatcher("template/fmk05.ftl").forward(req,resp);
    }
}

HTML文件

<#--
    字符串类型
    在FreeMarker中字符串类型可以直接输出
      常用的方法如下
      1.截取字符串(左闭右开)  ?substring(start,end)
      2.首字母小写输出  ?uncap_first
      3.首字母大写输出  ?cap_first
      4.字母转小写输出  ?lower_case
      5.字母转大写输出  ?upper_case
      6.获取字符串长度  ?length
      7.是否以指定字符开头 (Boolean类型) ?starts_with("xx")?string
      8.是否以指定字符结尾 (Boolean类型) ?end_with("xx")?string
      9.获取指定字符的索引   ?index_of("xx")
      10.去除字符串前后空格  ?trim
      11.替换指定字符串      ?replace("xx","yy")

      官方文档:http://freemarker.foofun.cn/ref_builtins_string.html
-->

<h2>字符串类型</h2>
<h2>str--${str}</h2>
<h2>string--${string}</h2>
<h2>截取字符串--${str?substring(0,3)}</h2>
<h2>首字符小写--${string?uncap_first}</h2>
<h2>首字符大写--${string?cap_first}</h2>
<h2>字母转小写--${string?lower_case}</h2>
<h2>字母转大写--${string?upper_case}</h2>
<h2>获取字符串长度--${string?length}</h2>
<h2>是否以ww字符开头--${string?starts_with("ww")?string}</h2>
<h2>是否以ww字符结尾--${string?ends_with("ww")?string}</h2>
<h2>获取 . 字符的索引--${string?index_of(".")}</h2>
<h2>去除字符串前后空格--${string?trim}</h2>
<h2>替换指定字符串--${string?replace("www","zzz")}</h2>
<h2>字符串类型</h2>

sequence(序列类型)

包含数组、List集合、Set集合
Java代码

public class User {
    private int id;
    private String name;
    private int age;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


/**
 * sequence类型
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/12/31 - 19:27
 */
@WebServlet("/f06")
public class Freemarker06 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //数组
        String[] strs = new String[]{"周杰伦", "林青霞", "黄飞鸿", "成龙"};
        req.setAttribute("strs", strs);
        //list集合
        List<String> citys = Arrays.asList("上海", "北京", "杭州", "深圳");
        req.setAttribute("citys", citys);

        List<User> userList = new ArrayList<>();
        userList.add(new User(1,"zhangsan",22));
        userList.add(new User(2,"lisi",28));
        userList.add(new User(3,"wangwu",34));
        userList.add(new User(4,"liuliu",44));
        req.setAttribute("userList",userList);
        //转发给ftl文件中
        req.getRequestDispatcher("template/fmk06.ftl").forward(req, resp);
    }
}

HTML文件


<#--序列类型(数组/list/set)
    通过list指令输出序列
    <#list 序列名 as 元素名>
        ${元素名}
    </#list>
    获取序列的长度                     ${元素名?size}
    获取序列元素的下标(循环内使用)       ${元素名?index}
    获取第一个元素                     ${元素名?first}
    获取最后一个元素                    ${元素名?last}

    倒序输出     序列名?reverse
    升序输出     序列名?sort
    降序输出     序列名?sort?reverse
    指定字段名排序     序列名?sort_by("字段名")
        注:一般是JavaBean集合
-->

<h2>数组、集合类型</h2>
<h2>数组</h2>
<#list strs as str>
    ${str?index}--${str}<br>
</#list>
获取序列的长度         ${strs?size} <br>
获取第一个元素       ${strs?first} <br>
获取最后一个元素       ${strs?last} <br>
<h2>--------------</h2>

<h2>集合list</h2>
<#list citys as ty>
    ${ty?index}--${ty}<br>
</#list>

<h2>集合list实体</h2>
<#list userList as user>
   编号:${user.id} &nbsp;姓名:${user.name} &nbsp;年龄:${user.age} <br>
</#list>

<#list userList?sort_by("age") as user>
    编号:${user.id} &nbsp;姓名:${user.name} &nbsp;年龄:${user.age} <br>
</#list>

Hash类型

注意key值只能是String类型,其他类型的话,根据key取value会报错
Java代码

/**
 * hash类型
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/12/31 - 19:27
 */
@WebServlet("/f07")
public class Freemarker07 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //hashMap
        Map<String , User> map = new HashMap<>();
        map.put("1",new User(1,"zhangsan",22));
        map.put("2",new User(2,"lisi",28));
        map.put("3",new User(3,"wangwu",34));
        map.put("4",new User(4,"liuliu",44));
        req.setAttribute("userMap",map);


        Map<String, String> strMap = new HashMap<>();
        strMap.put("11","yi");
        strMap.put("22","er");
        strMap.put("33","san");
        req.setAttribute("strMap",strMap);
        //转发给ftl文件中
        req.getRequestDispatcher("template/fmk07.ftl").forward(req, resp);
    }
}

HTML文件

<#--
    hash类型
    key遍历输出
        经过测试只有String类型能使用这种方式
        <#list hash?keys as key>
            ${key}---${hash[key]}
        </list>
    value遍历输出
        <#list hash?values as value>
            ${value}
        </list>
-->

<h2>hash类型,key遍历输出</h2>
<h2> 经过测试只有String类型能使用这种方式{strMap[key]}</h2>
<#--获取key,value-->
<#list strMap?keys as key>
    Key: ${key} ---${strMap[key]} <br>
</#list>


<h2>hash类型,value遍历输出</h2>
<#--获取key-->
<#list userMap?values as value>
    编号:${value.id} &nbsp;姓名:${value.name} &nbsp;年龄:${value.age} <br>
</#list>


<h2>hash类型,value遍历输出</h2>
<h2>此时Key为String类型</h2>
<#list userMap?keys as key>
    Key: ${key} ---${userMap[key].name} <br>
</#list>

3.3 空值处理

FreeMarker空值、null值会报错,空字符串可以
解决办法
_FreeMarker提供两个运算符来避免空值

  1. !:指定缺失变量的默认值
    _ v a l u e ∗ ∗ ! ∗ ∗ ∗ ∗ 如 果 v a l u e 值为空,默认显示空字符 串 ∗ ∗ {value**!**} **_如果value值为空,默认显示空字符串 _** value!value值为空,默认显示空字符{value!**“默认值”} **_如果value值为空,默认显示"默认值"
  2. ??:判断变量是否存在
    如果变量存在,返回true,否则返回false
    _${(value??)?string}
<h3>空字符串:${massage!}</h3>
<h3>默认值:${massage!"空字符串变默认值"}</h3>
<h3>判断是否存在:${(massage??)?string}</h3>

4、常用指令

4.1 assign 自定义变量指令

<#--
   自定义变量指令 assign
   使用assign指令可以创建一个新的变量,或者替换已经存在的变量
    语法:
    <#assign 变量名=>
    <#assign 变量名= 变量名=>定义多个变量
-->
<h2>自定义指令assign</h2>
<#assign str="hello">
${str}<br>

<#assign num=1,names=["zhangsan","lisi","wangwu"]>
${num} --${names?join(".")}
<br>
  
获取对象中的数据
<#assign mapData={"name":"程序员", "salary":15000}>
${mapData["name"]}
${mapData["salary"]}

4.2 if elseif 逻辑判断指令

<#--
   if,else,elseif 逻辑判断指令
   <#if condition>
          ...
   <#elseif condition>
          ...
   <#else condition>
          ...
   </#if>
   注意:condition将被计算成布尔表达式
   elseif,else指令都是可选的
-->
<h2> if,else,elseif 逻辑判断指令</h2>
<#assign score=88>
<#if  score lt 60 >
        不及格的成绩 ${score}
    <#elseif score==60>
        及格的成绩 ${score}
    <#elseif score gt 60 && score lt 80>
        优秀的成绩 ${score}
    <#else>
        接近满分的成绩 ${score}
</#if>

<h2>判断数据是否存在</h2>
<#assign list="">
<#if list??>
        list存在
    <#else>
        list不存在
</#if>

<#if set??>
        set存在
    <#else>
        set不存在
</#if>

4.3 list 遍历指令

<#--
    list指令
        格式1
            <#list sequence as item>
                ${item}
            </#list>
       格式1
            <#list sequence as item>
                ${item}
            <#else>
                当没有选项是执行else
            </#list>
-->

<#assign list=["lisi","shangsan","liuliu"]>
<h3>list指令-循环</h3>
<#list list as item>
    ${item} <br>
</#list>

<h3>if-list指令</h3>
<h3>相当于空指针判断</h3>
<#if map??>
    <#list map as mm>
        ${mm} <br>
    </#list>
</#if>

<#assign set=[]>
<h3>list-else指令</h3>
<#list set as item>
    ${item} <br>
    <#else>
    输出默认值
</#list>

4.4 marco自定义指令

<#--
    自定义指令
    1.基本使用:
        格式:
            <#macro 指令名>
                指令内容
            </#macro>
        使用:
            <@指令名></@指令名>
    2.有参数的自定义指令

    注意:指令可以多次使用
           自定义指令可以包含字符串,也可以包含内置指令
-->

声明指令<br>
<#macro address>
    河北省邯郸市大名县黄金堤乡
</#macro>
使用:
<@address></@address>
<hr>

声明 自定义有参数指令<br>
<#macro queryUserByName uname>
    通过用户名查询对象  ${uname}
</#macro>
使用:
<@queryUserByName uname="admin"></@queryUserByName>
<hr>
声明 自定义多参数指令<br>
<#macro queryUserByName2 uname upwd uphone>
    通过用户名查询对象  ${uname} -- ${upwd} --${uphone}
</#macro>
使用:
<@queryUserByName2 uname="admin" upwd="123" uphone="1508888"></@queryUserByName2>

4.5 nested 占位指令

<#--
    nested 占位指令
        nested 相当于占位符,一般结合macro指令一起使用
        (自我感觉像是传参数的自定义指令)
        可以将自定义指令中的内容通过nested指令占位,
        当使用自定义指令时,会将占位内容显示
-->

<#macro test>
    这是一个文本!!!,即将要被插--------
    <br>
    <#nested>
    <#nested>
</#macro>

<@test>这是插入的内容</@test>

4.6 import指令与include指令

** 导入指令 import**
在ftl文件中引入命名空间,可以使用引入的空间的宏
** 包含指令 include**
可以包含其他页面文件,比如说html,ftl,txt

<#--
    导入指令 import
        在ftl文件中引入命名空间,可以使用引入的空间的宏
    包含指令 include
        可以包含其他页面文件,比如说html,ftl,txt
-->
<#-- 导⼊命名空间 -->
<#import "commons.ftl" as common>
<#-- 使⽤命名空间中的指令 -->
<@common.cfb num=5></@common.cfb>


<#--包含指令(引⼊其他⻚⾯⽂件) include-->
<#--html⽂件-->
<#include "hello.html">
<#--freemarker⽂件-->
<#include "fmk12.ftl">
<#--txt⽂件-->
<#include "test.txt">


其他文件

此文件定义通用的宏 macro

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


<#macro zyb>
      <h2>我是张有博</h2>
</#macro>

5、页面静态化

通过上述介绍可知 Freemarker 是⼀种基于模板的、⽤来⽣成输出⽂本的通⽤⼯具,所以我们必须要定制符合⾃⼰业务的模板,然后⽣成⾃⼰的 html ⻚⾯。Freemarker 是通过freemarker.template.Configuration 这个对象对模板进⾏加载的(它也处理创建和缓存预解析模板的⼯作),然后我们通过 getTemplate ⽅法获得你想要的模板,有⼀点要记住freemarker.template.Configuration 在你整个应⽤必须保证唯⼀实例。

5.1 定义模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>页面静态化</title>
</head>
<body>
    <h2 align="center" >${title}</h2>

    <p align="center">
        新闻来源:${source} &nbsp;&nbsp;
        发布时间:${pubTime?datetime}
    </p>

    <p style="text-indent: 2em">
        ${content}
    </p>
</body>
</html>

5.2 Java文件

/**
 * 页面静态化
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2023/1/2 - 15:52
 */
@WebServlet("news")
public class NewsServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 实例化模板配置对象
        Configuration configuration = new Configuration();
        // 设置加载模板的上下⽂ 以及 设置加载模板路径(模板存放的路径)

        configuration.setServletContextForTemplateLoading(getServletContext(),"/template");
        // 设置模板的编码格式
        configuration.setDefaultEncoding("UTF-8");
        // 加载模板⽂件,获取模板对象
        Template template = configuration.getTemplate("news.ftl");
        // 设置模型数据
        Map<String,Object> map = new HashMap<>();
        map.put("title", "特别就业季:稳就业情况如何? 哪些问题待解?");
        map.put("source", "⼈⺠⽇报");
        map.put("pubTime", new Date());
        map.put("content", "中共中央政治局常务委员会近⽇召开会议强调," +
                "要有针对性地开展援企、稳岗、扩就业⼯作," +
                "做好⾼校毕业⽣、农⺠⼯等重点群体就业⼯作," +
                "积极帮助个体⼯商户纾困。疫情期间,稳就业情况如何?还有哪些问题待解?" +
                "记者采访了不同群体,记录这个特别的就业季。");
        // 获取项⽬所在的根⽬录
        String basePath = req.getServletContext().getRealPath("/");
        // 设置⻚⾯存放的⽬录
        File htmlFile = new File(basePath + "/html");
        // 判断⽬录是否存在
        if (!htmlFile.exists()) {
            // 如果⽬录不存在,则新建⽬录
            htmlFile.mkdir();
        }
        // 获取⽂件名(随机⽣成不重复的⽂件名)
        String fileName = System.currentTimeMillis() + ".html";
        // 创建html⽂件
        File file = new File(htmlFile, fileName);
        // 获取⽂件输出流
        FileWriter writer = new FileWriter(file);
        try {
            // 输出html 将模型数据填充到模板中
            template.process(map, writer);
            // 输出成功
            System.out.println("新闻创建成功!");
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            writer.flush();
            writer.close();
        }
    }
}

5.3 生成HTML文件

浏览器地址栏输⼊: http://localhost:端口号/news
⽣成的⽂件存放在当前项⽬的webapp⽬录下的html⽬录中。

6、运算符

6.1 算术运算符

<#--
   算术运算符
     +、-、*、/、%
     ${a1+a2},只有在{}内才能生效
-->

<#assign a1=8 a2=2>
${a1}+${a2}=${a1+a2}<br>
${a1}-${a2}=${a1-a2}<br>
${a1}*${a2}=${a1*a2}<br>
${a1}/${a2}=${a1/a2}<br>
${a1}%${a2}=${a1%a2}<br>
<!--字符串运算-->
${"hello"+","+"FreeMarker"}

6.2 逻辑运算符

<#--
   逻辑运算符
      &&、\\、!
-->

6.3 比较运算符

<#--
   比较运算符
      > (gt):大于号,推荐使用 gt
      < (lt):小于号,推荐使用 lt
      >= (gte):大于等于,推荐使用 gte
      <= (lte):小于等于,推荐使用 lte
      ==:等于
      !=:不等于
-->

6.4 空值运算符


<#--
   空值运算符
        1.??判断是否为空,返回布尔类型
          如果不为空返回false,如果为空返回true,不能直接输出
          ${(name??)?string}
        2.!: 设置默认值,如果为空,则设置默认值
          1.设置默认为空字符串    ${name!}
          2.设置默认值           ${name!'张三'}

-->

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

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

相关文章

动态化护眼全新体验,被誉为“护眼神器”的南卡护眼台灯Pro评测出炉

自从家中的孩子上小学后&#xff0c;随着课后作业的逐渐增加&#xff0c;在书房学习时间更长了&#xff0c;由于平时关注到孩子用眼习惯&#xff0c;眼睛有些轻度近视。作为年轻一代的家长&#xff0c;对孩子的用眼健康方面一定要重视&#xff0c;在照明方面&#xff0c;护眼台…

Redis基础篇:Redis简介和安装

第一章&#xff1a;Redis简介 一&#xff1a;简介 Redis诞生于2009年&#xff0c;基于内存的键值型NoSQL数据库。 二&#xff1a;特征 1&#xff1a;键值型&#xff1a;value支持多种不同的数据结构&#xff0c;功能丰富。 2&#xff1a;单线程&#xff1a;单线程执行命令&…

Kubernetes介绍

1 什么是Kubernetes&#xff1f; Kubernetes是容器集群管理系统&#xff0c;是一个开源的平台&#xff0c;可以实现容器集群的自动化部署、自动扩缩容、维护等功能。 使用Kubernetes可以&#xff1a; ● 自动化容器的部署和复制 ● 随时扩展或收缩容器规模 ● 将容器组织成组&…

第四章.神经网络—单层感知器

第四章.神经网络 4.1 单层感知器 1.单层感知器示意图 1).第一种表示方法&#xff1a; 举例说明&#xff1a; 2).第二种表示方法&#xff1a; 公式推导&#xff1a; 举例说明&#xff1a; 预测值(y)和标签值(t)相同&#xff0c;停止迭代循环. 2.学习率η 1).η取值说明&…

Python流程控制语句之跳转语句

上一篇&#xff1a;Python流程控制语句之循环语句 文章目录前言一、break 语句二、continue 语句三、pass 空语句总结前言 上一篇博客我们讲解了Python中的循环语句&#xff0c;知道循环条件一直满足时&#xff0c;代码将会一直执行下去&#xff0c;就像一辆迷路的车&#xff…

《满江红》《流浪地球2》孰能胜出,元宇宙电影能否成为票房黑马?

截止1月28日12时&#xff0c;2023年春节档期总票房达67.57亿元。其中&#xff0c;《满江红》以26.05亿元票房居2023年春节档票房榜榜首&#xff1b;《流浪地球2》位居第二&#xff0c;票房成绩为21.63亿元。摆在未来人类面前就两条路,一条向外星辰大海,一条向内元宇宙。《流浪地…

微信小程序017音乐播放器系统 php java

小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 后端技术:javaSsm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 基于音乐播放器小程序的设计基于现有的手机&#xff0c;可以实现首页、个人中心、用户管理&#xff0c;音乐…

拉伯证券|开盘暴跌20%,三文鱼第一股业绩变脸!

超900家公司成绩预亏&#xff0c;多家公司发布成绩预告后大跌。 佳沃食品今天开盘20%跌停&#xff0c;这是该股史上开盘最大跌幅。早盘该股成交额显着扩展&#xff0c;半日成交额超越3.5亿元&#xff0c;收盘跌18.04%。 资料显现&#xff0c;佳沃食品是优质蛋白食品领域的大消…

python入门教程(非常详细),python贪吃蛇最简单代码

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python编程代码大全设计入门&#xff0c;python入门教程(非常详细)&#xff0c;现在让我们一起来看看吧&#xff01; 1、python编程例子有哪些&#xff1f; python编程经典例子&#xff1a; 1、画爱心表白、图形都是由…

除了Navicat破解版、DBeaver,免费还好用的数据库管理工具/SQL工具还有推荐吗?

很多国内SQL学习者和开发者对Navicat、DBeaver等国外数据库管理工具已经很熟悉了。但是&#xff0c;有没有比他们更适合SQL开发者的数据库管理/SQL工具呢&#xff1f;这里&#xff0c;笔者结合自己的调研来聊一下。 笔者做过一些用户调研。 Navicat虽然功能强大&#xff0c;但…

win10安装opencv

第一步&#xff1a;会有skbuild&#xff0c;cmake等依赖库报错&#xff0c;先安装依赖pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-buildpip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple cmake第二步&#xff1a;pip3 install opencv-python若…

Python数据可视化之折线图

Python数据可视化之折线图 提示&#xff1a;前言 Python数据可视化之折线图 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录Python数据可视化之折线图前言一、导入包二、选择数据集三、折线图四、图形的大小和图表…

什么游戏视频录制软件比较好?10 款的游戏录屏软件你值得收藏

市面上有各种各样的游戏捕捉软件&#xff0c;当然&#xff0c;它们都声称是有史以来最好的游戏软件。但有些比其他的更好&#xff0c;最适合您的游戏记录器在很大程度上取决于您要玩的游戏以及您运行的 PC 类型。 目前最好的游戏屏幕录像机 让我们来探索自称是最佳游戏屏幕录…

NetLogo 语法总结

NetLogo 语法总结NetLogo语法的怪异。。。。。。NetLogo语法关键在于你要把它当成一个软件使用&#xff0c;而不是一个通用的编程语言。首先&#xff0c;上网搜搜setup go是怎么用的&#xff0c;或者买本书&#xff0c;本文不再赘述NetLogo世界turtlespatcheslinksobserver(上帝…

np.savetxt()存储数据

前言 使用np.savetxt()方法可以将数据保存为txt文件或者是csv文件。 1 np.savetxt()存储txt文件 1-1 基础参数 numpy.savetxt(fname,arrry,fmt%.18e,delimiter ,newline\n,header,footer,comments# ,encodingNone,) 1-2 参数详解 fname:要存入的文件、文件名、或生成器。 ar…

令人窒息的百度面试题(正值换工作季,还不收藏???)

最近去网上找了一些百度的面经&#xff0c;冥冥之中在众多的面试题中打开了下边两个面试题&#xff1a; 2021百度前端社招面经 百度前端面试题分享&#xff0c;带答案 看完之后我直呼“哇哦~”&#xff0c;全部在我的射程范围之内。我该不会如此幸运到问的全会吧。 是的&am…

横扫150道MySQL大厂面试题【视频+文档】

MySQL是程序员面试的必考题&#xff0c;因其体系庞大&#xff0c;架构设计复杂&#xff0c;是面试的重点与难点。教程基于大厂面试的充分调研&#xff0c;深度挖掘用人企业的标准与要求&#xff0c;针对MySQL知识体系和高频面试题&#xff0c;把内容分为五大部分&#xff1a;My…

如何保障MES系统实施?实现“大物流、小生产”

MES系统的成功应用不只是单单将软件系统开发出来&#xff0c;然后直接安装应用就可以进行运行做工。MES系统的运行需要从多个方面出发&#xff0c;确保软件系统的成功实施部署&#xff0c;然后在生产当中发挥自己的作用。实际情况开发为了确保MES系统的正常运行&#xff0c;必须…

一年测试经验,终于找到大厂的工作了

前两天有个小伙伴在后台留言&#xff0c;最近的面试越来越难了&#xff0c;尤其是技术面&#xff0c;考察得越来越细&#xff0c;庆幸的是最终顺利找到了某大厂工作。 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识 比如果这样的问题&#xff1a; 所…

Springboot+vue+vue在线日程管理系统 java

&#xff08;1&#xff09;应用主类SpringbootApplication应该放于根目录下springboot下&#xff0c;通常我们会在主类中做一些框架配置 扫描等配置&#xff0c;SpringbootApplication放在根目录下可以可以帮助程序减少手工配置来加载到我们希望被Spring加载的内容。   &…