本文共 6616 字,大约阅读时间需要 22 分钟。
RequestDispatcher 代表请求的派发者。它有2个动作:forward 和 include 。客户端对于任何一个请求,可以根据业务逻辑需要,选择不同的处理办法:
RequestDispatcher 有一个特点,就是浏览器上显示的URL是最先请求的目标资源的URL,不会因为使用了forward、include方法而改变。因此forward和include的调用对于用户来说是透明的。
RequestDispatcher 实质是一个接口,有2个方法分别代表这2个动作。下面一 一介绍。
public interface RequestDispatcher{ public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException; public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException;}
这个方法将请求从一个 Servlet or JSP目标资源 上 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件,这些资源必须是当前Web上下文中的),让其它的资源去生成响应数据。
例如用户请求的是目标资源A,A接受到请求后,转发到B,真正产生响应数据是被转发的资源B,而A只是起个引导转发作用。浏览器的地址栏不会变,依然是A的URL。 这个方法可以允许被请求的目标资源做一些准备工作后,再让转发的资源去响应请求。例如下面的例子1。注意事项:
示例1:一个简单的 MVC演示。Servlet充当控制器,转发到view层的jsp。
User.java
public class User{ private String name; private int age; public String getName(){ return name ; } public void setName( String name ){ this .name = name ; } public int getAge() { return age ; } public void setAge( int age ){ this .age = age ; }}
UsersServlet.java
public class UsersServlet extends HttpServlet { private static final long serialVersionUID = 1L ;protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException , IOException { /*****************一般实际开发这些用户数据都是从数据库查出来的*********/ Listusers = new ArrayList <> (); User u1 = new User () ; u1 .setAge ( 20) ; u1 .setName ( "Bob") ; User u2 = new User () ; u2 .setAge ( 21) ; u2 .setName ( "Tony") ; users .add ( u1) ; users .add ( u2) ; /*********************************************/ request .setAttribute ( "users", users) ; //对request 进制预处理准备工作 request .getRequestDispatcher ( "users.jsp").forward( request , response );//转发到users.jsp,让他去具体响应 } }
users.jsp
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true" session ="true" %><%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core" %>< html>用户列表 -----------------转发到的资源users.jsp产生的响应数据------------------
< c:forEach var ="user" items= " ${users}" >用户姓名:${user.name} 用户年龄:${user.age}
public class AimServlet extends HttpServlet { private static final long serialVersionUID = 1L ; protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException { request .getRequestDispatcher ( "foo.jsp?num=1") . forward( request , response ); }}
foo.jsp
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding ="UTF-8" trimDirectiveWhitespaces= "true" session ="true" %><%@ taglib prefix= "c" uri = "http://java.sun.com/jsp/jstl/core" %>标题 通过forward传递过来的参num=${param.num}
此方法用于包含响应中某个资源(servlet、JSP 页面和 HTML 文件)的内容。
调用者指定一个被包含的资源,将这个包含的资源(JSP,Servlet,HTML)的响应数据包含到自己的响应体中。被包含的数据是在服务器上经过运行产生的,因此是动态包含,而不同于JSP中的include指令,它是JSP转译期的静态包含,类似于C语言中的宏一样。这个过程实质是用一个相同的Request再请求一次被包含的资源,将被包含的资源的响应数据包含到原本的资源中去,构成它的响应数据的一部分。
示例1:
TargetServlet.javapublic class TargetServlet extends HttpServlet { private static final long serialVersionUID = 1L ; protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException { response .setContentType ( "text/html;charset=utf-8" ); PrintWriter out = response .getWriter () ; out .println ( "----------来自TargetServlet的告白----------------" ) ; out .print ( "我偷懒了,下面的响应数据并不是我自己产生的,而是包含的其它资源产生的" ) ; request .getRequestDispatcher ( "test.jsp") . include( request , response ); out .flush () ; out .close () ; }}
test.jsp
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true" session = "false"%>------------------------来自test.jsp的告白--------------------------
我输出的响应数据将被其它的资源包含
请的URL是 <%= request.getRequestURL().toString() %> ,可以看出客户端真正请求的不是我,我只是幕后工作者。但我很开心,因为响应给客户端的数据一部分来自于我
同样, JSP中的< jsp:include >标签下的< jsp:param >标签就是通过在含路径后追加QueryString达到的传递参数的效果。
public class TargetServlet extends HttpServlet { private static final long serialVersionUID = 1L ; protected void doGet( HttpServletRequest request , HttpServletResponse response) throws ServletException , IOException { response .setContentType ( "text/html;charset=utf-8" ); PrintWriter out = response .getWriter () ; out .println ( "----------来自TargetServlet的告白----------------" ) ; out .print ( "我偷懒了,下面的响应数据并不是我自己产生的,而是包含的其它资源产生的" ) ; request .setAttribute ( "sharedatt", "I`m shared attribute") ; request .getRequestDispatcher ( "test.jsp?sharedparam=Im-shared-parameter" ). include (request , response ) ; out .flush () ; out .close () ; }}
<%@ page contentType= "text/html; charset=UTF-8" pageEncoding = "UTF-8" trimDirectiveWhitespaces = "true" session = "false"%>------------------------来自test.jsp的告白--------------------------
我输出的响应数据将被其它的资源包含
从request中提取共享的属性Attribute : <%= request.getAttribute("s haredatt") %>
从request中提取共享的参数Parameter : <%= request.getParameter("sharedparam" ) %>
转载地址:http://hnsqb.baihongyu.com/