一、. 请求转发:一种在服务器内部的资源跳转方式。比如说一个项目为了维护和分工,不会将所有功能放到一个servlet内,比如有A、B、C,浏览器访问A时,A可以在内部跳转到B、C,这就是内部资源跳转。
(1). 步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
(2). 特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求,通过浏览器中抓包可以看到,浏览器只发送了一次请求。
二. 共享数据:
* 域对象:一个有作用范围的对象,可以在范围内共享数据
* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据。个人理解就是一次请求,如果涉及多个servlet,这些servlet就是一个域对象,可以共享数据。
* 方法:
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
4. 获取ServletContext:
* ServletContext getServletContext()
注意:设置共享数据要放到请求转发前面进行
举例:
ServletDemo08.java
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet("/ServletDemo08")
public class ServletDemo08 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这个可以解决中文的字符乱码问题
request.setCharacterEncoding("utf-8");
System.out.println("demo08...");
//设置共享数据---注意这个要放到转发数据前面
request.setAttribute("msg","hello world!");
//转发数据
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/ServletDemo09");
requestDispatcher.forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
ServletDemo09.java
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
@WebServlet("/ServletDemo09")
public class ServletDemo09 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这个可以解决中文的字符乱码问题
request.setCharacterEncoding("utf-8");
System.out.println("demo09....");
//获取共享数据
Object msg = request.getAttribute("msg");
System.out.println(msg);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
控制台输出:
demo08...
demo09....
hello world!