什么是请求的转发?
请求转发是指,服务器收到请求后,从一个服务器资源跳转到另一个服务器资源的操作叫做请求转发。
请求转发的特点
1、浏览器地址栏没有变化
2、它们是一次请求
3、它们共享Request域中的数据。在Servlet1中把数据保存到request对象中,也就是用setAttribute,然后又把request对象传到Servlet2中去使用,forward 把这东西传进去,那Servlet2中的request就是那边传过去的,所以域数据是一样的,所以它们的请求参数都一样。
4、可以转发到WEB-INF目录下,我们的工程名是映射到web目录,到了web目录以后,有WEB-INF,将一个网页放到WEB-INF下是不能访问的,我们要怎样才能 进行访问?我们可以使用请求转发,它可以进去,那么就可以这样写:
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/form.html");
5、不能访问工程以外的资源。
这里我们创建两个Servlet。
package com.servlet.one;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求的参数(办事的材料) 查看
String username = request.getParameter("username");
System.out.println("在Servlet1(柜台1)中查看参数(材料):"+username);
//给材料盖一个章,并传递到Servlet2(柜台2)去查看
request.setAttribute("key","柜台1的章");
//问路:Servlet2(柜台2)怎么走
/**
* 请求转发必须要以斜杆打头,/ 斜杆表示地址为:http://ip:port/工程名/,映射到IDEA代码的web目录
*/
// RequestDispatcher requestDispatcher = request.getRequestDispatcher("servlet2");
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/form.html");
//走向Servlet2(柜台2)
requestDispatcher.forward(request,response);
}
}
package com.servlet.one;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取请求的参数(办事的材料) 查看
String username = request.getParameter("username");
System.out.println("在Servlet2(柜台2)中查看参数(材料):"+username);
//查看柜台1是否有盖章
Object key = request.getAttribute("key");
System.out.println("柜台1是否有章:"+key);
//处理自己的业务
System.out.println("Servlet2处理自己的业务");
}
}
这里要注意,我们把前端页面放到WEB-INF下面是不能访问的,我们可以利用请求转发来访问
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/WEB-INF/form.html");
还有一个就是,请求转发只能访问工程内的资源,不能访问工程外的资源。我们可以试一下请求转发到百度。
你给的地址,它是给到当前工程下去访问了,它不允许我们出站,请求转发只能在自己工程进行跳转。