• Servlet之重定向、请求转发


    多个Servlet之间调用规则

    1、前提条件:某些来自于浏览器发送请求,往往需要服务端中多个Servlet协同处理。但是浏览器一次只能访问一个Servlet,用户需要手动通过浏览器发起多次请求才能得到服务。这样增加用户获得服务难度,导致用户体验变差。
    2、提高用户使用感受规则,无论本次请求涉及到多少个Servlet,用户只需要手动通知浏览器发起一次请求即可。
    3、多个Servlet之间调用规则:
    a、重定向解决方案
    b、请求转发解决方案

    重定向

    概述

    1、用户手动通知浏览器访问OneServlet,OneServlet工作完毕后。
    2、将TwoServlet地址写入到响应头Location属性中,导致Tomcat将302状态码写入到状态行,交给浏览器(Location:TwoServlet)。
    3、浏览器收到响应包,读取到了302状态码,立刻自动根据响应头中Location中的地址发起第二次请求,访问TwoServlet。
    (TwoServlet二次请求是浏览器自动发送的。)
    在这里插入图片描述

    实现命令:

    response.sendRedirect("请求地址");
    将地址写入到响应包中响应头的location属性中。
    对于response.sendRedirect("String location")中的location,如果不以“/”开头,表示相对于当前源组件的路径;如果以“/”开头,表示相对于当前服务器根路径的URL;如果以“http://”开头,表示一个完整的Internet上的路径。

    代码示例

    在这里插入图片描述
    在这里插入图片描述
    启动服务器,在地址栏输入Http://localhost:8080/myWeb/one
    在这里插入图片描述
    地址栏发生变化,one变为two。
    在这里插入图片描述
    控制台输出:
    在这里插入图片描述

    特征

    1、请求地址:既可以把当前网站内部的资源文件地址发送给浏览器(/网站名/资源文件名);也可以把其他网站资源文件地址发送给浏览器(http://ip地址:端口号/网站名/资源文件名)。
    2、请求次数浏览器至少发送两次请求,但是只有第一次请求是用户手动发送。后续请求都是浏览器自动发送的。
    3、请求方式:重定向解决方案中,通过地址栏通知浏览器发起下一次请求,因此通过重定向解决方案调用的资源文件接收的请求方式一定是GET方式。

    缺点及其它特性

    1、重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间消耗在往返次数上,增加用户等待服务时间
    在这里插入图片描述
    2、地址栏改变跳转导致客户端跳转。
    3、不能保留request属性(两次请求,地址改变了,客户端跳转,不同的request)。
    4、所有代码执行完之后再跳转,跳转语句后的代码还是会执行,除非在后面加上return。
    5、通过对URL地址的重写传递参数。(如:response.sendRedirect("hh.jsp? id=aaa")

    请求转发

    概述

    1、用户第一次通过手动方式要求浏览器访问OneServlet。
    2、OneServlet工作完毕后,通过当前的请求对象代替浏览器向Tomcat发送请求,申请调用TwoServlet(OneServlet调用forward()方法,在服务端将请求转发给TwoServlet)。
    3、Tomcat在接收到这个请求之后,自动调用TwoServlet来完成剩余任务(由TwoServlet做出响应)。
    在这里插入图片描述
    4、请求方式:在请求转发过程中,浏览器只发送一个了个Http请求协议包。参与本次请求的所有Servlet共享同一个请求协议包,因此这些Servlet接收的请求方式与浏览器发送的请求方式保持一致。

    实现命令

    请求对象代替浏览器向Tomcat发送请求
    1、通过当前请求对象生成资源文件申请报告对象(获取请求转发器对象)。
    RequestDispatcher report = request.getRequestDispatcher("/资源文件名");
    (一定要以"/"开头)
    2、将报告对象转发给Tomcat(转发请求)。
    report.forward(当前请求对象, 当前响应对象)

    大概代码

    OneServlet(xml:/one):

    doGet{
    	System.out.println("这是OneServlet。");
    	RequestDispatcher report = request.getRequestDispatcher("/two");
    	report.forward(request, response);
    }
    

    TwoServlet(xml:/two):

    doGet{
    	System.out.println("这是TwoServlet。");
    }
    

    在地址栏输入:..../one,回车后,地址栏没有发生变化。
    Server的Output显示:
    这是OneServlet。
    这是TwoServlet。

    优点

    1、无论本次请求涉及到多少个servlet,用户只需要手动通过浏览器发送一次请求。
    2、servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数,增加处理服务速度。
    3、地址栏不改变跳转,服务端跳转,服务器之间内部跳转,相同的request,可传参。
    4、执行到跳转语句后无条件立刻跳转,之后的代码不再被执行。
    注意:使用forward跳转的话,一定要在跳转之前释放掉全部的资源。
    5、使用forward时,request设置的属性依然能保留在下一个页面。

    间接请求转发

    1、间接转发方式,有时也叫重定向,一般用于避免用户非正常访问。
    2、例如:
    用户在没有登录的情况下访问后台资源,servlet可以将该HTTP请求重定向到登录界面,让用户登录后再访问。
    3、代码示例

    doGet{
    	response.sendRedirect("资源的URl");
    }
    

    多个Servlet之间数据共享实现方案

    数据共享:OneServlet工作完毕后,将产生数据交给TwoServlet来使用。

    Servlet规范中提供四种数据共享方案

    1、ServletContext接口
    2、Cookie类
    3、HttpSession接口
    4、HttpServletRequest接口

  • 相关阅读:
    数组作为函数参数传递时
    Tree 笨方法实现
    双向链表
    带头节点的循环链表及两个循环链表的合并
    josephus问题->不带头节点的循环链表
    数组形式链表
    检测qq是否在线
    Python-requests模块
    Python面向对象练习——基于面向对象设计一个对战游戏
    Python-面向对象
  • 原文地址:https://www.cnblogs.com/yu011/p/13788589.html
Copyright © 2020-2023  润新知