生活中常常会遇到这样的例子,例如打电话找某个单位的某个人,一般电话会呼叫到单位的总台,然后总台会根据我们提供的分机号转接到对应的分机最后我们就能进行正常的通话,其实这就又一个电话先到总机,总机再到分机的过程,这个过程我们称之为电话的转接。
其实在互联网中也会遇到类似的情况:浏览器首先发请求发送到ServletA,ServletA进过处理之后把请求传递到ServletB,由ServletB进行继续处理最后输出响应,这个传递的过程称之为请求转发。
其实在ServletA在调用请求转发的过程中,对于浏览器来说是透明的,浏览器并不知道为其服务的ServletA已经转化为ServletB,对于浏览器来说只是发出了一个请求然后获得一次响应。
在请求转发的过程中,浏览器的URL地址是不会变的。
public class ServletForward extends HttpServlet { public void init() throws ServletException { System.out.println("init method"); } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.创建转发对象:获取转发对象,这个转发对象的参数为需要转发到下个Servlet的路径, //可以填mapping元素的url-pattern对应的地址 RequestDispatcher rd = req.getRequestDispatcher("/forwardExample"); //ServletContext对象获取转发对象:1.getNamedDispatche() //getNamedDispatche()参数为对象Servlet的名称,即是mapping元素的Servlet-name的名称 rd1 = this.getServletContext().getNamedDispatcher( "ServletForwardExample"); //ServletContext对象获取转发对象:1.getRequestDispatcher() //getRequestDispatcher(),参数只能填绝对路径 rd2 = this.getServletContext().getRequestDispatcher("/forwardExample"); //2.进行转发,需要把当前的request对象与response对象转发出去,这样forwardExample才能获取到request与response对象 rd.forward(req, resp); } } ServletForwardExample: public class ServletForwardExample extends HttpServlet { public void init() throws ServletException { System.out.println("init method"); } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); //获取一个user的参数 String user = req.getParameter("user"); //把对应的user打印 PrintWriter writer = resp.getWriter(); writer.println("<html>"); writer.println("<head><title>转发示例</title></head>"); writer.println("<body>"); writer.println("<p>用户名:" + user + "</p>"); writer.println("</body>"); writer.println("</html>"); writer.close(); } }
<servlet> <servlet-name>ServletForward</servlet-name> <servlet-class>类路径.ServletForward</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletForward</servlet-name> <url-pattern>/forward</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletForwardExample</servlet-name> <servlet-class>类路径.ServletForwardExample</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletForwardExample</servlet-name> <url-pattern>/forwardExample</url-pattern> </servlet-mapping> <h2> 请求重定向导入部分:</h2>
平时上网的时候访问某些网站都有一个用户登录的流程,其实就是用户发送一个登陆请求,然后服务器端返回一个登陆响应,在登陆验证完成之后,浏览器通常会跳转到另外一个页面,并且浏览器的地址栏也改变了,我们只做了一次请求,会出现另外一个页面。
public class ServletRedirect extends HttpServlet { public void init() throws ServletException { System.out.println("init method"); } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //sendRedirect()参数需要注意,请求重定向可以定向到这个站点的其他web资源,使用绝对路径时, //要把当前web资源</span>加入进来,简单起见,使用相对路径(mapping元素下的相对路径) resp.sendRedirect("redirectExample"); } } ServletRedirectExample: public class ServletRedirectExample extends HttpServlet { public void init() throws ServletException { System.out.println("init method"); } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=UTF-8"); //注意这里与请求转发的区别,请求转发是同一个请求和同一个响应的转发 //请求重定向是两次请求,两次转发,这里的请求和响应不是同一个 //下面将获取不到user对象的值,即为null String user = req.getParameter("user"); PrintWriter writer = resp.getWriter(); writer.println("<html>"); writer.println("<head><title>转发示例</title></head>"); writer.println("<body>"); writer.println("<p>用户名:" + user + "</p>"); writer.println("</body>"); writer.println("</html>"); writer.close(); } }
<servlet> <servlet-name>ServletRedirect</servlet-name> <servlet-class>com.netease.server.example.web.controller.ServletRedirect</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletRedirect</servlet-name> <url-pattern>/redirect</url-pattern> </servlet-mapping> <servlet> <servlet-name>ServletRedirectExample</servlet-name> <servlet-class>com.netease.server.example.web.controller.ServletRedirectExample</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletRedirectExample</servlet-name> <url-pattern>/redirectExample</url-pattern> </servlet-mapping>
如果想重定向到当前的web资源则填写相对路径,如果想重定向到其他web资源就填写绝对路径。