1. Servlet规范介绍
servlet规范来自于JAVAEE规范中的一种
作用:
- 在Servlet规范中,指定【动态资源文件】开发步骤。
- 在Servlet规范中,指定Http服务器调用动态资源文件规则。
- 在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则。
2. Servlet接口实现类
- Servlet接口来自于Servlet规范下一个接口,这个接口存在Http服务器提供jar包.
- 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()
}
package com.bipowernode.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 子类--->父类----->接口
* 此时 子类也是A接口实现类
* * Servlet接口:
* init
* getServletConfig
* getServletInfo
* destroy ----四个方法对于Servlet接口实现类没用
* Tomcat根据Servlet规范调用Servlet接口实现类实例对象
* 1.Tomcat有权创建Servlet接口实现类实例对象
* Servlet oneServlet = new OneServlet();
* 2.TomCat根据实例对象调用摄servlet方法处理当前请求
* oneServlet.servlet()
* * extends extends implement
* OneServlet--->(abstract)HttpServlet----->(abstract)GenericServlet--------->servlet接口
* init
* destroy
* getServletConfig
* getServletInfo
* * 当前环境中:
* 子类OneServlet继承了父类HttpServlet
* 子类中重写了父类方法:doGet和doPost
* 父类中有方法:doGet和doPost和service
* 父类在方法servlet中调用了:this.doGet和this.doPost
* * 当创建对象
* OneServlet oneServlet = new OneServlet();
* 使用:
* oneServlet.service()方法时,会去子类OneServlet中找service方法,如果子类中没有则去父类中找
* 此时找到父类的service方法,在父类中使用了this.doGet和this.doPost
* 此时this指向调用方法service的实例对象 即 this--->oneServlet
* 在类OneServlet中有方法doGet和doPost,
* 所有公调用OneServlet类中的doGet和doPost方法
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneServlet类针对浏览器发送GET请求方式处理");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("OneServlet类针对浏览器发送POST请求方式处理");
}
}
3.Servlet接口实现类开发步骤
-
第一步:创建一个Java类继承于HttpServlet父类,使之成为一个Servlet接口实现类。
-
第二步:重写HttpServlet父类两个方法。doGet或则doPost
-
第三步:将Servlet接口实现类信息【注册】到Tomcat服务器
网站--->web--->WEB-INF--->web.xml <!--将Servlet接口实现类类路径地址交给Tomcat--> <servlet> <servlet-name>mm</servlet-name> <!--声明一个变量存储servlet接口实现类类路径--> <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class><!--声明servlet接口实现类类路径--> </servlet> <!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名--> <servlet-mapping> <servlet-name>mm</servlet-name> <url-pattern>/one</url-pattern> <!--设置简短请求别名,别名在书写时必须以"/"为开头--> </servlet-mapping> 如果现在浏览器向Tomcat索要OneServlet时地址 http://localhost:8080/myWeb/one
4. 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对象进行销毁
5. HttpServletResponse和HttpServletRequest接口
5.1 HttpServletResponse接口
介绍:
- HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletResponse接口实现类由Http服务器负责提供
- HttpServletResponse接口负责将doGet/doPost方法执行结果写入到【响应体】交给浏览器
- 开发人员习惯于将HttpServletResponse接口修饰的对象称为【响应对象】
作用:
- 将执行结果以二进制形式写入到【响应体】
- 设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】
- 设置响应头中【location】属性,将一个请求地址赋值给location.从而控制浏览器向指定服务器发送请求
5.2 HttpServletRequest接口
介绍:
- HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletRequest接口实现类由Http服务器负责提供
- HttpServletRequest接口负责在doGet/doPost方法运行时读取Http请求协议包中信息
- 开发人员习惯于将HttpServletRequest接口修饰的对象称为【请求对象】
作用:
- 可以读取Http请求协议包中【请求行】信息。
- 可以读取保存在Http请求协议包中【请求头】或则【请求体】中请求参数信息。
- 可以代替浏览器向Http服务器申请资源文件调用。
5.3 请求对象和响应对象生命周期
-
在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】
-
在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】作为实参传递到方法,确保doGet/doPost正确执行
-
在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁
【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中 【请求对象】和【响应对象】相当于用户在服务端的代言人
6 网站默认资源文件
-
什么是网站默认资源文件:网站默认资源文件,是在向网站发出首次请求时默认传回的资源文件,如在浏览器中输入百度网站时,会默认弹出百度首页。
-
默认欢迎资源文件:
用户发送了一个针对某个网站的【默认请求】时, 此时由Http服务器自动从当前网站返回的资源文件 正常请求: http://localhost:8080/myWeb/index.html 默认请求: http://localhost:8080/myWeb/
-
Tomcat对于默认欢迎资源文件定位规则
1)规则位置:Tomcat安装位置/conf/web.xml 2)规则命令:<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
-
设置当前网站的默认欢迎资源文件规则
1)规则位置: 网站/web/WEB-INF/web.xml 2)规则命令: <welcome-file-list> <welcome-file>默认资源文件名</welcome-file> </welcome-file-list> 注意:网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效
6 Http状态码
Http响应协议包:主要包含四个部分
1.按照自上而下划分,分为4个空间
2.空间划分:
状态行:[
Http状态码
]
响应头:[
content-type: 指定浏览器采用对应编译器
对响应体二进制数据进行解析
]
空白行:[
没有任何内容,起到隔离作用
]
响应体:[
可能是被访问静态资源文件内容
可能是被访问的静态资源文件命令
可能是被访问的动态资源文件运行结果
*****都是以二进制形式***
]
主要作用和介绍:
1)由三位数字组成的一个符号。
2)Http服务器在推送响应包之前,根据本次请求处理情况
将Http状态码写入到响应包中【状态行】上
3)如果Http服务器针对本次请求,返回了对应的资源文件。
通过Http状态码通知浏览器应该如何处理这个结果(资源文件可能不够)
如果Http服务器针对本次请求,无法返回对应的资源文件
通过Http状态码向浏览器解释不能提供服务的原因
分类及常用状态码:由 100—599;分为5个大类
1)1XX :
最有特征 100; 通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器
在接收响应包之后,继续向Http服务器所要依赖的其他资源文件。
2) 2XX:
最有特征200,通知浏览器本次返回的资源文件是一个完整独立资源文件,浏览器在接收到之后不需要所要其他关联文件。
3)3xx:
最有特征302,通知浏览器本次返回的不是一个资源文件内容而是一个资源文件地址,需要浏览器根据这个地址自动发起 请求来索要这个资源文件
如:
response.sendRedirect("资源文件地址")写入到响应头中location
而这个行为导致Tomcat将302状态码写入到状态行
4)4XX:
404: 通知浏览器,由于在服务端没有定位到被访问的资源文件因此无法提供帮助
405:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)但是这个Servlet对于浏览器采用的请求方式不能处理
5)5xx:
500:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)这个Servlet可以接
收浏览器采用请求方式,但是Servlet在处理请求期间,由于Java异常导致处理失败。
7 多个Servlet之间调用规则
某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。这样增加用户获得服务难度,导致用户放弃访问当前网站。
如何解决这种缺陷:无论本次请求涉及到多少个Servlet,用户只需要【手动】通知浏览器发起一次请求即可。
解决方法:
- 重定向解决方案
- 请求转发解决方案
7.1 重定向解决方案
工作原理:
第一步:用户第一次通过【手动方式】通知浏览器访问OneServlet。OneServlet工作完毕后,将
TwoServlet地址写入到响应头location属性中,导致Tomcat将302状态码写入到状态行。
第二步:在浏览器接收到响应包之后,会读取到302状态。此时浏览器自动根据响应头中location属性
地址发起第二次请求,访问TwoServlet去完成请求中剩余任务
实现方式:
在第一个servlet执行完毕之后,通过response.sendRedirect(“请求地址”)将地址写入到响应包中响应头中location属性。.
特征:
1)请求地址:
既可以把当前网站内部的资源文件地址发送给浏览器 (/网站名/资源文件名)
也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
2)请求次数
浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。后续请求都是浏览器自动发送的。
3) 请求方式:
重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此
通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】
缺点: 重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间。
7.2 请求转发解决方案
原理: 用户第一次通过手动方式要求浏览器访问OneServlet,OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务。
实现命令:
请求对象代替浏览器向Tomcat发送请求
//1.通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/资源文件名");一定要以"/"为开头
//2.将报告对象发送给Tomcat
report.forward(当前请求对象,当前响应对象)
优点:
1)无论本次请求涉及到多少个Servlet,用户只需要手动通过浏览器发送一次请求
2) Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数增加处理服务速度
特征:
1)请求次数:在请求转发过程中,浏览器只发送一次请求
2)请求地址:只能向Tomcat服务器申请调用当前网站下资源文件地址
3)请求方式
在请求转发过程中,浏览器只发送一个了个Http请求协议包。参与本次请求的所有Servlet共享同
一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致