视频地址:https://www.bilibili.com/video/BV1y5411p7kb
一、Servlet介绍
- 概述
Servlet是动态Web资源开发技术。
简单来说servlet是运行在服务器上的java程序。servlet程序无法单独运行,需要放在服务器中,由服务器调用,其作用是对服务器接收的请求进行处理。 - 作用
通俗来讲servlet专门用来接收客户端的请求数据,然后调用底层service处理数据并生成结果。
浏览器http请求------> tomcat服务器 -------> 到达servlet-----> 执行doget,dopost方法----> 返回数据。 - servlet里的三大作用域
- request(请求):它的作用范围是一次请求和响应,是三个作用域中最小的。
- session(会话):它的作用比request要大一点,一次会话过程中,它的作用域就一直存在,(默认是30分钟)
- servletcontext:它作用范围最大,作用于整个服务器中。(Application)
二、Servlet接口实现类
-
Servlet接口来自于Servlet规范下的一个接口,这个接口存在Http服务器
-
Tomcat服务器下lib文件有一个servlet-api.jar存放Servlet接口(javax.servlet.Servlet接口)
-
Servlet规范中任务,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类
例子: class Student{ //不是动态资源文件,Tomcat无权调用 } class Teacher implements Servlet{ //合法动态资源文件,Tomcat有权利调用 Servlet obj = new Teacher(); obj.doGet() }
三、Servlet接口实现类开发步骤
-
创建一个Java类继承于HttpServlet父类,使之成为一个Servlet接口实现类
-
重写HttpServlet父类两个方法:doGet或者doPost
-
将Servlet接口实现类信息【注册】到Tomcat服务器
<!--将Servlet接口实现类类路径地址交给Tomcat--> <servlet> <servlet-name>mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径--> <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class><!--声明servlet接口实现类类路径--> </servlet> <!--以上语句相当于: Tomcat String mm = "com.bjpowernode.controller.OneServlet" --> <!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名--> <servlet-mapping> <servlet-name>mm</servlet-name> <url-pattern>/one</url-pattern> <!--设置简短请求别名,别名在书写时必须以"/"为开头--> </servlet-mapping>
将以上【注册】内容写在 “网站” —> “web” —> “WEB-INF” —> “web.xml” 下,之后如果浏览器向Tomcat索要OneServlet时,访问的地址为:http://localhost:8080/myWeb/one
四、Servlet对象生命周期
-
网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责创建。开发人员不能手动创建Servlet接口实现类的实例对象。
-
在默认的情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时,自动创建这个Servlet接口实现类的实例对象。
在手动配置情况下,要求Http服务器在启动时自动创建某个Servlet接口实现类的实例对象:<servlet> <servlet-name>mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径--> <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class> <load-on-startup>30<load-on-startup><!--填写一个大于0的整数即可--> </servlet>
-
在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
-
在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁
五、HttpServletResponse接口
介绍
- HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletResponse接口实现类由Http服务器负责提供
- HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器
- 开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】
主要功能
- 将执行结果以二进制形式写入到【响应体】
- 设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】
- 设置响应头中【location】属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求
六、HttpServletRequest接口
介绍
- HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletRequest接口实现类由Http服务器负责提供
- HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
- 开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】
作用
- 可以读取Http请求协议包中【请求行】信息
- 可以读取保存在Http请求协议包中【请求头】或则【请求体】中请求参数信息
- 可以代替浏览器向Http服务器申请资源文件调用
七、请求对象和响应对象生命周期
request是Http请求信息的对象,response是Http响应信息的对象。
- 浏览器发出请求访问服务器中的Servlet时,服务器会调用Servlet中的service方法处理请求,在这之前就会先创建request和response对象;
- request对象封装了浏览器发给服务器的请求信息(请求头、请求行、请求实体等等),response对象会封装服务器发送给浏览器的响应信息(状态行、响应头、响应实体等等);
- 在service方法执行完毕后,服务器再将response中的数据取出,按照HTTP协议的格式发送给浏览器;
- 服务器每次处理请求都会创建request和response对象,并在处理完请求,响应结束时,服务器会销毁request和response对象。
【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中
【请求对象】和【响应对象】相当于用户在服务端的代言人
八、欢迎资源文件
- 前提:
用户可以记住网站名,但是不会记住网站资源文件名 - 默认欢迎资源文件
用户发送了一个针对某个网站的【默认请求】时,此时由Http服务器自动从当前网站返回的资源文件
正常请求: http://localhost:8080/myWeb/index.html
默认请求: http://localhost:8080/myWeb/ - Tomcat对于默认欢迎资源文件定位规则
-
规则位置:Tomcat安装位置/conf/web.xml
-
规则命令:
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
-
- 设置当前网站的默认欢迎资源文件规则
- 规则位置: 网站/web/WEB-INF/web.xml
- 规则命令:
<welcome-file-list> <welcome-file>login.html</welcome-file> </welcome-file-list>
- 网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效
九、Http状态码
介绍
- 由三位数字组成的一个符号。
- Http服务器在推送响应包之前,根据本次请求处理情况,将Http状态码写入到响应包中【状态行】上
- 如果Http服务器针对本次请求,返回了对应的资源文件, 通过Http状态码通知浏览器应该如何处理这个结果;
如果Http服务器针对本次请求,无法返回对应的资源文件,通过Http状态码向浏览器解释不能提供服务的原因
分类:
组成 100—599;分为5个大类
-
1XX:信息,服务器收到请求,需要请求者继续执行操作。
最有特征 100:(继续)通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器所要依赖的其他资源文件; -
2XX:成功,操作被成功接收并处理。
最有特征200:请求成功。一般用于GET与POST请求; -
3xx:重定向,需要进一步的操作以完成请求。
302:(临时移动)通知浏览器本次返回的不是一个资源文件内容,而是一个资源文件地址,需要浏览器根据这个地址自动发起请求来索要这个资源文件response.sendRedirect(“资源文件地址”)写入到响应头中
location
而这个行为导致Tomcat将302状态码写入到状态行 -
4XX:请求错误(客户端错误)请求包含语法错误或无法完成请求。
403:(禁止)服务器拒绝请求;
404:(未找到)通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供帮助;
405:(方法禁用)通知浏览器,在服务端已经定位到被访问的资源文件(Servlet),但是这个Servlet对于浏览器采用的请求方式不能处理; -
5xx:服务器错误,服务器在处理请求的过程中发生了错误
500:(服务器内部错误)通知浏览器,在服务端已经定位到被访问的资源文件(Servlet), 这个Servlet可以接收浏览器采用请求方式,但是Servlet在处理请求期间,由于Java异常导致处理失败;
503:(服务不可用)服务器目前无法使用(由于超载或停机维护)只是暂时状态;
十、多个Servlet之间调用规则
- 前提条件
某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。这样增加用户获得服务难度,导致用户放弃访问当前网站 - 提高用户使用感受规则
无论本次请求涉及到多少个Servlet,用户只需要【手动】通知浏览器发起一次请求即可 - 多个Servlet之间调用规则:
- 重定向解决方案
- 请求转发解决方案
十一、重定向解决方案
-
工作原理
用户第一次通过【手动方式】通知浏览器访问OneServlet。
OneServlet工作完毕后,将TwoServlet地址写入到响应头 location属性中,导致Tomcat将302状态码写入到状态行。
在浏览器接收到响应包之后,会读取到302状态。此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TwoServlet去完成请求中剩余任务 -
实现命令
response.sendRedirect(“请求地址”)
将地址写入到响应包中响应头中location属性
-
特征
-
请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名) -
请求次数
(两次请求,两次响应)浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。 后续请求都是浏览器自动发送的。 -
请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】
-
-
缺点
重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间
十二、请求转发解决方案
-
原理
用户第一次通过手动方式要求浏览器访问OneServlet。
OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务 -
实现命令
请求对象代替浏览器向Tomcat发送请求//1.通过当前请求对象生成资源文件申请报告对象 RequestDispatcher report = request.getRequestDispatcher("/资源文件名");一定要以"/"为开头 //2.将报告对象发送给Tomcat report.forward(当前请求对象,当前响应对象)
-
优点
- 无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求
- Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数,增加处理服务速度
-
特征
- 请求次数
转发是一次请求,一次响应 - 请求地址
只能向Tomcat服务器申请调用当前网站下资源文件地址
request.getRequestDispathcer("/资源文件名") 不要写网站名 - 请求方式
在请求转发过程中,浏览器只发送一个了个Http请求协议包。参与本次请求的所有Servlet共享同一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致
- 请求次数
十三、请求转发 VS 重定向
请求转发后,浏览器地址不会改变
重定向后浏览器地址会发生变化(两次请求都是浏览器发起)