1.Servlet规范介绍
Servlet容器,顾名思义里面存放着Servlet对象
- Servletg规范来自于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(); }
3. Servlet接口实现类开发步骤
- 第一步:创建一个Java类继承与HttpServlet父类,使之成为一个Servlet接口实现类。
- 第二步:重写HttpServlet父类的两个方法。doGet和doPost
get
浏览器 -------> oneServlet.doGet()
post
浏览器 -------> oneServlet.doPost()
- 第三步:将Servlet接口实现类信息【注册】到Tomcat服务器
【网站】---> 【web】--> 【WEB-INF】--> web.xml 复制代码
- 将 Servlet 接口实现类类路径地址交给 Tomcat
<servlet> <!--声明一个变量存储servlet接口是是实现类类路径--> <servlet-name>mm</servlet-name> <!--声明一个 servlet 接口实现类的类路径--> <servlet-class>com.com.yunbocheng.cntroller.OneServlet</servlet-class> </servlet> Tomcat String mm = "com.yunbocheng.controller.OneServlet" <!--为了降低用户访问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接口是是实现类类路径--> <servlet-name>mm</servlet-name> <!--声明一个 servlet 接口实现类的类路径--> <servlet-class>com.com.yunbocheng.cntroller.OneServlet</servlet-class> <!--填写一个大于0的整数即可--> <load-on-startup></load-on-startup> </servlet> 复制代码
- 在我们的HTTP服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象。
- 在HTTP服务器关闭时刻,自动将网站的所有Servlet对象进行销毁。
5. HttpServletResponse接口
- 介绍:
- HttpServletResponse接口来自于Servlet规范中,在Tomcat中存在 servlet-api.jar
- HttpServletResponse接口实现类Http服务器负责提供
- HttpServletResponse接口负责将doGet/doPost方法执行的结果写入到【响应体】交给浏览器
- 开发人员习惯于将HttpServletResponse接口修饰 的对象称为【响应对象】
- 主要功能:
- 将执行结果以二进制的形式写入到【响应体】
- 设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字、图片、视频、命令】
- 设置响应头中的【location】属性,将一个请求地址赋值给location,从而控制浏览器向指定服务器发送请求。
6. HttpServletRequest接口
- 介绍:
- HttpServletRequest接口来自于Servlet规范中,在Tomcat中存在 servlet-api.jar
- HttpServletRequest接口实现类Http服务器负责提供
- HttpServletRequest这个接口负责在doGet/doSet方法运行时读取Http请求协议包中信息
- 开发人员将HttpServletRequest接口修饰的对象叫做【请求对象】
- 作用:
- 可以Http请求协议包中【请求行】信息 测试:(代码在OneServlet类中)
- 可以读取保存在Http请求协议包中【请求头】或者【请求体】中请求参数信息 测试 :(代码在TwoServlet类中和 two.html three.html)
- 可以代替浏览器向Http服务器申请资源文件调用
7. 请求对象和响应对象的生命周期
- 在Http服务器接收到浏览器发送的【Http请求协议包】之后,
自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】 - 子Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】
作为参数传递到方法,确保doGet/doPost正确执行。 - 在Http服务器推动Http响应协议包之前,负责将本次关联的【请求对象】和【响应对象】
销毁。
【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中。
【请求对象】和【响应对象】相当于用户在服务端的代言人
8.欢迎资源文件
- 前提:
用户可以记住网站名,但是不会记住网站资源文件名 - 默认欢迎资源文件:
用户发送了一个针对某个网站的【默认请求】时,此时由Http服务器自动从当前网页返回
的资源文件
正常请求:http://localhost:8080/MyWeb/index.html
默认请求:http://localhost:8080/MyWeb - 注意 :每个http服务器对于默认的请求是不同的,这里只是使用了 Tomcat 这种服务器进行简
单的介绍,其他的自己了解。 - Tomcat对于默认欢迎资源文件定位规则
- 规则位置 :Tomcat位置/conf/web.xml
- 规则命令:(会进行自下的查找,从index.html直到找到index.jsp,如果都找不到,会返回
404 )
<welcome-file-list> <welcome-file>index.html</welcome-file> <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> (login.html为自定义的默认请求) </welcome-file-list> 复制代码
- 网站设置自定义默认文件定位规则,此时Tomcat自带定位规则将失效
- 欢迎资源文件不仅可以写静态资源文件,也可以写动态资源文件。
<welcome-file-list> <!--动态资源文件作为默认欢迎资源文件时,开头的斜杠必须去掉--> <welcome-file>user/find</welcome-file> <!--静态资源文件最为默认欢迎资源文件时--> <welcome-file>login.html</welcome-file> (login.html为自定义的默认请求) </welcome-file-list> 复制代码
9.Http状态码
- 介绍:
- 由三位数字组成的一个符号。
- Http服务器在推动送应包之前,根据本次请求处理情况将Http状态码写入到相应包的【状态行】上。
- 作用:
- 如果Http服务器针对本次请求,返回了对应的资源文件。通过Http状态码通知浏览器应该如何去处理这个结果。
- 如果Http服务器针对本次请求,无法返回对应的资源文件,通过Http状态码向浏览器解释不能提供服务的原因。
- 分类:
- 组成:100---599:分为5大类
- 1XX: 最有特征的是100:通知浏览器本次返回的资源文件并不是一个独立的资源文件,需要浏览器在接收响应包之后,继续向Http服务器所要依赖的其他资源文 件。
- 2XX:最有特征的是200,通知浏览器本次返回的资源文件是一个完整独立的文件,浏览器在接收到之后不需要索要其他关联文件。
- 3XX :最有特征302,通知浏览器本次返回的不是一个资源文件内容而是一个资源文件的地址,需要浏览器根据这个地址自动发起请求案例索要这个资源文件。response.sendRedirect("资源文件地址")写入到响应头中location而这个行为导致Tomcat将302状态码写入到状态行
- 4XX:
404:通知浏览器,由于在服务端没有定位到被访问的资源文件,因此无法提供服务
405:通知浏览器,在服务端已经定位到被访问的资源文件(Servlet)但是这Servlet 对于浏览器采用的请求方式不能处理,比如请求时是在地址栏输入的链接,此时的请求方式是 Get,但是在实现类里边只实现了 doPost 这个方法,此时不能处理Get发送过来的请求,会报 405. - 5XX:500 此时说明是java代码出现了错误,找到了资源文件吗但是底层的java代码发生了错误, 可能是空指针异常,也可能是其他的错误,在服务端里边会有提示的错误信息。
10.多个Servlet之间的调用规则
- 浏览器一次只能访问一个资源文件(即一次只能请求到一个Servlet)
- 前提:
某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。
但是浏览器一次只能访问一个Servlet,导致用户需要手动通过浏览器
发起多次请求才能得到服务。
这样就导致获取服务难度,导致用户放弃访问当前网站 - 提高用户使用感受规则:
无论本次请求涉及到多少Servlet,用户只需要【手动】通知浏览器发起一次请求即可。 - 多个Servlet之间调用规则
- 重定向解决方案
- 请求转发方案
11.重定向解决方案
- 工作原理:用户第一次通过【手动方式】通知浏览器访问OneServlet,OneServlet工作完毕后,将TwoServlet地址写入到响应头location属性中,导致Tomcat将302 的状态码写入到状态行。在浏览器接收到这个相应包之后,会读取到302状态,此时浏览器自动根据响应头中location属性地址发起第二次请求,访问TweServlet去完成剩下的任务。
- 实现命令:
response.sendeRedirect("请求地址")
将地址写入到相应包中响应头中location属性 - 特征:
- 请求地址:可以把当前网站内的资源文件地址发送给浏览器当前网站发送的格式:(/网站名/资源文件名)也可以把其他网站资源文件地址 发送给浏览器其他网站发送的格式:(http://ip地址:端口号/网络名/资源文件名)
- 请求次数:浏览器至少要发送两次请求,但是第一次请求时用户手动发送的。后续请求都是浏览器自动发送的。
- 请求方式:重定向解决方案中,通过地址栏通知浏览器发起下一个请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【GET】
- 缺点:重定向结局方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返回8次数上,增加用户等待服务时间。
12.请求转发解决方案
- 工作原理:用户第一次通过手动方式要求浏览器访问OneServlet,OneServlet工作完成之后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet。Tomcat在接收到这个亲亲贵之后,自动调用TwoServlet来完成剩余任务。
- 实现命令:请求对象代替浏览器向Tomcat发送请求
- 通过当前请求对象生成资源文件申请报告对象
RequestDispatcher request = request.getRequestDispatcher("/资源文件名称");
注意:资源文件名一定要以"/"为开头。 - 将报告对象发送给Tomcat
report.forward(当前请求对象,当前响应对象)
13. 多个Servlet之间数据共享实现方案
- 数据共享:OneServlet工作完毕后,将产生的数据交给TwoServlet来使用。
- Servlet规范中提供四种数据共享方案
- ServletContext接口
- Cookie接口
- HttpSession接口
- HttpServleRequest接口