Web资源收到客户端获取RequestDispatcher对象的方法方法及方法介绍
优采云 发布时间: 2021-08-18 23:05Web资源收到客户端获取RequestDispatcher对象的方法方法及方法介绍
当一个Web资源收到客户端的请求时,如果想让服务器通知另一个资源来处理请求,那么可以通过RequestDispatcher接口的一个实例对象来实现。 ServletRequest接口定义了获取RequestDispatcher对象的方法,如表1所示。
表1获取RequestDispatcher对象方法声明函数说明的方法
RequestDispatcher getRequestDispatcher(字符串路径)
返回封装了某个路径指定的资源的RequestDispatcher对象。其中,参数路径必须以“/”开头,用于表示当前Web应用程序的根目录。需要注意的是,WEB-INF 目录的内容对于 RequestDispatcher 对象也是可见的。所以传递给getRequestDispatcher(String path)方法的资源可以是WEB-INF目录下的一个文件
获取RequestDispatcher对象后,最重要的工作就是通知其他Web资源处理当前的Servlet请求。为此,RequestDispatcher 接口定义了两个相关的方法,如表 2 所示。
表2 RequestDispatcher接口的方法声明函数说明
forward(ServletRequest 请求,ServletResponse 响应)
此方法用于将请求从 Servlet 传递到另一个 Web 资源。在 Servlet 中,您可以对请求进行初步处理,然后通过调用该方法将请求传递给其他资源进行响应。需要注意的是,这个方法必须在响应提交给客户端之前调用,否则会抛出IllegalStateException
include(ServletRequest 请求,ServletResponse 响应)
该方法用于收录其他资源作为当前响应内容
请求转发在 RequestDispatcher 接口中。 forward()方法可以实现请求转发,include()方法可以实现请求收录。本节以请求转发为例讲解forward()方法的使用。
在Servlet中,如果当前Web资源不想处理请求,可以通过forward()方法将当前请求传递给其他Web资源进行处理。这种方法称为请求转发。请求转发的工作原理如图1所示。
从图1可以看出,当客户端访问Servlet1时,可以通过forward()方法将请求转发到其他Web资源。其他Web资源处理完请求后,直接将响应结果返回给客户端。
了解了forward()方法的工作原理后,下面通过一个案例来演示forward()方法的使用。在servletDemo02项目的com.mengma.request包中创建一个名为RequestForwardServlet的Servlet类。该类使用 forword() 方法将请求转发到一个新的 Servlet 页面,如下所示。
图 1 forward() 方法的工作原理
package com.mengma.servlet;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class RequestForwardServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setAttribute("username", "张三"); // 将数据存储到request对象中
RequestDispatcher dispatcher = request.getRequestDispatcher("/ResultServlet");
dispatcher.forward(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
doGet(request,response);
}
}
在RequestForwardServlet中,通过forward()方法,将当前的Servlet请求转发到ResultServlet页面,在com.mengma.request包中写入了一个名为ResultServlet的Servlet类。该类用于获取RequestForwardServlet类中的存储,输出request对象中的数据,ResultServlet类的代码实现如下所示。
package com.mengma.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResultServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String username = (String) request.getAttribute("username");
if (username != null) {
out.println("用户名:" + username + "
");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
启动Tomcat服务器,在浏览器地址栏输入地址:8080/servletDemo02/RequestForwardServlet访问RequestForwardServlet,浏览器显示结果如图2所示。
图 2 运行结果
从图2中可以看出,RequestForwardServlet的请求路径依然显示在地址栏中,但是浏览器在ResultServlet中显示了要输出的内容。这是因为请求转发是在服务器内部发生的一种行为。 RequestForwardServlet 到 ResultServlet 的请求是一个请求,请求属性可以用于请求中的数据共享。