多个servlet间的调用和数据共享
1. 状态码
前面一篇文章中提到,servlet将请求处理的结果交付给响应对象,响应对象会将结果给反馈到浏览器上,由Http服务器在推送响应包之前,根据本次请求处理情况,将Http状态码写入到相应包中状态行中;状态码通知浏览器应该如何处理这个结果
状态码是浏览器接下来如何进行操作的重要依据,也可以用来解释浏览器不能提供服务的原因
1.1 状态码分类
分类:
组成:100-----599;分为五个大类
1xx:
最有特征的是100;通知浏览器本次返回的资源文件并不是独立的资源文件,需要在浏览器接受了响应包之后,继续向服务器索要文件
2xx:
最有特征的是200;通知浏览器本次所返回的资源文件是独立的资源文件,浏览器接手之后不需要向服务器在索要文件
3xx
最有特征的是302,通知浏览器本次返回的不是一个资源文件的地址,而是一个资源文件的地址,需要浏览器根据这个地址自动发起请求来索要资源文件
Response.sendRedirect(“资源文件地址”)写入到响应头中的location位置(是在建立一个servelt之后,doPost或者doGet方法中写入)
4xx
最有特征的是404;通知浏览器,由于在服务器中没有定位到访问的资源文件,服务器无法提供资源文件给浏览器,所以进行解释
最有特征的是405;通知浏览器,在服务端中已经定位到了被访问的资源文件(Servlet),但是这个Servlet对于浏览器采用的请求方式不能处理
5xx
最有特征的是500,在服务端已经定位到被访问的资源文件(Servlet)这个Servlet可以接收浏览器采用请求方式,但是Servlet在处理请求期间,由于java异常导致处理失败
500代表的所写的web程序是有问题的,程序上运行出错,其实是最难处理的问题,有一些时候是因为依赖加入的版本问题,或者是导入的包错误,类的描述是不对的
2. 多个servlet的调用规则
前面的文章中简述了一个servlet在面对请求发送和处理的应用,但很多时候是需要多个servlet对请求进行处理,从而便有了多个servlet之间的调用规则
调用规则有两种,一是重定向解决方案,二是请求转发解决方案
请求转发和重定向二者都可以实现页面的跳转,但请求转发的时候,url不会发生变化,重定向的时候,url地址栏会发生变化
2.1 重定向解决方案
2.2 请求转发解决方案
3. 多个servlet的数据共享
多个servlet处理一个请求的时候,中间要将数据给传递出去,作为共享数据
共享方案有多种
ServletContext接口
Cookie类
HttpSession接口
3.1 ServletContext接口
- 来自于Servlet规范中一个接口,接口实现类由Http服务器负责提供
- ServletContext相当于公共仓库,在这个仓库存放的数据就是共享数据而这个共享数 据可以被当前网站中所有的Servlet来使用
- 开发人员习惯于将ServletContext接口修饰的对象称为【全局作用域对象】
使用方法:
3.2 Cookie类
原理:用户第一个访问OneServlet。
OneServlet负责创建一个Cookie对象。并写入共享数据
在OneServlet工作完毕后负责【将Cookie对象写入到响应头】
来交给浏览器进行管理
等到浏览器第二次向当前网站发送请求时,必须无条件的
将当前网站之前推送过来的cookie对象写入到请求协议包
中的请求头进行返回,本次为用户提供服务的Two Servlet
进行服务的同时就可以读取到这个cookie对象,从而读取
到由OneServlet写入到Cookie对象中共享数据
操作流程:
3.3 HttpSession接口
工作原理:
用户通过浏览器第一次访问OneServlet。OneServlet在提供服务过程中要求 Tomcat为当前用户开发一个【私人储物柜(HttpSession对象)】.Tomcat在创建这个HttpSessio对象时,生成一个唯一编号.这个编号称为sessionId。在 OneServlet工作完毕后。Tomcat将sessionId作为一个Cookie对象 (‘JSESSIONID’,柜子编号)写入到响应头
然后浏览器在接收到响应包之后,将这个cookie保存在浏览器的内存中等到用户第二次来访问这个网站时,自动发送这个cookie对象此时提供服务的TwoServlet 就可以凭借柜子编号得到用户的私人储物柜并读取由OneServlet写入的共享数据
操作流程: