使用Servlet进行页面跳转的两种方式
最近在一位朋友在学习JavaWeb相关的技术,刚好学到Java当中的Servlet,一个服务端的小程序。
在学习使用Servlet如何进行页面跳:一种方式是使用请求转发进行页面跳转,一种方式
是使用响应重定向。下面就来分别聊一聊这两种页面跳转方式。
首先有一个知识点需要注意,如果页面中的静态资源是放在web目录下,但不是在WEB-INF目录下,
则可以通过项目根路径 + 静态资源名称就可以直接访问。如下图所示,
如果是是将页面放在WEB-INF下面,则不能直接访问。
如下图所示,
WEB-INF下面的资源文件就需要通过Servlet去访问。
第一种方式,通过请求转发到某个页面,示例代码如下
@WebServlet("/toTest")
public class RequestForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// (1)请求的页面是直接放在 web 目录下,则可以直接写
// req.getRequestDispatcher("/test.html").forward(req, resp);
// (2)请求的页面是是放在 WEB-INF 目录下,则路径需要加上 WEB-INF 这一级路径
req.getRequestDispatcher("WEB-INF/test2.html").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
forward()方法更改为include方法效果是一样的,访问效果如下。
第二种方式是使用响应重定向,示例代码如下
@WebServlet("/toRedirect")
public class ResponseSendRedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// (1)跳转到外部服务器
// resp.sendRedirect("http://www.jd.com");
// (2)在内部服务器跳转,使用全路径
// resp.sendRedirect("http://localhost:8082/chapterNine/toTest");
// (3)在内部服务器跳转,使用简化写法,页面资源在web 目录下
// resp.sendRedirect(req.getContextPath() + "test.html");
// (4)在内部服务器跳转,使用简化写法,页面资源在WEB-INF 目录下,则需要重定向到另外一个Servlet,通过另外一个Servlet 去访问页面
resp.sendRedirect(req.getContextPath() + "/toTest");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
测试结果如下,
两种页面跳转方式的区别:
(1)请求转发是一次请求-响应;响应重定向是两次请求-响应,相当于发起一次新的请求。
(2)请求转发地址栏地址不会发生改变;响应重定向的地址栏会发生改变。
(3)请求转发只能在当前服务器内部进行;响应重定向可以在在服务器内部进行,也可以重定向到外部服务器,比如百度、京东、淘宝等等。
(4)请求转发,request中的数据可以传递到下一个页面;响应重定向,request中数据会丢失。