JAVAWeb11-服务器渲染技术 -JSP-01-JSP基础

1. 现状

1、JSP 使用情况
在这里插入图片描述
在这里插入图片描述

2、Thymeleaf 使用情况, 通常和 SpringBoot 结合(也会讲)
在这里插入图片描述
在这里插入图片描述

3、Vue 使用情况
在这里插入图片描述
在这里插入图片描述

2. 学 JSP 前,老师要说的几句话

  1. 目前主流的技术是 前后端分离 (比如: Spring Boot + Vue/React), 我们会讲的.[看一下]
  2. JSP 技术使用在逐渐减少,但使用少和没有使用是两个意思,一些老项目和中小公司还在使用 JSP,工作期间,你很有可能遇到 JSP
  3. 小结:JSP 使用在减少(但是现阶段还是有必要学一下,让我们的技术栈更加全面), 我们最佳技术策略 : JSP (能基本使用,能看懂,能维护相关项目, 不用深入)

在这里插入图片描述

3. 为什么需要 JSP

  1. 程序员在开发过程中,发现 servlet 做界面非常不方便
    在这里插入图片描述
  2. 引出 JSP 技术,JSP 公式
    jsp=html+java 代码+标签+javascript+css

4. 官方文档

4.1 文档

java_ee_api_中英文对照版.chm

5. JSP 基本介绍

  1. JSP 全称是 Java Server Pages,Java 的服务器页面(服务器渲染技术)
    在这里插入图片描述

  2. JSP 这门技术的最大的特点在于,写 JSP 就像在写 HTML

  • 相比 html 而言,html 只能为用户提供静态数据,而 JSP 技术允许在页面中嵌套 java 代码,为用户提供动态数据
  • 相比 Servlet 而言,Servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产 生动态数据的同时,也很容易对数据进行排版。
    在这里插入图片描述
  1. jsp 技术基于 Servlet, 你可以理解成 JSP 就是对 Servlet 的包装.

  2. 会使用 JSP 的程序员, 再使用 thymeleaf 是非常容易的事情, 几乎是无缝接轨.

6. JSP 快速入门

6.1 应用实例-JSP 基本使用

  1. 创建 hspedu_jsp WEB 项目,并引入 jar
    在这里插入图片描述
  2. 创建 sum.jsp(在web目录下)
<%@ page import="java.io.PrintWriter" %>
<%@ page import="org.apache.jasper.runtime.HttpJspBase" %><%--
  Created by IntelliJ IDEA.
  User: 吴嘉旭
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp的简单的求和计算器</title>
</head>
<body>
<h1>jsp的简单的求和计算器</h1>
<%
    //解读
    //1. 在jsp的 该标签中, 可以写java代码

    int i = 10;
    int j = 20;
    int res = i + j;

    //2. jsp 中内置对象,可以直接使用, 比如 out
    //   小技巧:先死后活 格式化快捷键:ctrl + alt + l
    // 需要引入jar包方可使用
    out.println(i + " + " + j + " = " + res);
    
%>
<!--html注释 -->
</body>
</html>

  1. 启动 tomcat,并浏览器访问
    在这里插入图片描述

6.2 注意事项和细节

  1. jsp 页面不能像 HTML 页面, 直接用浏览器运行。只能通过浏览器访问 Tomcat 来访问jsp 页面
  2. 如何设置 jsp 模板
    在这里插入图片描述
    在这里插入图片描述

7. JSP 运行原理

  1. jsp 页面本质是一个 Servlet 程序, 其性能是和 java 关联的, 只是长得丑.
  2. 第 1 次访问 jsp 页面的时候。Tomcat 服务器会把 jsp 页面解析成为一个 java 源文件。并 且 对 它 进 行 编 译 成 为 .class 字 节 码 程 序 。 看 下 Cal.jsp 对 应 的 cal_jsp.java 和
    cal_jsp.class 文件
    在这里插入图片描述
    在这里插入图片描述
<%@ page import="java.io.PrintWriter" %>
<%@ page import="org.apache.jasper.runtime.HttpJspBase" %><%--
  Created by IntelliJ IDEA.
  User: 吴嘉旭
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp的简单的求和计算器</title>
</head>
<body>
<h1>jsp的简单的求和计算器</h1>
<%
    //解读
    //1. 在jsp的 该标签中, 可以写java代码

    int i = 10;
    int j = 20;
    int res = i + j;

    //2. jsp 中内置对象,可以直接使用, 比如 out
    //   小技巧:先死后活 ctrl + alt + l
    out.println(i + " + " + j + " = " + res);
    //3. 老师说明,如果要看HttpJspBase类的关系, 需要引入一个包,jasper.jar => alt+enter

    //在java片段中,仍然是java的注释
    String email = "xx@qq.com";
    /*
        多行注释
     */
    HttpJspBase

%>
<%--email: <%=email%>--%>
<!--html注释 -->
</body>
</html>

  1. 分析下 cal_jsp.java 的源码,可以看出本质就是 Servlet, 老师给大家简单分析一把… 提醒:要看到源码和分析类图,需要加入 jasper.jar 这个包[在 tomcat/lib 下拷贝]
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8. page 指令(常用的)

在这里插入图片描述

  1. language 表示 jsp 翻译后是什么语言文件, 只支持 java
  2. contentType 表示 jsp 返回的数据类型,对应源码中 response.setContentType()参数值
  3. pageEncoding 属性 表示当前 jsp 页面文件本身的字符集
  4. import 属性 跟 java 源代码中一样。用于导包,导类

9. JSP 三种常用脚本

9.1 声明脚本基本语法

  1. 声明脚本的格式是: <%! 声明 java 代码 %>
  2. 作用:定义 jsp 的需要属性、方法、静态代码块和内部类等
  3. 应用实例:
    创建 statement.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp声明脚本</title>
</head>
<body>
<h1>jsp声明脚本</h1>
<%!
    //这里我们可以声明该jsp需要使用的属性,方法,静态代码块, 内部类
    //老师一句话: 也就是给 statement.jsp 对应的 statement_jsp 类定义成员
    //1. 属性
    private String name = "jack";
    private int age;
    private static String company;

    //2 方法
    public String getName() {
        return name;
    }
    //3. 静态代码块
    static {
        company = "字节跳动";
    }
%>
</body>
</html>

9.2 表达式脚本基本语法

  1. 表达式脚本的格式是:<%=表达式%>
  2. 表达式脚本的作用是:在 jsp 页面上输出数据
  3. 表达式脚本中的表达式不能以分号结束。

9.3 表达式脚本应用实例

应用实例: 演示表达式脚本的使用
在这里插入图片描述

<%--
  Created by IntelliJ IDEA.
  User: 吴嘉旭
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>表达式脚本的使用</title>
</head>
<body>
<h1>个人信息</h1>
<%
    String name = "老韩";
    String email = request.getParameter("email");
%>
用户名: <%=name%><br/>
工作是: <%="java工程师"%><br/>
年龄: <%=request.getParameter("age")%><br/>
电邮: <%=email%>
</body>
</html>

9.4 代码脚本基本语法

  1. 代码脚本的语法是:<% java 代码%>
  2. 代码脚本的作用是:可以在 jsp 页面中,编写我们需要的功能(使用 java )
  3. 可以由多个代码脚本块组合完成一个完整的 java 语句。
  4. 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据

9.5 代码脚本应用实例

  1. 演示代码脚本的使用(如图)
    在这里插入图片描述
  2. 创建 Monster.java
public class Monster {
    private Integer id;
    private String name;
    private String skill;

    public Monster(Integer id, String name, String skill) {
        this.id = id;
        this.name = name;
        this.skill = skill;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }
}

  1. 创建 java_code.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.hspedu.entity.Monster" %>
<%--
  Created by IntelliJ IDEA.
  User: 吴嘉旭
  Version: 1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>演示代码脚本</title>
</head>
<body>
<h1>演示代码脚本</h1>
<%
    //创建ArrayList ,放入两个monster对象
    ArrayList<Monster> monsterList = new ArrayList<>();
    monsterList.add(new Monster(1, "牛魔王", "芭蕉扇"));
    monsterList.add(new Monster(2, "蜘蛛精", "吐口水"));
%>
<table bgcolor="#f0f8ff" border="1px" width="300px">
    <tr>
        <th>id</th>
        <th>名字</th>
        <th>技能</th>
    </tr>
    <%
        for (int i = 0; i < monsterList.size(); i++) {
            //先取出monster对象
            Monster monster = monsterList.get(i);
    %>
            <tr>
                <td><%=monster.getId()%></td>
                <td><%=monster.getName()%></td>
                <td><%=monster.getSkill()%></td>
            </tr>
            <%
        }
    %>

</table>
</body>
</html>

10. JSP 注释

  1. 演示 jsp 注释的使用
    在这里插入图片描述

11. JSP 内置对象

● 基本介绍 [讲解]
1、JSP 内置对象(已经创建好的对象, 直接使用 inbuild),是指 Tomcat 在翻译 jsp 页面成为Servlet 后,内部提供的九大对象,叫内置对象
2、内置对象,可以直接使用,不需要手动定义

● JSP 九大内置对象

  1. out 向客户端输出数据,out.println("");
  2. request 客户端的 http 请求
  3. response 响应对象
  4. session 会话对象
  5. application 对应 ServletContext
  6. pageContext jsp 页面的上下文,是一个域对象,可以 setAttribue(),作用范围只是本页面
  7. exception 异常对象 , getMessage()
  8. page 代表 jsp 这个实例本身
  9. config 对应 ServletConfig

● 对照 Servlet 来理解就比较轻松了. (老师学技术的思路: 只要去学某个类,建议熟练该类的继承关系)

  1. 一张图, 展示了 JSP 的父类 HttpJspBase 继承关系, 说明 JSP 内置对象的来源是 Servlet 和 HttpJspPage
    在这里插入图片描述

  2. 创建 HiServlet.java

public class HiServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HiServlet 被调用..");

        //梳理 servlet中可以使用哪些对象
        PrintWriter writer = response.getWriter();
        writer.println("haha");
        request.getParameter("age");
        response.setContentType("text/html;charset=utf-8");
        HttpSession session = request.getSession();
        session.setAttribute("job", "java工程师90000");
        //
        ServletContext servletContext = request.getServletContext();
        servletContext.setAttribute("count", 666);
        ServletConfig servletConfig = getServletConfig();
        servletConfig.getInitParameter("pwd");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  1. 创建 inbuild.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jsp内置对象</title>
</head>
<body>
<h1>jsp内置对象</h1>
<%
    //梳理jsp的内置对象
    //out 类型是 JspWriter 父类就是 Writer.
    out.println("jsp out");
    //request是HttpServletRequest
    request.getParameter("age");
    //response就是 HttpServletResponse
    //response.sendRedirect("http://www.baidu.com");
    //session 就是 HttpSession
    session.setAttribute("job", "PHP工程师");
    //application类型就是ServletContext
    application.setAttribute("name", "老师");
    //pageContext 可以存放数据(属性), 但是该数据只能在本页面使用
    pageContext.setAttribute("age", 100);
    //exception 异常对象 使用比较少
    //page 内置对象,类似 this
    out.println("page=" + page);
    //config 内置对象的类型就是ServletConfig
    String pwd = config.getInitParameter("pwd");


%>
</body>
age: <%=pageContext.getAttribute("age")%>
</html>

12. JSP 域对象

12.1 JSP 四大域对象介绍[作用:存取数据]

  1. pageContext (域对象,存放的数据只能在当前页面使用),
    自己尝试去根据理解画出示意图
    在这里插入图片描述
  2. request (域对象,存放的数据在一次 request 请求有效), 【示意图】
    在这里插入图片描述
  3. session(域对象,存放的数据在一次会话有效), 【示意图】
    在这里插入图片描述
  4. application(域对象,存放的数据在整个 web 应用运行期间有效, 范围更大), 【示意图】
    在这里插入图片描述
    在这里插入图片描述

12.2 应用实例

  1. 演示域对象(四个域对象)的使用
  2. 创建 scope.jsp , 在域对象中存放数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope文件</title>
</head>
<body>
<%
    //在不同的域对象中,放入数据
    //解读
    //1. 因为四个域对象,是不同的对象,因此name(key) 相同时,并不会冲突
    pageContext.setAttribute("k1", "pageContext数据(k1)");
    request.setAttribute("k1", "request数据(k1)");
    session.setAttribute("k1", "session数据(k1)");
    application.setAttribute("k1", "application数据(k1)");

    //做一个请求转发的操作
    //路径应该怎么写,请不清楚地小伙伴,去看韩老师讲的web路径专题
    //request.getRequestDispatcher("/scope2.jsp").forward(request, response);

    //做一个重定向
    String contextPath = request.getContextPath();//返回的就是 web路径=>/jsp
    //response.sendRedirect("/jsp/scope2.jsp");
    response.sendRedirect(contextPath + "/scope2.jsp");
%>
<h1>四个域对象,在本页面获取数据的情况</h1>
pageContext-k1: <%=pageContext.getAttribute("k1")%><br/>
request-k1: <%=request.getAttribute("k1")%><br/>
session-k1: <%=session.getAttribute("k1")%><br/>
application-k1: <%=application.getAttribute("k1")%><br/>
</body>
</html>
  1. 创建 scope2.jsp, 在域对象中读取数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>scope2.js</title>
</head>
<body>
<h1>在scope2页面获取数据的情况</h1>
pageContext-k1: <%=pageContext.getAttribute("k1")%><br/>
request-k1: <%=request.getAttribute("k1")%><br/>
session-k1: <%=session.getAttribute("k1")%><br/>
application-k1: <%=application.getAttribute("k1")%><br/>
</body>
</html>

12.3 JSP 四大域对象注意事项和细节

  1. 域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存储范围
  2. 从存储范围(作用域范围看) pageContext < request < session < application

13. JSP 请求转发标签

  1. 演示请求转发标签使用,如图
    在这里插入图片描述
  2. 创建 aa.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>aa.jsp</title>
</head>
<body>
<h1>aa.jsp</h1>
<%--老师解读
1. jsp提供了很多标签,但是因为jsp不是重点,就讲一个常用forward
2. jsp:forward 本质就是 等价 request.getRequestDispatcher("/bb.jsp").for...
--%>
<jsp:forward page="/bb.jsp"></jsp:forward>
</body>
</html>
  1. 创建 bb.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>bb.jsp</title>
</head>
<body>
<h1>bb.jsp页面</h1>
</body>
</html>
  1. 完成测试
    在这里插入图片描述

14. 课后作业-JSP 版本的计算器

14.1 作业布置

● 需求分析: 使用 jsp 完成一个简单的计算器, 需求如图
在这里插入图片描述

  1. 要求在前端页面对输入的 num1 和 num2 进行校验【提示: 正则表达式, 如果忘了回去看 java 的正则表达式 27 章】, 必须是整数
  2. 验证成功, 提交数据给服务器, 能够显示结果
  3. 点击超链接, 可以返回界面
  4. 其 它 完 善 考 虑 [ 思 考 题 ]=> 如 果 用 户 这 样 提 交
    http://localhost:8080/jsp/calServlet?num1=aaa&num2=90
    , 需要你返回 calUI.jsp , 并给出提示信息

● 思路分析(程序框架图), 小伙伴也尝试自己设计一把.->实现->听老师评讲
在这里插入图片描述

14.2 实现

calUI.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP计算器</title>
    <!--使用js+正则表达式完成数据校验-->
    <script type="text/javascript">
        function check() {
            //得到 num1 和 num2值
            var num1 = document.getElementById("num1").value;
            var num2 = document.getElementById("num2").value;

            //验证 正则表达式, 整数 => 在java基础讲过 => 学习技术一定要经常回顾
            //我们学习的所有java技术=> 其实都是基础组合[oop,io,反射,注解,集合,线程,网络]
            var reg = /^[-]?([1-9]\d*|0)$/;
            if (!reg.test(num1)) {//如果不满足验证条件
                alert("num1 不是一个整数");
                return false;//放弃提交
            }
            if (!reg.test(num2)) {//如果不满足验证条件
                alert("num2 不是一个整数");
                return false;//放弃提交
            }
            return true;//提交到action指定的位置
        }
    </script>
</head>
<body>
<h1>JSP计算器</h1>
<form action="<%=request.getContextPath()%>/calServlet"
      method="post" onsubmit="return check()">
    num1: <input type="text" id="num1" name="num1"> num1错误:xx <br/>
    num2: <input type="text" id="num2" name="num2"> num2错误:xx<br/>
    运算符号:
    <select name="oper">
        <option value="+">+</option>
        <option value="-">-</option>
        <option value="*">*</option>
        <option value="/">/</option>
    </select><br/>
    <input type="submit" value="提交计算">
</form>
</body>
</html>

思考与总结:
1.js的正则表达式需要使用/表达式/不能使用双引号
2.js可以使用调用test的方法实现正则表达式或者使用字符串提供的match方法

CalServlet.java

public class CalServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("CalServlet 被调用...");
        //思路 ==> 代码
        //1. 是Servlet
        //2. 接收数据
        //String num1 = request.getParameter("num1");
        //String num2 = request.getParameter("num2");
        //进行转换->int
        double num1 = WebUtils.parseDouble(request.getParameter("num1"), 0);
        double num2 = WebUtils.parseDouble(request.getParameter("num2"), 0);
        String oper = request.getParameter("oper");
        double res = 0; //使用变量来接收运算结果
        //3. 完成计算
        if ("+".equals(oper)) {
            res = num1 + num2;
        } else if ("-".equals(oper)) {
            res = num1 - num2;
        } else if ("*".equals(oper)) {
            res = num1 * num2;
        } else if ("/".equals(oper)) {
            res = num1 / num2;
        } else {
            System.out.println(oper + " 不正确...");
        }
        //4. 把结果保存到域对象[request, session, servletContext]
        //   解读:因为一次请求对应一次计算, 所以我建议将结果保存到request
        //   思路: 把结果组织到一个字符串中., 方便我们在下一个页面显示
        //   java基础: String.format ,可以格式化字符串
        String formatRes = String.format("%s %s %s = %s", num1, oper, num2, res);
        request.setAttribute("res", formatRes);
        //System.out.println("formatRes= " + formatRes);
        //5. 转发到显示页面 calRes.jsp
        request.getRequestDispatcher("/cal/calRes.jsp").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

思考与总结:
1.如果将每个数字都放到request域对象中,显得过于麻烦,可以将结果作为一个整体放到域对象中

calRes.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>计算结果</title>
</head>
<body>
<h1>计算结果</h1>
<%=request.getAttribute("res")%><br/>
<%--<a href="/jsp/cal/calUI.jsp">返回重新来玩一把</a>--%>
<a href="<%=request.getContextPath()%>/cal/calUI.jsp">返回重新来玩一把~</a>
</body>
</html>

● 完成测试

在这里插入图片描述

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

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

相关文章

C. Maximum Subrectangle(思维 + 考察两个数组相乘得到的矩阵的含义)

Problem - C - Codeforces 给定两个正整数数组 a 和 b&#xff0c;长度分别为 n 和 m。 定义矩阵 c 为一个 nm 的矩阵&#xff0c;其中 ci,jai⋅bj。 你需要在矩阵 c 中找到一个子矩形&#xff0c;使得它的元素之和最多为 x&#xff0c;并且它的面积&#xff08;即元素总数&a…

【Redis】Redis分布式锁的10个坑

文章目录 前言1. 非原子操作&#xff08;setnx expire&#xff09;2.被别的客户端请求覆盖&#xff08; setnx value为过期时间&#xff09;3. 忘记设置过期时间4. 业务处理完&#xff0c;忘记释放锁5. B的锁被A给释放了6. 释放锁时&#xff0c;不是原子性7. 锁过期释放&…

【Linux内核解析-linux-5.14.10-内核源码注释】MM内存管理内核启动初始化源码解析

源码 这是Linux内核中的mm_init函数的代码&#xff0c;其作用是初始化内存管理相关的组件和数据结构。 static: 这是一个函数声明修饰符&#xff0c;表示该函数只在当前文件中可见。 void __init: 这是函数的返回类型和修饰符&#xff0c;表示该函数是内核初始化代码。 page…

Redis缓存(双写一致性问题)

Redis缓存&#xff08;双写一致性问题&#xff09; 1 什么是缓存?1.1 为什么要使用缓存1.2 如何使用缓存 2 添加缓存2.1 、缓存模型和思路2.2、代码如下 3 缓存更新策略3.1 、数据库缓存不一致解决方案&#xff1a;3.2 、数据库和缓存不一致采用什么方案 4 实现商铺和缓存与数…

( 字符串) 647. 回文子串 ——【Leetcode每日一题】

❓647. 回文子串 难度&#xff1a;中等 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使…

作业区域工服穿戴识别算法 yolov7

作业区域工服穿戴识别系统基于yolov7视频智能图像识别技术&#xff0c;作业区域工服穿戴识别算法模型利用深度学习技术&#xff0c;不需人为干预自动识别现场施工作业人员未按要求穿工作服行为&#xff0c;代替后台工作人员执勤时的人眼判断。YOLOv7 研究团队提出了基于 ELAN 的…

浅谈网络流

网络流 流网络&#xff1a; G ( V , E ) G(V,E) G(V,E)是一个有向图&#xff0c;网络中有两个特殊点&#xff1a;源点s与汇点t。容量用 c c c表示&#xff0c;流量用 f f f表示 流网络G中满足两个性质&#xff1a;1、容量限制(通过一条边的流量不会超过该边的容量)&#xff…

音视频技术开发周刊 | 291

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 谷歌将 AI 芯片团队并入云计算部门 追赶微软和亚马逊 OpenAI推出的ChatGPT获得一定成功&#xff0c;微软是OpenAI的重要投资者&#xff0c;它将ChatGPT植入必应搜索&#…

基于STATCOM的风力发电机稳定性问题仿真分析(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

thinkphp6 JWT报错 ‘“kid“ empty, unable to lookup correct key‘解决办法

文章目录 JWT简介安装问题先前的代码解决办法修改后的完整代码 JWT简介 JWT全称为Json Web Token&#xff0c;是一种用于在网络应用之间传递信息的简洁、安全的方式。JWT标准定义了一种简洁的、自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。由于它的简洁性、可…

关于SpringBoot整合Websocket实现简易对话聊天窗

前言 官网链接&#xff1a;Websocket Websocket 是什么&#xff1f;它可以将两个独立的浏览器窗口作为通信的两端。 这种形式的通信与传统的 HTTP、TCP 所不同。传统的 HTTP 请求—响应协议是无法实现实时通信的&#xff0c;也就是说&#xff0c;只能由客户端向服务端发送请求…

英语中主语从句的概念及其用法,例句(不断更新)

主语从句的原理 主语从句是一种充当整个句子主语的从句&#xff0c;主语从句构成的句子&#xff0c;是要以引导词开头的。它可以用名词性从属连词、关系代词或关系副词引导。主语从句通常位于谓语动词之前&#xff0c;用于表示动作、状态或事件的主体。 以下是一些常用的引导主…

MiniGPT-4,开源了!

上个月GPT-4发布时&#xff0c;我曾写过一篇文章分享过有关GPT-4的几个关键信息。 当时的分享就提到了GPT-4的一个重要特性&#xff0c;那就是多模态能力。 比如发布会上演示的&#xff0c;输入一幅图&#xff08;手套掉下去会怎么样&#xff1f;&#xff09;。 GPT-4可以理解…

推荐几个可以免费使用的ChatGPT工具

在ChatGPT相关API推出之后&#xff0c;各种工具如雨后春笋一般层出不穷&#xff0c;这篇文章就列举一些日常使用到的工具。 工具列表 OpenAI 在线读取任意网页内容包括视频&#xff08;YouTube&#xff09;&#xff0c;并根据这些内容回答你提出的相关问题或总结相关内容支持…

Mysql-视图

视图 视图介绍视图的语法视图的检查选项CASCADEDLOCAL 视图的更新视图的作用 视图介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的…

【配电网优化】基于串行和并行ADMM算法的配电网优化研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023年值得关注的20大网络安全趋势

随着围绕所有企业的数字革命&#xff0c;无论大小&#xff0c;企业、组织甚至政府都依赖计算机化系统来管理他们的日常活动&#xff0c;从而使网络安全成为保护数据免受各种在线攻击或任何未经授权访问的主要目标。 随着数据泄露、勒索软件和黑客攻击的新闻成为常态&#xff0…

java获取文件夹下所有文件名

在进行 Java编程的过程中&#xff0c;我们会经常使用到文件夹下的所有文件名。有时候可能不太熟悉 Java编程的小伙伴们会发现&#xff0c;在代码中没有获取到所有的文件名&#xff0c;那么这个时候我们应该怎么去获取到这些文件呢&#xff1f;在进行 Java编程的过程中&#xff…

深度学习卷积神经网络学习小结

————————————————————————————————————————————— 学习小结&#xff1a; 1&#xff09;深度学习综述&#xff1b;&#xff08;2&#xff09;对卷积神经网络&#xff08;CNN&#xff09;的认识&#xff1b;&#xff08;3&#xff0…

08 Kubernetes应用配置管理

课件 在 Kubernetes 中&#xff0c;secret 是一种用于存储敏感信息的对象。Kubernetes 支持以下三种类型的 secret&#xff1a; Opaque&#xff1a;这是默认的 secret 类型&#xff0c;可以用于存储任何类型的数据&#xff0c;包括字符串、二进制数据等。 Service Account&…