【摘要】:请求转发,也被称为内部跳转。考虑生活中的一个场景,110 报警中心收到群众报警电话,根据报警的内容,将报警请求交由不同的派出所进行处理。在这里,110 报警中心充当了一个调度员的角色,它负责将各种报警请求转发给实际的处理单位。例3.1:请求转发示例新建Java Web 项目ch04,在项目中建立两个Servlet:UseForward.java 和Other-Servlet.java。图3.1请求转发从运行结果可以看出,访问的是UseForward,而浏览器中显示的却是OtherServlet中的内容。
请求转发,也被称为内部跳转。考虑生活中的一个场景,110 报警中心收到群众报警电话,根据报警的内容(报警地点、事情紧急程度),将报警请求交由不同的派出所进行处理。在这里,110 报警中心充当了一个调度员的角色,它负责将各种报警请求转发给实际的处理单位。这种处理模型的好处是:
➢ 给人们提供了统一的报警方式(拨打110)。
➢ 报警中心可以根据报案人所处的位置、派出所的地理位置与人员状况,合理调度资源,安排就近的派出所及时出警。
➢ 报警中心并不处理具体的案件,缩短了对报警请求的响应时间。
在Web 应用中,这种处理模型也得到了广泛的应用,调度员的角色通常由Servlet 来充当,把这样的Servlet 叫做控制器(Controller)。在控制器中,可以将请求转发(request dispatching)给另外一个Servlet 或者JSP 页面,甚至是静态的HTML页面,然后由它们进行处理并产生对请求的响应。
例3.1:请求转发示例
新建Java Web 项目ch04,在项目中建立两个Servlet:UseForward.java 和Other-Servlet.java。
UseForward.java 代码如下:
OtherServlet.java 代码如下:
(www.chuimin.cn)
从代码中可以看出,在UseForward 中向request 存储了属性message,然后获得了RequestDispatcher 对象,通过RequestDispatcher 对象的forward()方法进行了请求转发,将请求和响应对象转发至OtherServlet;而在OtherServlet 中获得输出流对象,并输出存储在request 中的message 属性的属性值。
可以通过request 对象的getReuestDispatcher()方法获取RequestDispatcher对象。RequestDispatcher 对象由Servlet 容器创建,用于封装一个由路径所标识的服务器资源。利用RequestDispatcher 对象,可以把请求转发给其他的Servlet 或JSP 页面。在RequestDispatcher 接口中定义了两种方法。
forward()方法用于将请求从一个Servlet 传递给服务器上的另外的Servlet、JSP页面或者是HTML 文件。在Servlet 中,可以对请求做一个初步的处理,然后调用这个方法,将请求传递给其他的资源来输出响应。要注意的是,这个方法必须在响应被提交给客户端之前调用,否则它将抛出IllegalStateException 异常。在forward()方法调用之后,之前在响应缓存中的没有提交的内容将被自动清除。
include()方法用于在响应中包含其他资源(Servlet、JSP 页面或HTML 文件)的内容。与forward()方法的区别在于:利用include()方法将请求转发给其他的Servlet,被调用的Servlet 对该请求做出的响应将并入原先的响应对象中,原先的Servlet 还可以继续输出响应信息;而利用forward()方法将请求转发给其他的Servlet,将由被调用的Servlet 负责对请求做出响应,而原先Servlet 的执行则终止。
发布ch04 项目,启动Tomcat 服务器。打开IE 浏览器,在地址栏中输入:
运行效果如图3.1 所示。
图3.1 请求转发
从运行结果可以看出,访问的是UseForward,而浏览器中显示的却是OtherServlet中的内容。并且成功地显示出在UseForward 中存储在request 中的message 属性的属性值。
相关推荐