多个servlet之间调用
前提条件
某些来自于浏览器发送的请求,需要服务端的多个servelt协同处理,但是浏览器一次只能访问一个servlet,导致用户需要手动通过浏览器发起多次请求才能得到服务。这样会增加用户获得服务的难度,导致用户放弃访问当前网站。
提高用户使用感受的规则
无论本次请求涉及到多少个servlet,用户只需要【手动】通知浏览器发起一次请求即可
调用规则的实现方法
- 重定向解决方案
- 请求转发解决方案
重定向解决方案(浏览器)
工作原理:
用户第一次通过【手动】方式通知浏览器访问oneservlet,oneservlet工作完毕后,将twoservlet地址写到响应头的location属性中,导致tomcat将302状态码写入到状态行中。 浏览器接收到响应包之后,读取到302状态码,此时浏览器会自动根据loction属性地址发起第二次请求,访问twoservlet去完成请求中剩余任务。
实现命令
response.sendredirect(“请求地址”)将地址写入到响应包中响应头中的loction属性
请求地址:/网站名/资源文件名
String str = "洗韭菜";
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print(str);
System.out.println("洗韭菜");
response.sendRedirect("two");
特征
-
请求地址:既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名)
,也可以把其他网站中的资源文件发送给浏览器(http://ip地址:端口号/网站名/资源文件名)
-
请求次数:浏览器至少要发送两次请求,但是只有第一次请求是用户手动发送的,后续请求都是浏览器自动发送的
-
请求方式:重定向解决方案中,是通过地址栏通知浏览器发送下一次请求的,因此通过重定向解决方案调用的资源文件接收的请求方式一定是【get】
缺点
需要在浏览器与服务器之间进行多次往返,大量的时间消耗在往返此处上,增加用户等待服务时间。
请求转发解决方案(服务端)
原理
用户第一次通过手动方式要求浏览器访问oneservlet。oneservlet工作完毕后,通过当前请求对象代替浏览器向tomcat发送请求,申请调用twoservlet。
tomcat在接收到请求之后,自动调用twoservlet来完成剩余任务。
实现命令:
请求对象代替浏览器向tomcat发送请求
1.通过当前请求对象生成资源文件申请报告对象
RequestDispatcher report = request.getRequestDispatcher("/资源文件名");一定要以 / 为开头
2.将报告对象发送给tomcat
report.forward(当前请求对象,当前响应对象)
RequestDispatcher report = request.getRequestDispatcher("/two");
report.forward(request,response);
优点
-
无论本次请求涉及到多少个servlet,用户只需要手动通过浏览器发送一次请求
-
servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间的往返次数,增加处理服务速度
特征
- 请求次数:浏览器自始至终只发送了一次请求
- 请求地址:只能向tomcat申请调用当前网站下资源文件地址
request.getRequestDispatcher("/资源文件名") 不要写网站名
- 请求方式:在请求转发的过程中,浏览器只发送了一个http请求协议包,参与本次请求的所有sercvlet共享同一个请求协议包,根据客户端第一次发送请求时的请求方式决定。
多个servlet之间数据共享的实现方案
- 数据共享:oneservlet工作完毕后,将产生的数据交给twoservlet来使用。
- servlet规范中提供四种数据共享方案。
- servletcontext接口
- cookie类
- httpSession接口
- httpservletrequest接口