当前位置: 首页 > article >正文

JAVA Web_定义Servlet2_学生登录验证Servlet

题目

 页面StudentLogin.html中有一HTML的表单代码如下:

<form action="studentLogin" method="post">学生姓名:<input type="text" name="stuName" value=""><br>登录密码:<input type="password" name="stuPwd" value=""><br><input type="submit" name= "" value="登录">
</form>

现按下面的要求定义一个Servlet:
1)定义一个Servlet,将StudentLogin.html的表单数据提交到这个Servlet,根据StudentLogin页面表单中的设置来配置本Servlet的访问路径,要求采用注解方式配置访问路径;
2)本Servlet中获取StudentLogin.html表单提交的学生姓名、登录密码,若姓名为“赵钱孙”,且密码为“123456”,则将该学生姓名添加为request对象以实现数据流转,再将请求内部派发home.jsp;反之则显示“登录失败,3秒钟后请重新登录”,并在3秒后自动跳转StudentLogin.html页面;
3)设置输出Servlet的响应数据类型为html。

注释:
1)设置request作用域:
request.setAttribute(String,Object);
2)页面请求内部派发:
request.getRequestDispatcher(url).forward(request,response);
3)3秒后页面自动跳转
response.setHeader("Refresh","3;URL=路径");
注意:只用编写Servlet文件,不用编写jsp和html文件。


本章知识重点: 

目录

HTML里的表单元素

解读表单代码:###

1.定义Servlet:

 1.2 方便验证——创建一个html文件 ##

 1.3 编写Servlet_注解方式配置Servlet路径 

2. doPost方法重写(重载)#####

2.1 分析题意: #####

2.2 设置request作用域:###

请求作用域是何物

2.3 将请求内部派发:

 2.4 3秒后页面自动跳转

完整代码参考 :

前文链接:JAVAWeb_Servlet初识与代码入门-CSDN博客

JAVAWeb_Servlet初识与代码入门-CSDN博客

我们本节重中之重,便是学会处理POST请求。但是先来看“题目”一上来,给了我们一段代码——“StudentLogin.html中有一HTML的表单代码”。这段代码是什么,对于我们处理的POST请求有什么关系?

HTML里的表单元素

<form ......>......
</form>

<form>一出现,而</form>一结尾(体现标签成对出现的特点),就表示两个标签中间的代码是表单代码。

表单代码一般放在HTML文件里。因为:HTML是一种用于构建网页的标记语言,它包含多种元素,用于定义网页的结构、内容和布局。表单只是HTML中众多元素之一,用于收集用户输入的数据并提交到服务器。

表单代码收集用户数据?这就很妙了,请求正是要收集(服务器所需的)用户数据:GET请求里我们通过URL的查询字符串的方法收集用户数据;POST请求里我们就用表单收集用户数据。

解读表单代码:

接下来,我们通过解读这段表单代码来了解表单代码怎么收集用户信息。

<form action="studentLogin" method="post">...
</form>

 <form> 标签成对出现。所以一头为<form>,末尾</form>。

我们再着重看第一行:

<form action="studentLogin" method="post">
// 在写form代码时,就要规定action和method,这是<form> 标签的属性,它们定义了表单提交时的行为。
// action="studentLogin" ,指定表单数据提交的目标URL ——因为这里的表单数据不是为了收集而收集,而是为了交给服务器处理。服务器怎么处理,自然是交给能处理的POST请求的Servlet。所以这个URL,正是Servlet的URL映射路径,表单收集到的数据都会通过URL,找到并交给能处理这段数据的Servlet。//指定表单数据提交的方式为HTTP POST方法。POST方法通常用于提交敏感数据(如登录信息),因为它不会将数据暴露在URL中。

若读者通过了GET请求那一题,便知道GET请求传数据是直接在URL里传参数的键值对(可谓是光明正大,密码都是通过明文并且不加修饰直接交给Servlet。客户敢用,我们都不敢这么写)。 

现在来看:<form>标签里的代码,为了更好理解,我们结合运行.html文件出的表单。

学生姓名:<input type="text" name="stuName" value=""><br>
登录密码:<input type="password" name="stuPwd" value=""><br><input type="submit" name= "" value="登录">

 先来直观理解<form>生成的表单内容:

 可以看到:

①:“学生姓名:”就直接显示,后面"<input ......>"对应了网页里生成的输入框。

②:“登录密码:”也直接显示,后面"<input ......>"对应了网页里生成的输入框。

③:因为只有<input......>它其实也是输入框,不过它已经被赋值了“登录”。所以这个框直接显示“登录”。

 这里大家会注意新的标签<input>:介绍如下

<input type="text" name="username" value="default value"><br>
//<input>也有三个关键属性:在定义时会让我们初始化
// 1. type 属性定义了输入字段的类型。text:普通文本输入框,用户可以输入任意文本。
// 2. name 属性为输入字段指定一个名称,这个名称在表单提交时用于标识该输入字段(说人话,就是该输入框的名称&&参数的键值对中的“键”)
// 3. value 属性定义了输入字段的默认值或当前值。(说人话,就是输入框里的数据 && 参数键值对中的“值”)// <br>是换行

那么此处这三句代码就好理解了:

学生姓名:<input type="text" name="stuName" value=""><br>
// 学生姓名:直接打印输出在页面
// <input> 为HTML输入元素,用于创建一个输入框
// type="text" 表示为一个文本输入框,用户可以在其中输入任意文本。
// name="stuName" 为输入框指定一个名称,服务器端可以通过这个名称来获取对应的值
// value="" 指定输入框的默认值。这里默认值为空,表示用户需要手动输入学生姓名。
登录密码:<input type="password" name="stuPwd" value=""><br>
// 这是一个密码输入框,类型(type)为"password"。其特点:输入时会以隐藏形式显示(通常显示为圆点或星号),以保护用户输入的敏感信息。
// 输入框名称为stuPwd (键值对中的键)
// 默认输入值为空,等待学生输入密码 (键值对中的值)
<input type="submit" name= "" value="登录">
//这个输入框,前面就不显示什么文本信息了。
//类型为"submit",name=""为按钮指定一个名称。这里名称为空,表示该按钮没有特定的名称。
// 但这个按钮(输入框)默认值为“登录”,于是在网页上就会在这个按钮上浮现这个值
// submit类型的输入框:用户点击后触发表单提交操作。

也就是说,提交的表单包含了两个参数对(学生姓名 和登录密码 与其对应的值们) 当点击submit类型的按钮,就会提交表单。表单会提交到我们编写的servlet里(因为收集用户端数据,就是为了交给服务器端处理)。为了处理这种以表单形式收集数据的请求,我们将这种请求称为POST请求,于是Servlet编写的处理请求的方法—— 正是doPost(一种专门处理POST请求)方法

1.定义Servlet:

接下来,我们开始写代码。

首先得创建JAVA Web项目,作者这里就创建好了:

 

接着需要新建一个Servlet文件:

 

Servlet名字也没规定,作者自定义了。

 Eclipse生成的代码,我删了些(锻炼代码能力嘛)

 1.2 方便验证——创建一个html文件

如标题所示,就是为了方便验证。接下来展示怎么创建一个html文件。

 

自动生成的HTML File具有以下代码:

 

这里我们需要编写的HTML代码是一段表单,因为题上已经给出,我们直接copy上去(呵呵)

 (忽略.html的名字,就按照题意取名,作者是后面发现不对劲的 T_T)

1.3 编写Servlet_注解方式配置Servlet路径

使用注解方式配置Servlet,我们都会采用@WebServlet(),这是前面提过的以及Servlet的代码开头、整体框架,我就直接开头喽~

@WebServlet("/")
public class stuLoginservlet extends HttpServlet
{// 继承HttpServlet,是为了什么?为了保证自己写的Servlet在语法上实现Servlet所有方法;语法上实现,意味着我们开发者不需要写那些代码// 而又可以继承HttpServlet提供的doGet和doPost方法,根据我们的需要进行改写
}

类名须于.java文件名一致。 

我们现在来思考:用户可以通过哪个URL访问到我们的Servlet,这也是@WebServlet注释的作用。

再看一眼题意:

根据我们前面“表单代码” 以及这里不断明示,为Servlet配置的路径,正是表单要提交的URL("studentLogin"),而表单提交的方式"method = "post"",也意味着这份表单要交给能处理post请求的servlet。

@WebServlet("/studentLogin")//表单根据action的值找到g该值映射的这个servlet
public class stuLoginservlet extends HttpServlet
{//为了处理post请求,我们得改写doPost方法protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{}
}

2. doPost方法重写(重载)

2.1 分析题意: 

在分析题意中,我们会把整体代码逻辑和能写的代码完成~

本Servlet获取StudentLogin.html表单提交的学生姓名、登录密码

很明显,我们需要先获取参数,没问题—— request.getParameter(); 

String name = request.getParameter("stuName");//传进去的参数,一定是参数对的键。因为要获取用户输入的值:这里获取的是stuName的值
String pwd = request.getParameter("stuPwd");//这里pwd获取的是:用户对应stuPwd这个输入框的值

“若则”关系,那么需要使用if-else :

//获取参数的值
String name = request.getParameter("stuName");
String pwd = request.getParameter("stuPwd");
//若则关系
if()
{}
else
{}
//若姓名为"赵钱孙",密码为"123456"
if("赵钱孙".equals(name) && "123456".equals(pwd))
//String.equals(String) 判断两个字符串是否相等,第一个String不能为null否则会抛出异常

接下来写伪代码: 

//获取参数的值
String name = request.getParameter("stuName");
String pwd = request.getParameter("stuPwd");
//若则关系
if("赵钱孙".equals(name) && "123456".equals(pwd))
{//将该学生姓名添加为request对象以实现数据流转,再将请求内部派发home.jsp
}
else
{//反之则显示“登录失败,3秒钟后请重新登录”,并在3秒后自动跳转StudentLogin.html页面;
}

在浏览器上显示页面信息?这我们学过啊,直接写:

//在浏览器上显示信息//1.获取响应输出流
PrintWriter out = response.getWriter();
//2.输出信息
out.println("登录失败,3秒钟后请重新登录");
//获取参数的值
String name = request.getParameter("stuName");
String pwd = request.getParameter("stuPwd");
//若则关系
if("赵钱孙".equal(name) && "123456".equal(pwd))
{//将该学生姓名添加为request对象以实现数据流转,再将请求内部派发home.jsp
}
else
{//反之则显示“登录失败,3秒钟后请重新登录”,并在3秒后自动跳转StudentLogin.html页面;PrintWriter out = response.getWriter();out.println("登录失败,3秒钟后请重新登录");
}

其他的“内部派发”,"自动跳转",我们还没学,但是代码逻辑基本完整,后续补充一下就能上手。还有些细节需要处理:

3)设置输出Servlet的响应数据类型为html。

//这也是我们学习过的—— response.setContentType();
response.setContentType("text/html;charset=UTF-8");

 现在来综合我们写的代码,来发现还有哪些还没解决:

@WebServlet("/studentLogin")
public class stuLoginservlet extends HttpServlet
{protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{//以后都要习惯,只要涉及到中文;不管题上是否让响应输出html格式,都得第一步设置响应的编码格式// 1.设置编码response.setContentType("text/html;charset=UTF-8");// 2. 获取请求参数的值String name = request.getParameter("stuName");String pwd = request.getParameter("stuPwd");// 3. 判断请求参数值if("赵钱孙".equals(name) && "123456".equals(pwd)){//将该学生姓名添加为request对象以实现数据流转,再将请求内部派发home.jsp}else{//反之则显示“登录失败,3秒钟后请重新登录”,并在3秒后自动跳转StudentLogin.html页面;PrintWriter out = response.getWriter();out.println("登录失败,3秒钟后请重新登录");}}
}

还没解决的问题:

1. 对于请求体的编码,服务器并没设置编码—— 如果请求体参数的值为中文,服务器默认的编码是不支持识别中文。

2.  将该学生姓名添加为request对象以实现数据流转,再将请求内部派发home.jsp

3.  在3秒后自动跳转StudentLogin.html页面;

对于第1点,我们只需熟悉(掌握)这句话:

request.setCharacterEncoding("UTF-8");
//处理表单数据,一定要设置请求体的编码,确保服务器能正确解析传来的字符(中文)

所以处理Post请求,一定二话不说,方法体的第一步是两个编码:

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8"); 

 还剩最后两点:

出题人也是很善良体贴了,都贴上了相应的方法,所以这篇作者会重点讨论第一个方法,后面两个方法直接考虑怎么用就完了(锻炼我们现学现卖的技能):

2.2 设置request作用域:

方法介绍(参考官方文档格式)

public void request.setAttribute(String name,Object obj);

request.setAttribute(String name,Object obj);

方法描述

将一个对象obj与指定的名称name绑定到当前请求的作用域中。此方法允许将数据存储HttpServletRequest对象(此处为doPost里的request)中,以便在同一个请求的后续处理过程中访问这些数据。例如,可以将数据传递给后续的Servlet或JSP页面。(此处题意为传给home.jsp)

参数

name:要绑定到请求作用域的属性名称。该名称必须是String类型,且不能为null。

o:要绑定到请求作用域的属性值。该值可以是任何Object类型,包括null

异常

IllegalArgumentException:如果namenull

注意:

· 作用域限制:

使用setAttribute方法设置的属性仅在当前请求的作用域中有效。一旦请求结束,这些属性将不再可用。

· 覆盖属性

如果已经存在一个与指定名称相同的属性,调用setAttribute方法将覆盖原来的属性值

请求作用域是何物

请求作用域 是Web应用程序中的一种数据存储范围,它与单个HTTP请求相关联。好理解,这个作用域就是存数据的。

为什么需要请求作用域。(即它的作用):刚刚介绍的设置request的作用域方法,结合此处所说的请求作用域。就知道设置request的作用域实际上就是把一对参数(它的名称和值)存进请求作用域。从题意上,我们其实能窥见请求作用域的作用——将数据传递给后续的Servlet或JSP页面

(作者觉得这出题人这里描述得有问题,更恰当地——“将学生姓名添加到request对象”) 

更加完整的作用:

数据共享——在处理一个HTTP请求时,可能需要在多个组件(如Servlet、JSP页面)之间共享数据。请求作用域提供了一个方便的地方来存储这些数据,使得它们可以在请求的生命周期内被访问。(重点

简化数据传递——通过将数据存储在请求作用域中,可以避免在组件之间手动传递数据。例如,从Servlet到JSP页面,或者从一个Servlet到另一个Servlet。

于是,结合分析,代码如下:

request.setAttribute("StuName",name);//设为request作用域的对象之一,又是一个键值对啊盆油:键作者自己取了,值为我们获取到的参数值name
@WebServlet("/studentLogin")
public class stuLoginservlet extends HttpServlet
{protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{// 1.设置编码request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");// 2. 获取请求参数的值String name = request.getParameter("stuName");String pwd = request.getParameter("stuPwd");// 3. 判断请求参数值if("赵钱孙".equal(name) && "123456".equal(pwd)){//将该学生姓名添加为request对象以实现数据流转request.setAttribute("StuName",name);//再将请求内部派发home.jsp}else{//反之则显示“登录失败,3秒钟后请重新登录”,并在3秒后自动跳转StudentLogin.html页面;PrintWriter out = response.getWriter();out.println("登录失败,3秒钟后请重新登录");}}
}

2.3 将请求内部派发:

 2)页面请求内部派发:
request.getRequestDispatcher(url).forward(request,response);

很明显,若想实现“再将请求内部派发home.jsp”,我们只要把这句代码copy上去,把参数正确填写就能实现:

request.getRequestDispatcher("/home.jsp").forward(request,response);
// url 是一个字符串,表示目标资源的路径。推荐加“/”,绝对路径写法
//后面的request,response不用改变,我们当前servlet的request,response就是这个名字

 2.4 3秒后页面自动跳转

3)3秒后页面自动跳转
response.setHeader("Refresh","3;URL=路径");

题目要求:3s后页面自动跳转到 StudentLogin.html 页面。只需要替换url的值就行(👌)

response.setHeader("Refresh","3;URL=StudentLogin.html");

我们所有代码都已经完成:

@WebServlet("/studentLogin")
public class stuLoginservlet extends HttpServlet
{protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{// 1.设置编码request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");// 2. 获取请求参数的值String name = request.getParameter("stuName");String pwd = request.getParameter("stuPwd");// 3. 判断请求参数值if("赵钱孙".equals(name) && "123456".equals(pwd)){//将该学生姓名添加为request对象以实现数据流转request.setAttribute("StuName",name);//再将请求内部派发home.jsprequest.getRequestDispatcher("/home.jsp").forward(request,response);}else{//反之则显示“登录失败,3秒钟后请重新登录”,并在3秒后自动跳转StudentLogin.html页面;PrintWriter out = response.getWriter();out.println("登录失败,3秒钟后请重新登录");response.setHeader("Refresh","3;URL=StudentLogin.html");}}
}

验证:

显示:

 

重新跳转: 

另一种情况: 

没事儿,现在保证自己写的代码逻辑写对就行。我们本来也没写home.jsp ,后面我们揭晓jsp。

完整代码参考 :

@WebServlet("/studentLogin")
public class stuLoginservlet extends HttpServlet
{protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{// 1.设置编码request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");// 2. 获取请求参数的值String name = request.getParameter("stuName");String pwd = request.getParameter("stuPwd");// 3. 判断请求参数值if("赵钱孙".equals(name) && "123456".equals(pwd)){//将该学生姓名添加为request对象以实现数据流转request.setAttribute("StuName",name);//再将请求内部派发home.jsprequest.getRequestDispatcher("/home.jsp").forward(request,response);}else{//反之则显示“登录失败,3秒钟后请重新登录”,并在3秒后自动跳转StudentLogin.html页面;PrintWriter out = response.getWriter();out.println("登录失败,3秒钟后请重新登录");response.setHeader("Refresh","3;URL=StudentLogin.html");}}
}

经过这两篇文章的铺垫,对于定义基本Servlet我们至少不会再手足无措——多敲多敲,希望读者(包括作者)能在定义Servlet时得心应手(放心,后面还有练习,作者补充知识的篇幅就不这么大了)。

 前文链接:JAVAWeb_Servlet初识与代码入门-CSDN博客

JAVAWeb_Servlet初识与代码入门-CSDN博客


作者有话说:(我真没想到能破万(扶额邪魅一笑),嘶~为了咱的读者后期好查阅,我会将一些篇幅大的重要部分单拎出来(点头))
不过能看到这里的读者,作者也要为你点赞👍

相关文章:

JAVA Web_定义Servlet2_学生登录验证Servlet

题目 页面StudentLogin.html中有一HTML的表单代码如下&#xff1a; <form action"studentLogin" method"post">学生姓名&#xff1a;<input type"text" name"stuName" value""><br>登录密码&#xff1a;…...

深入理解设计模式之模板方法模式 1d87ab8b42e98069b6c2c5a3d2710f9a

深入理解设计模式之模板方法模式 深入理解设计模式之模板方法模式 在软件开发的漫长征程中&#xff0c;我们常常会遇到各种复杂的业务逻辑&#xff0c;其中部分逻辑具有相似的流程框架&#xff0c;但在具体细节上又有所不同。这种情况下&#xff0c;模板方法模式就如同一位得…...

Unity入门笔记(缘更)

内容来源SiKi学院的Luna’s Fantasy 文章目录 一、基础知识1.准备2.基础知识1.层级(Layer)2.轴心点3.预制体(Prefab)4.刚体组件(Rigidbody)5.碰撞器组件(BoxCollider) 二、代码1.移动 一、基础知识 1.准备 Unity安装&#xff1a; https://unity.cn 2.基础知识 1.层级(Layer…...

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏&#xff0c;凑近一看…...

Java 本地缓存的实现:常见的四种方式

在 Java 中&#xff0c;常用的本地缓存实现主要有以下几种&#xff0c;以下是它们的代码示例及适用场景&#xff1a; 一、‌使用 ConcurrentHashMap 实现简单缓存‌ 适合轻量级、无需复杂淘汰策略的场景。 import java.util.concurrent.ConcurrentHashMap;public class Simp…...

记录一次生产中mysql主备延迟问题处理

登录库&#xff1a; mysql -uXXXX -pXXXX -P3306 -hXXXXXX -A 备库上执行&#xff1a;show slave status\G 查看 seconds_Behind_Master&#xff0c;延迟 2705s&#xff0c;而且还一直在增加。 SHOW CREATE TABLE proc_i_income_temp; -- 查看表的结构 show index from proc…...

路由器原理与配置技术详解

一、路由基础原理 1.1 路由器的核心功能 网络层设备&#xff1a;工作在OSI参考模型第三层&#xff0c;实现不同网络间的互联互通智能路径选择&#xff1a;基于路由表为数据包选择最优传输路径协议转换&#xff1a;处理不同网络接口间的协议差异&#xff08;如以太网与PPP&…...

第五节:React Hooks进阶篇-如何用useMemo/useCallback优化性能

反模式&#xff1a;滥用导致的内存开销React 19编译器自动Memoization原理 React Hooks 性能优化进阶&#xff1a;从手动到自动 Memoization &#xff08;基于 React 18 及以下版本&#xff0c;结合 React 19 新特性分析&#xff09; 一、useMemo/useCallback 的正确使用场景…...

STL迭代器:C++泛型编程的核心工具 [特殊字符]

在C中&#xff0c;STL&#xff08;标准模板库&#xff09;的迭代器是泛型编程的核心&#xff0c;它不仅解决了指针的局限性&#xff0c;还为算法与容器之间提供了抽象的访问接口。接下来&#xff0c;我们将探讨迭代器的核心作用、与指针的关键区别以及其设计哲学。 一、迭代器的…...

ffmpeg无损转格式的命令行

将ffmpeg.exe拖入命令行窗口 c:\users\zhangsan>D:\ffmpeg-2025-03-11\bin\ffmpeg.exe -i happy.mp4 -c:v copy -c:a copy 格式转换后.mkv -c:v copy 仅做拷贝视频,不重新编码 -c:a copy 仅做拷贝音频 ,不重新编码...

Monorepo 是什么?前端项目的多模块管理终极方案

前言 你是否曾经维护过多个前端项目?是否在多个项目之间来回复制粘贴组件,工具函数?是否经常被"组件更新没同步","构建时间太长","依赖版本冲突"等问题困扰? 这些问题都指向一个关键点: 项目结构和管理方式 今天,我来聊聊一种非常火但又容…...

对象池模式在uniapp鸿蒙APP中的深度应用

文章目录 对象池模式在uniapp鸿蒙APP中的深度应用指南一、对象池模式核心概念1.1 什么是对象池模式&#xff1f;1.2 为什么在鸿蒙APP中需要对象池&#xff1f;1.3 性能对比数据 二、uniapp中的对象池完整实现2.1 基础对象池实现2.1.1 核心代码结构2.1.2 在Vue组件中的应用 2.2 …...

条款05:了解C++默默编写并调用哪些函数

目录 1.默认生成的函数 2.无法生成的情况 2.1当成员函数有引用 或者 被const修饰 2.2.operator在基类被私有 1.默认生成的函数 class empty {};//相当于class empty { public:empty(){ ... } // 构造函数empty(const empty& rhs) { ... }// 拷贝构造~empty(){ ... } //…...

PythonFlask打造高效流式接口的实战

一、环境搭建与项目初始化 要使用 Flask 提供流式接口,首先得确保开发环境正确配置。在 Ubuntu 系统上,可借助 apt 包管理器便捷安装 Python 和 pip: sudo apt update sudo apt install python3 python3-pip对于 Windows 用户,推荐从官网下载安装包进行安装。安装完成后,…...

强化学习算法系列(五):最主流的算法框架——Actor-Critic算法框架

强化学习算法 &#xff08;一&#xff09;动态规划方法——策略迭代算法(PI)和值迭代算法(VI) &#xff08;二&#xff09;Model-Free类方法——蒙特卡洛算法(MC)和时序差分算法(TD) &#xff08;三&#xff09;基于动作值的算法——Sarsa算法与Q-Learning算法 &#xff08;四…...

设计模式(结构型)-桥接模式

目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域&#xff0c;随着系统规模和复杂性的不断攀升&#xff0c;如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…...

【MySQL】MySQL数据库 —— 简单认识

目录 1. 数据库的介绍 1.1 什么是数据库 1.2 数据库和数据结构之间关系 2. 数据库分类 2.1 关系型数据库&#xff08;RDBMS&#xff09; 2.2 非关系型数据库 2.3 区别 一些行内名词简单解释&#xff1a; 3. 关于mysql 主要学什么 4. MySQL中重要的概念 4.1 概念 4…...

RNN - 语言模型

语言模型 给定文本序列 x 1 , … , x T x_1, \ldots, x_T x1​,…,xT​&#xff0c;语言模型的目标是估计联合概率 p ( x 1 , … , x T ) p(x_1, \ldots, x_T) p(x1​,…,xT​)它的应用包括 做预训练模型&#xff08;eg BERT&#xff0c;GPT-3&#xff09;生成本文&#xff…...

过拟合、归一化、正则化、鞍点

过拟合 过拟合的本质原因往往是因为模型具备方差很大的权重参数。 定义一个有4个特征的输入&#xff0c;特征向量为,定义一个模型&#xff0c;其只有4个参数&#xff0c;表示为。当模型过拟合时&#xff0c;这四个权重参数的方差会很大&#xff0c;可以假设为。当经过这个模型后…...

【python画图】:从入门到精通绘制完美柱状图

目录 Python数据可视化&#xff1a;从入门到精通绘制完美柱状图一、基础篇&#xff1a;快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇&#xff1a;专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …...

基础知识:离线安装docker、docker compose

(1)离线安装docker 确认版本:Ubuntu 18.04 LTS - bionic 确认架构:X86_64 lsb_release -a uname -a 官方指南:https://docs.docker.com/engine/install/ 选择Ubuntu,发现页面上最低是Ubuntu20.04, 不要紧...

畅游Diffusion数字人(27):解读字节跳动提出主题定制视频生成技术Phantom

畅游Diffusion数字人(0):专栏文章导航 前言:主题定制视频生成,特别是zero-shot主题定制视频生成,一直是当前领域的一个难点,之前的方法效果很差。字节跳动提出了一个技术主题定制视频生成技术Phantom,效果相比于之前的技术进步非常显著。这篇博客详细解读一下这一工作。 …...

《Adaptive Layer-skipping in Pre-trained LLMs》- 论文笔记

作者&#xff1a;Xuan Luo, Weizhi Wang, Xifeng Yan Department of Computer Science, UC Santa Barbara xuan_luoucsb.edu, weizhiwangucsb.edu, xyancs.ucsb.edu 1. 引言与动机 1.1 背景 LLM 的成功与挑战: 大型语言模型 (LLMs) 在翻译、代码生成、推理等任务上取得巨大成…...

阅读分析Linux0.11 /boot/head.s

目录 初始化IDT、IDTR和GDT、GDTR检查协处理器并设置CR0寄存器初始化页表和CR3寄存器&#xff0c;开启分页 初始化IDT、IDTR和GDT、GDTR startup_32:movl $0x10,%eaxmov %ax,%dsmov %ax,%esmov %ax,%fsmov %ax,%gslss _stack_start,%espcall setup_idtcall setup_gdtmovl $0x1…...

android11 DevicePolicyManager浅析

目录 &#x1f4d8; 简单定义 &#x1f4d8;应用启用设备管理者 &#x1f4c2; 文件位置 &#x1f9e0; DevicePolicyManager 功能分类举例 &#x1f6e1;️ 1. 安全策略控制 &#x1f4f7; 2. 控制硬件功能 &#x1f9f0; 3. 应用管理 &#x1f512; 4. 用户管理 &am…...

《前端性能优化秘籍:打造极致用户体验》

在当下&#xff0c;网站和应用的性能表现直接关乎用户去留。快速加载、流畅交互的页面能让用户沉浸其中&#xff0c;反之&#xff0c;缓慢的响应速度则会让他们毫不犹豫地离开。对于前端开发者而言&#xff0c;性能优化不仅是技术追求&#xff0c;更是提升用户体验、增强产品竞…...

微信小程序实现table样式,自带合并行合并列

微信小程序在代码编写过程好像不支持原生table的使用&#xff0c;在开发过程中偶尔又得需要拿table来展示。 1.table效果展示 1.wxml <view class"table-container"><view class"table"><view class"table-row"><view cla…...

学习笔记十二——Rust 高阶函数彻底入门(超详细过程解析 + 每步数值追踪)

&#x1f4a1; 彻底搞懂 Rust 高阶函数&#xff01;新手最容易卡住的语法 调用流程全讲透&#xff08;含逐步拆解&#xff09; Rust 函数式编程中有一个常见却经常让人懵的概念&#xff1a;高阶函数&#xff08;Higher-Order Function&#xff09; 一看到 fn(i32) -> i32、…...

电脑的品牌和配置

我的笔记本是2020年买的&#xff0c;之前的订单找不到了&#xff0c;就知道是联想&#xff0c;不清楚具体的配置。 本文来源&#xff1a;腾讯元宝 检查系统信息&#xff08;Windows&#xff09; 这通常是 ​​联想&#xff08;Lenovo&#xff09;​​ 的型号代码。 81XV 是联想…...

Redis面试——常用命令

一、String &#xff08;1&#xff09;设置值相关命令 1.1.1 SET 功能&#xff1a;设置一个键值对&#xff0c;如果键已存在则覆盖旧值语法&#xff1a; SET key value [EX seconds] [PX milliseconds] [NX|XX]EX seconds&#xff1a;设置键的过期时间为 seconds 秒 PX milli…...