Servlet
Servlet 核心知识
什么是Web开发
Web通信,指的是两台计算机通过网络来进行资源文件共享的活动
Web开发确保本次通信顺利执行
Web通信过程中两台计算机之间角色
- 客户端计算机:用于发送请求
- 服务端计算机:提供共享资源文件
资源文件
- 理论上来说,计算机上所有的文件都是资源共享文件
- 分类:
1)静态资源文件:
【定义】:文件内容是固定的,不能随着请求变化而发生变化
【例子】:图片、html、doc、xls
【特点】:服务端计算机直接将【静态资源文件】推送给【客户端计算机】,所有被共享的【静态资源文件】最终是在客户端计算机运行
2)动态资源文件:
【定义】:文件内容可以根据用户提供需求变化而产生不同变化内容
【例子】:Java文件(不定义了,不好定义~)
【特点】:服务端计算机会调用执行【动态资源文件】。服务端计算机将【动态资源文件】的运行结果交给客户端计算机。
Web通信过程中,两台计算机如何进行通信
- C/S结构通信方式:
C:client,客户端计算机安装特定【客户端程序】。可以帮助客户端计算机向指定的服务端计算机发送请求。
S:server,在服务端计算机安装一种特定【资源调度软件】,接受特定客户端程序程序发送请求,将请求需要资源文件推送回客户端计算机上【客户端程序】。
【例子】:微信,QQ,所有大型网络游戏
【优缺点】:
优点:1、可以有效的保护服务端计算机。2、可以分摊服务端计算机工作压力。
缺点:1、增加客户获得服务的成本。2、增加服务端维护成本
【针对客户群体】:个人用户 - B/S结构通信方式:
B:browser:可以帮助客户端计算机向任意的服务端发送请求
S:server:在服务端计算机安装一种特定【资源调度软件】,可以接收所有浏览器所发送的请求。将请求的资源文件推送客户端计算机浏览器上
【优缺点】:
优点:1、不会增加客户获得服务的成本。2、不会增加服务端维护的成本。
缺点:1、无法有效保护服务端计算机。2、无法通过客户端计算机来分摊服务端计算机的压力
【针对的客户群体】:企业用户
网络协议(包)
- 【定义】:用于包裹在网络中传输的【二进制数据】。网络协议包存在【固定空间】用于存放【特定数据】,便于接收方分析得到数据
- 【分类】:FTP网络协议 HTTP协议 file协议
- 【B/S通信方式中】:到目前为止B/S通信结构中,只使用HTTP网络协议包
HTTP网络协议包内部结构
- HTTP请求协议包:
1)是浏览器在发送请求是负责创建的
2)是浏览器负责将请求信息,写入到请求协议包
3)HTTP请求协议包内部自上而下有四层结构:
【请求行】{
url:请求的资源文件地址
method:浏览器采用的请求方式
}
【请求头】{
浏览器希望获得资源文件类型【html/png】
浏览器希望获得资源文件内容依赖字符集
如果浏览器采用【get方式发送请求】,本次所关联的请求参数需要保存在请求头中
}
【空白行】{隔离作用}
【请求体】{
如果浏览器采用【POST方式发送请求】,本次关联请求参数需要保存在请求体
} - 响应协议包:
1)在服务端计算机的【资源调度软件】准备推送文件时,负责创建的
2)【相应协议包内容】可以由【资源调度软件】写入,也可以由Java命令(Response)写入
3)HTTP请求协议包内部自上而下有四层结构:
【状态行】{
状态码(200/404/405/500等等)
}
【响应头】{
返回文件内容类型(doc,text,htom,text/html)
返回文件内容所依赖的字符集,浏览器需要使用这个字符集对接收的内容进行解码
}
【空白行】{隔离作用}
【响应体】{
静态资源文件也可能是动态资源文件的运行结果(二进制形式)
}
客户端计算机上浏览器管理
如何命令浏览器向指定网站发送请求
- 通过form表单命令
- 通过超链接命令< a href=“http://www.baidu.com” >点击这里< /a >
- 浏览器的地址栏对象 window.location=“http://sina.com”
请求方式【POST/GET】
- GET方式:
1)要求浏览器发送请求时,携带的请求参数数量不能超过4K
2)要求浏览器将请求参数写入到【请求头】
3)要求浏览器将请求参数信息在地址栏上显示出来
4)要求浏览器对接收的资源文件必须缓存到内存中
【静态资源推荐用GET】 - POST方式:
1)不会限制浏览器发送请求时,携带请求参数数量
2)要求浏览器将请求参数写入到【请求体】
3)要求浏览器将请求参数信息在地址栏隐藏
4)要求浏览器对所接收的文件不能保存到缓存中
【动态变化内容推荐用POST】 - 如何控制浏览器采用的请求方式
1)让浏览器发送请求时,采用【GET方式】
1、超链接标签命令,一定会要求浏览器采用【GET方式】
2、location对象,一定会要求浏览器采用【GET方式】
3、FROM标签命令中的method属性,可以控制浏览器采用【GET方式】发送请求
<form action="www.baidu.com" method="GET">
<input type="submit" value="提交">
</form>
2)让浏览器发送请求时,采用【POST方式】
<form action="www.baidu.com" method="POST">
<input type="submit" value="提交">
</form>
如何命令浏览器在发送请求时,携带制定请求参数
- 超链接标签命令,可以命令浏览器携带请求参数
<a href="http://baidu.com?username=mike&age=23"></a>
- location对象可以命令浏览器携带请求参数
window.location="http://baidu.com?username=mike&age=23"
以上两种方式存在弊端,请求参数内容是固定的,无法根据客户具体要求来改变
3.表单域标签可以接受用户输入的内容,作为请求参数内容
1)【表单域标签 】分类:INPUT SELECT TEXTAREA
2)【表单域标签作为请求参数条件】:
第一个条件:表单域标签必须声明在当前form标签内部
第二个条件:表单域标签必须声明【name】属性,这个属性要作为【请求参数名】
第三个条件:针对checkbox和radio,只有被选中的情况下,才能作为请求参数
HTTP服务器
什么是HTTP服务器
- 安装在服务器计算机上一种软件
- 可以解析来自浏览器发送的【请求协议包】
- 调用服务端上的被请求的【资源共享文件】
- 负责生成一个【响应协议包】
- 负责将【文件内容】或者【文件运行结果】写入到【响应体】中
- 负责将【响应协议包】推送给【当前浏览器】
HTTP服务器分类
- 德国SAP:
- IBM:weblogic
- JBOSS:
- Apache:Tomcat
【Tomcat介绍】
- 是一个由Java应用程序编写的资源文件调度器
- 可以调用服务端静态资源文件和【动态资源文件】
- Tomcat负责生成响应协议包,负责将响应协议包推送到浏览器上
- Tomcat属于Apache
Tomcat端口号
1.Tomcat端口号存储位置:Tomcat安装目录下/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
8080处修改
网站
- 全称:网络中的资源站点
- 作用:仓库,存储可以共享【静态资源文件】和【动态资源文件】
- 文件管理:由HTTP服务器来调用内部共享资源文件
- 本质:就是一个文件夹
网站分类
- 静态资源网站:存储都是静态资源文件
- 动态资源网站:存储是静态资源文件和动态资源文件
如何创建一个静态资源网站
- Tomcat安装目录/webapps/创建一个文件夹,这个文件夹就是【网站】
- 在【网站】存入【静态资源文件】
- 启动Tomcat
动态网站结构
- scr:存放Java文件
- web:静态资源文件和配置文件
配置文件:WEB-INF/web.xml
指定Tomcat要管理的网站
run—> Edit Configuration —> tomcat管理通道 —> Deployment —> 添加需要被Tomcat管理的网站
Tomcat安装与配置
百度很多,不写了
Servlet规范
JAVASE与JAVAEE区别
- JAVASE:java开发基本规范
- JAVAEE:java企业级开发规范,指定了JVM管理系统与13类系统之间交流规则,因此JAVAEE规范有13种。JDBC就是JAVAEE规范中一种,用于设置JVM与所有的【关系型数据库管理系统】进行交流规则
Servlet规范
- Servlet是JAVAEE规范中的一种。
- Servlet规范中设置JVM与HTTP服务器之间的交流规则
- 交流规则:
1)定义何种Java类可以被HTTP服务器来调用的(何种JAVA类可以作为动态资源文件)
2)HTTP服务器应该如何管理【动态资源文件】
何种java类可以被Tomcat调用,可以作为网站的动态共享资源文件
- Servlet规范中,认为只有【Servlet接口实现类】有资格作为【动态共享资源文件】
- 【Servlet接口实现类】必须由开发人员负责创建
- 如何开发一个Servlet接口实现类
1)创建一个实现类,需要继承于【HttpServlet】
2)【HttpServlet】存在Tomcat中lib/servlet-api.jar : javax.servlet.http.HttpServlet
3)根据来访的浏览器采用的请求方式,重写对应doGet\doPost方法
4)在/WEB-INF/lib中web.xml 注册Servlet接口实现类,通知Tomcat当前网站存在了一个动态资源文件
Tomcat调用Servlet接口实现类的流程
- 浏览器向服务端发送了一次请求
http://localhost:8080/myWeb/test - Tomcat接收这个请求,首先将请求资源文件作为动态资源文件。到web.xml进行文件定位。如果有就调用,如果没有找到对应的动态资源文件,此时tomcaz认为本次请求的是一个静态资源文件,从web下进行定位。如果还没有此时返回404状态码
- Tomcat到web.xml根据< url-pattern >进行定位< servlet-name >
- < servlet-name >定位 < servlet-class >找到本次请求调用Servlet
- Tomcat根据浏览器采用的请求方式,调用servlet中doGet或者doPost方法
- 在doGet、doPost方法调用完毕后,Tomcat负责将响应包推送给浏览器
Servlet请求路径写法规则:4种
- 具体请求路径:如果浏览器请求的资源文件地址与当前Servlet中《url-pattern》内容完全一致,Tomcat才会调用当前Servlet
<url-pattern>/abc.html</url-pattern>
注意: 具体请求路径,必须以“/”为开头
- 前置条件请求路径:如果浏览器请求的资源文件地址以当前Servlet中《url-pattern》的内容为开头的,Tomcat才会调用当前Servlet
<url-pattern>/abc/*</url-pattern>
注意: 前置条件请求路径,必须以 “/” 为开头, “ * ” 为结尾
- 后置条件请求路径:如果浏览器请求的资源文件地址以当前Servlet中《url-pattern》的内容为结尾的,Tomcat才会调用当前Servlet
<url-pattern>*.do</url-pattern>
注意:后置条件请求路径不能以 “/” 开头,必须以 “ * ” 为开头
- 通配符请求路径:当前Servlet可以接收对当前网站所有的请求
<url-pattern>/*</url-pattern>
注意:通配符请求路径必须是/*
- 请求路径的优先级 :【具体请求路径】>【前置请求路径】>【通配符】>【后置请求路径】
Servlet实例对象的生命周期
- 项目中,所有Servlet的实例对象都是由Tomcat负责创建;开发人员没有权利创建Servlet的实例对象
- 创建的时机:
1)【默认情况】:当第一个用户来访问这个Servlet时,Tomcat负责创建它的实例对象
2)【人工干预】:要求Tomcat在启动的时候创建Servlet的实例对象
3)在Tomcat运行期间,一个Servlet实现类只能被创建一个实例对象
4)在Tomcat关闭时,由Tomcat负责销毁所有的Servlet实例对象
//人工干预情况下如何配置启动时候创建实例对象
<servlet>
<servlet-name>Servlet2</servlet-name>
<servlet-class>com.qwzhao.controller.Servlet2</servlet-class>
<load-on-startup>2</load-on-startup>// 数字需要大于0 的任何整数
</servlet>
Servlet开发时需要使用的物种工具对象
概述
-
HttpServletResponse接口:负责将运行结果写入到响应包中
-
HttpServletRequest接口:负责读取请求包相关信息的
-
ServletContext接口:可以为当前网站中所有的Servlet提供共享数据
-
Cookie:在一次回话过程中,存储浏览器在服务端所产生的私人数据
-
HttpSession接口:在一次回话过程中,存储浏览器在服务端所产生的私人数据
HttpServletResponse接口
- 介绍:
1)一个来自于Servlet规范中接口:由Tomcat负责提供这个接口实现类
2)负责在Servlet运行完毕后,将相关数据写入到响应头和响应体
3)开发人员习惯于将HttpServletResponse接口修饰对象,称为相应对象 - response.setCharacterEncoding()与 response.setContentType()
1)response.setCharacterEncoding(“GBK”);
2)response.setContentType(“text/html”);
HttpServletRequest接口
- 介绍:
1)来自Servlet规范中一个接口,接口实现类由Tomcat负责提供的
2)由HttpServletRequest接口修饰对象,可以帮助开发人员读取请求协议包信息
3)习惯于将HttpServletRequest接口修饰对象称为请求对象 - 作用:
1)读取请求行中的相关信息
String url=request.getRequestURL();
String method=request.getMethod();
2)读取请求头或者请求体中所有的请求参数名
3)读取请求头或者请求体中参数内容
request.getParameter(“paramName”);
request.getParameterValues(“paramName”);返回String数组
请求对象与响应对象生命周期
- 都是由Tomcat负责创建的
- 每当Tomcat收到请求协议包的时候,就会为这个请求协议包去创建请求对象和响应对象
- 一次请求,对应一对请求对象和响应对象
- 在Tomcat调用被请求的Servlet中服务方法(doGet、doPost)时,负责将本次请求对象和响应对象作为参数传入到服务方法
- 在服务方法工作完毕后,Tomcat销毁本次请求相关的request和response
- Tomcat负责将响应包推送到浏览器上
中文请求参数乱码问题
- 原因:跟浏览器采用的请求方式有关
get | post |
---|---|
如果浏览器以【get】方式发送请求,请求参数在请求头存放。在请求协议包到达服务端之后,请求头内容是由Tomcat负责解析。【Tomcat9.0版本】在解析数据时候,默认采用字符集是【utf-8】。所以如果浏览器以get方式发送中文参数,此时在服务端不会出现中文乱码 | 如果浏览器以【post】方式发送请求,请求参数在请求体中存放。在请求协议包到达服务端之后,请求体内容是由请求对象request负责解码的,request对象默认使用【ISO-8859-1】字符集进行解码。所以如果浏览器以post方式发送中文参数,此时在服务端必须会出现中文乱码问题 |
- 解决方案:在request对象解析数据之前,重新设置request对象字符集utf-8即可。
request.setCharacterEncoding(“utf-8”);
ServletContext接口
- 介绍:
1)Servlet规范中一个接口,接口实现类由Tomcat负责提供
2)ServletContext负责为当前工程中所有Servlet提供能共享数据
3)开发人员习惯于将ServletContext接口修饰对象称为【全局作用域对象】 - 生命周期:
1)全局作用于对象在Tomcat启动时,由Tomcat为当前网站来创建的。
2)一个网站中只能有一个全局作用域对象
3)从网站启动开始一直到网站关闭时,由Tomcat负责销毁当前网站的全局作用域对象 - 使用:
1)如何得到当前工程中的全局作用于对象
request.getServletContext();向Tomcat索要当前工程的全局作用域对象 返回ServletContext对象。即:ServletContext application=request.getServletContext(); - 共享数据来源方式一:
在网站启动之前,开发人员可以将网站中绝大多数Servlet需要使用的数据添加到web.xml中
<context-param>
<param-name>名字</param-name>
<param-value>内容</param-value>
</context-param>
在网站启动时:Tomcat首先为当前网站创建一个全局作用域对象。tomcat然后将web.xml配置共享数据添加到全局作用域对向中
在网站运行时,当某一个Servlet需要使用共享数据时,可以从全局作用域对象中索要数据
application.getInitParameter(“名字”);
会取< param-value>内容< /param-value>中的值
此时共享数据只能读取,不能修改
- 共享数据来源方式二:
1)在tomcat运行期间,可以将某一个Servlet所提供的数据保存到全局作用域对象中,供当前网站中其他的Servlet来使用
application.setAttribute(“name”,value);
application.getAttribute(“name”);
由Servlet存入共享数据可以被修改
会话:
- 定义:
一个浏览器与一个服务端的一次完整交流 - 特点:
1)在一次会话过程中,经历多次的请求与响应
2)在一次会话过程中,同一个浏览器往往会访问多个Servlet - 需求:
在一次会话过程中,在浏览器要访问的Servlet之间进行数据共享 - 解决方案:Cookie 和 HttpSession
Cookie
-
介绍:
1)Cookie是Servlet规范提供一个工具类
2)在参与一次会话过程中Servlet之间,进行数据共享
3)Cookie存储在浏览器上,保存本次会话的共享数据 -
工作原理:
1)cookie存放在响应头和请求头中
2)在浏览器访问Servlet时,Servlet负责将当前浏览器所产生的私人数据保存到Cookie中。然后Servlet负责将Cookie推送到当前浏览器上
3)在浏览器再次来访问当前网站其他Servlet时,需要无条件的将服务端之前所推送过来Cookie再推送回去。这样其他Servlet得到Servlet提供的共享数据 -
Cookie使用:
1)如何创建一个Cookie对象来保存共享数据:
Cookie cookie=new Cookie(“key”,“共享数据”);
注意:1、一个Cookie只能有一个键值对。2、cookie对象只能储存String类型共享数据
2)如何将Cookie写入到响应包响应头去
response.addCookie(cookie);
3)如何从请求协议包的请求头中来读取浏览器所返还的Cookie
Cookie array[]=request.getCookies(); -
cookie的生命周期
1)在声明时被创建,默认情况会被保存在浏览器内存中,当浏览器被关闭的时候,就会被Windows系统销毁
2)人工干预销毁:要求将Cookie保存到客户端计算机的硬盘上,同时指定cookie在硬盘上的存活时间。在存货时间范围之内关闭浏览器甚至关闭计算机都不会导致Cookie被销毁。
cookie.setMaxAge(以秒为单位的时间); -
Cookie的缺点
1)一个cookie对象只能存放一个键值对,如果存储的数据较多,需要管理多个Cookie
cookie只能存放String类型数据,无法存放高级类型Java数据,比如List,Map
HttpSession接口
-
介绍:
1)来自于Servlet规范中的接口,接口实现类来自于Tomcat
2)为参与同一个会话的Servlet之间提供共享数据
3)习惯于将HttpSession接口修饰的对象称为会话作用域对象 也可以叫Session对象 -
HttpSession与Cookie的区别:
相同点:为参与同一个会话的Servlet之间提供共享数据
不同点:
1:存储位置:cookie存在客户端的内存或者硬盘上,HttpSession存储在服务端计算机的内存中
2:存储内容:cookie只能存储String,HttpSession可以存储任意类型的数据
3:存储数量:一个Cookie只可以存储一个键值对,一个HttpSession对象可以存储任意个数的键值对 -
使用:
1)在浏览器来访时,Tomcat不会主动为当前浏览器创建对应的Session对象
2)只有浏览器所访问的servlet向tomcat提出要求时,tomcat才会为当前浏览器创建一个HttpSession对象
3)如何在Servlet中为当前的浏览器,申请一个HttpSession对象
1:HttpSession session=request.getSession();
2:HttpSession session=request.getSession(true);
3:HttpSession session=request.getSession(false); -
getSession()与HttpSession getSession(true)与getSession(false)的区别
1)getSession():如果当前浏览器在服务端中已经拥有了一个Session对象,此时Tomcat需要将这个SESSION对象进行返回。如果当前浏览器在服务端中尚未拥有SESSION对象,此时tomcat需要创建一个全新的session对象返回。
2)request.getSession(true) 与request.getSession()完全一致
3)如果当前浏览器在服务端已经有了一个session对象,此时tomcat需要将这个session返回。如果当前浏览器在服务端中尚未拥有session对象,此时则返回一个null。
如果来访的用户身份已经确认合法了,此时可以使用getSession()或者getSession(true),如果来访的用户身份尚未确认,可以使用getSession(false)
-
Tomcat是如何将浏览器与Session对象关联
在Tomcat创建了一个Session对象时,为session对象生成一个唯一编号,然后将这个编号保存到cookie中,推送到当前的浏览器内存中
等到浏览器再次发送请求时,Tomcat就可以通过读取浏览器返回的cookie来判断浏览器在服务端中是否有session对象 -
如何使用HttpSession对象
在本次会话过程中,AServlet需要为本次会话中其他Servlet提供共享数据:session.setAttribute(“key-Name”,共享数据);
在本次会话过程中,BServlet需要得到当前浏览器session的数据:session.getAttribute(“key-Name”);
Servlet开发过程中涉及的两个常用小点
Http状态码
- 介绍:
1)HTTP状态码是由一个三位数字组成的符号
2)Http状态码是由Tomcat负责创建生成
3)HTTP状态码是由Tomcat写入到状态行中
4)Http状态码通知浏览器在接收到响应包之后的行为
HTTP状态码通知浏览器,服务端无法提供本次服务的原因 - 分类介绍:5类
1)1XX:通知浏览器本次返回的资源文件并不完整,需要浏览器继续向服务端发送申请
2)2XX: 通知浏览器服务端将一个完整的文件推送给浏览器 例:200:浏览器与服务端进行了一次完整通信
3)3XX:服务端推送给浏览器的是一个网址,要求浏览器在接收到这个网址后,立刻自动向这个网址发送请求 例 302:request.sendRedirector(“地址”)
4)4XX:通知浏览器,服务端本次未能提供服务的原因,是由于服务端没有对应的资源文件。
例 404:服务端没有对应的资源文件
405:服务端有本次请求对应的Servlet 但是Servlet不负责处理浏览器当前的请求方式(Get、Post)
5)5XX:通知浏览器,服务端本次未能提供服务的原因,呗调用Servlet在运行时抛出了异常
默认欢迎资源文件:
- 定义:
Http服务器在接收到一个默认请求时,返回的资源文件 - 默认请求:
浏览器向某一个网站发送请求时,并没有制定索要的文件的情况 - 默认欢迎文件的配置:
1)手动方式:在Web.xml中进行配置
< welcom-file-list > < welcome-file>index.jsp< /welcome-file>< / welcom-file-list >
2)由Tomcat自行确认
如果Tomcat在当前网站中没有找到welcome-file标签,此时Tomcat会回到自己的config文件夹下面去寻找一个web.xml的文件,在这个web.xml文件中可以寻找到welcome-file-list标签,来获得默认资源文件地址 - 默认欢迎资源文件分类:
1)首选 html文件或者JSP文件
2)也可以是一个Servlet,但是这个Servlet应该是一个查询Servlet,并且在运行时,不需要得到浏览器发送的请求参数的
多个Servlet来处理同一次请求方案
前提:
- 一个Servlet只负责实现一个功能
- 浏览器在一次请求时,只能请求一个资源文件
- 如果浏览器的请求需要由多个Servlet协同完成,需要用户多次通过手动提交请求来完成任务,这样降低服务质量
方案分类
只需要用户手动通过浏览器发送一次请求,就可以将本次请求相关的Servlet来依次调用
- 重定向方案
- 请求转发方案
重定向原理:
在第一个Servlet工作完毕后,将第二个Servlet地址推送给用户浏览器,由用户浏览器根据这个地址来自动的向第二个Servlet发送请求
重定向涉及命令:
response.sendResirect(第二个Servlet地址);
将一个地址写入到响应头中的location属性上,浏览器在接收到响应包之后,自动根据location地址来发送第二次请求。这样的好出避免用户多次手动发送请求
重定向特征:
- 发生的位置:发生在客户端的浏览器上
- 浏览器发送的请求次数:多次
- 地址栏中的内容是否会发生改变?:会发生变化,而内容是浏览器第二次需要访问的资源地址
- 重定向时,浏览器采用的请求方式是是什么方式?:由于此时通过地址栏来命令浏览器发送请求,所以浏览器采用请求方式一定只能是GET
- 重定向时访问的资源文件范围:并未限制,但是内容需写项目名或者全网站名
重定向方案适用场景
- 添加功能Servlet 调用查询功能Servlet
- 删除功能Servlet 调用查询功能Servlet
- 更新功能Servlet 调用查询功能Servlet
请求转发的原理
在第一个Servlet工作完毕后,代替当前浏览器向Tomcat申请调用第二个Servlet。Tomcat在接收到申请之后,调用第二个Servlet来完成本次请求中剩余任务
请求转发涉及的命令
Servlet1和Servlet2
- 创建一个资源申请报告对象
RequestDispatcher report = request.getRequestDispatcher(“第二个Servlet地址”) - 将申请报告推送给Tomcat,同时将Servlet1拥有的【request和response】一并交给Tomcat
report.forward(request,response); - Tomcat在接收到报告之后就会调用第二个Servlet来完成剩余任务
请求转发时为什么将第一个Servlet中的request和response交给Tomcat
- Tomcat在接收到请求之后,需要调用第二个Servlet.
- Tomcat此时需要为第二个Servlet提供运行时需要的request和response
- 但是本次请求是由第一个Servlet发来的,没有对应的请求协议包,因此导致Tomcat在接收到请求后,不会创建request和response
- 为了解决这个问题,需要将第一个Servlet使用request和response通过Tomcat交给第二个Servlet来使用
请求转发特征
- 发生的位置:发生在服务端
- 浏览器发送请求的次数:浏览器只向服务端发送了一次请求
- 地址栏内容是否发生变化:由于请求转发发生在服务端,因此浏览器地址栏中的内容依然是保持在第一次请求的内容
- 调用资源文件范围:只能在项目内的资源
- 通过请求转发所调用的Servlet接收的请求方式:与我们浏览器第一次发送请求时,所使用的请求方式保持一致(或者说参与同一次请求转发的所有Servlet接收的请求方式是一样的)
- 参与同一次请求转发的所有Servlet之间如何进行数据共享
1)可以使用全局作用于对象
2)可以使用会话作用域对象
3)可以使用请求作用域对象
请求转发不适合的场景
- 添加功能Servlet 调用查询功能Servlet
- 删除功能Servlet 调用查询功能Servlet
- 更新功能Servlet 调用查询功能Servlet
请求转发适合的场景
查询Servlet调用JSP时