一、请求转发
请求转发:是一种在服务器内部的资源跳转方式
。
假设要完成一项非常复杂的操作,我们访问AServlet类来完成,但仅让AServlet类中的一个方法来完成这项复杂操作并不合理。类的功能尽量单一细化,所以我们定义两个类AServlet和BServlet,当AServlet执行完后跳转到BServlet。这就是资源跳转的方式。
(1)请求转发的步骤
1.通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path);
2.通过requestDispatcher对象的forward方法进行转发:forward(ServletRequest request,ServletResponse response);
(2)request请求转发的特点☆
- ①浏览器地址栏路径不发生变化。
- ②只能转发到当前服务器内部资源中。
- ③转发是一次请求。
二、数据共享
(1)request域对象
域对象:一个有作用范围的对象,可以在范围内共享数据。
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据。
(2)提供的方法
void setAttribute(String name,Object obj) | 存储数据 |
Object getAttribute(String name) | 通过键获取值 |
removeAttribute(String name) | 通过键移除键值对 |
三、演示请求转发与数据共享
写两个类分别继承HttpServlet,在RequestDemo7中转发到RequestDemo8。
package com.hudie.web.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 类说明:
* 请求转发演示
* @author qianliangguo
*/
@WebServlet("/requestDemo7")
public class RequestDemo7 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo7...");
request.setAttribute("msg", "hello");
//转发到Demo8资源
//先获得请求转发器对象,再通过对象的forward方法转发
request.getRequestDispatcher("/requestDemo8").forward(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
package com.hudie.web.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 类说明:
* 请求转发演示
* @author qianliangguo
*/
@WebServlet("/requestDemo8")
public class RequestDemo8 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("Demo8...");
Object msg = request.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
}
地址栏http://localhost:8080/Servlet&http&request/requestDemo7
访问RequestDemo7后自动转发到了RequestDemo8: