回顾: 关于跳转之前就强调过有两种:
1. 客户端跳转: 地址栏跳转之后改变,而且无法传递request范围的属性,是在所有的操作执行完毕之后才发生跳转的操作,语法:request.sendRedirect()
2.服务器端跳转: 地址栏不改变,而且可以传递request范围的属性,属于无条件跳转,只要执行到了,则立刻执行跳转的操作。 语法:<jsp:forward>
Servlet之中也是可以完成跳转的,而且既然Servlet本身已经存在了HttpServeltResponse对象,所以直接通过此对象的sendRedirect()方法可以完成跳转操作。
客户端跳转
- package ServletDemo;
- import java.io.IOException;
- import javax.print.attribute.standard.Sides;
- import javax.servlet.*;
- import javax.servlet.http.*;
- public class kehuduanTiaozhuan extends HttpServlet { //继承HttpServlet
- public void doGet(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{ //处理服务
- req.getSession().setAttribute("name", "赵玉强");
- req.setAttribute("info","zhaoyuqiang.blog.51cto.com");//设置属性
- resp.sendRedirect("get_info.jsp");//设置跳转的页面
- }
- public void doPost(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{ //处理POST请求
- this.doGet(req, resp); //调用doGet()方法
- }
- }
- get_info.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发</title>
- </head>
- <body>
- <% request.setCharacterEncoding("utf-8");%>
- <h2>session属性:<%=session.getAttribute("name") %></h2>
- <h2>request属性:<%=request.getAttribute("info") %></h2>
- </body>
- </html>
在web.xml中的配置如下:
- <servlet>
- <servlet-name>tiaozhuan</servlet-name>
- <servlet-class>ServletDemo.kehuduanTiaozhuan</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>tiaozhuan</servlet-name>
- <url-pattern>/jsp/kehuduanTiaozhuanTest</url-pattern> //之所以加上/jsp,是因为我们 的get_info.jsp文件在jsp文件夹之下。
- </servlet-mapping>
在浏览器中 http://localhost:8080/test/jsp/kehuduanTiaozhuanTest
现在看一下浏览器的地址栏,已经变成了http://localhost:8080/test/jsp/get_info.jsp,
也就是说现在的地址栏发生了改变。
此时,执行完成之后,可以发现已经将session的属性的内容进行了传递,但是request属性范围并没有传递,因为客户端跳转根本就无法完成request属性的跳转
服务器端跳转
服务器端的跳转比客户端的跳转稍微麻烦一点,因为在Servlet中没有<jsp:forward>的指令,所以要想执行服务器端跳转的话,就必须依靠RequestDispatcher接口来完成,此接口提供了两个方法如下下图:
使用RequestDispatcher接口的forward()方法就可以完成跳转功能的实现,但是如果想要使用此接口还需要使用ServletRequest接口提供的如下方法进行实例化
但是现在的一个问题是RequestDispatcher是一个接口,那么如果要想使用此接口必须为其进行接口的对象实例化操作,但是此时只能依靠ServletRequest接口才可完成。
RequestDispatcher getRequestDispatcher(String path)
- package ServletDemo;
- import java.io.IOException;
- import javax.print.attribute.standard.Sides;
- import javax.servlet.*;
- import javax.servlet.http.*;
- public class fuwuduanTiaozhuan extends HttpServlet { //继承HttpServlet
- public void doGet(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{ //处理服务
- req.getSession().setAttribute("name", "赵玉强");
- req.setAttribute("info","zhaoyuqiang.blog.51cto.com");//设置属性
- //实例化RequestDispatcher对象,同时指定跳转路径
- RequestDispatcher rd=req.getRequestDispatcher("get_info.jsp");
- rd.forward(req, resp);//服务器跳转
- }
- public void doPost(HttpServletRequest req,HttpServletResponse resp)
- throws ServletException,IOException{ //处理POST请求
- this.doGet(req, resp); //调用doGet()方法
- }
- }
- <servlet>
- <servlet-name>tiaozhuan</servlet-name>
- <servlet-class>ServletDemo.fuwuduanTiaozhuan</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>tiaozhuan</servlet-name>
- <url-pattern>/jsp/fuwuduanTiaozhuanTest</url-pattern>
- </servlet-mapping>
get_info.jsp的内容不变。
在地址栏中输入路径: http://localhost:8080/test/jsp/fuwuduanTiaozhuanTest
运行之后看一下地址栏,发现地址并没有发生改变。这就是服务器端的跳转。
对于这两个应该用哪一种跳转,很明显,如果要用到传递request对象的时候一般都会用服务端跳转,传递session和application等的时候就用客户端跳转比较好。
服务器端跳转在开发中至少占到了95%,所以服务器端的跳转是个重点内容。