Servlet-页面重定向和请求转发的区别
- 页面重定向
- 请求转发
- 重定向和请求转发的区别
页面重定向
页面重定向是一种将客户端发送到请求之外的新位置的技术。页面重定向通常用于在文档移动到新位置或由于负载均衡时而使用。
将请求重定向到另一个页面的最简单方法是使用响应对象的sendRedirect()方法。以下是此方法:
public void HttpServletResponse.sendRedirect(String location) throws IOException
此方法将响应以及状态代码和新页面位置发送回客户端。我们也可以同时使用setStatus()和setHeader()方法来实现相同的效果:
....
String site = "" ;
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
....
例如:此示例显示servlet如何执行页面重定向到另一个位置:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PageRedirect extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设定回应内容类型
response.setContentType("text/html");
//要重定向的新位置
String site = new String("");
//response.sendRedirect(site);
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
}
}
我创建了一个叫jspStudy的动态页面项目,在web.xml中创建以下条目,并运行该Servlet:
....
<servlet>
<servlet-name>PageRedirect</servlet-name>
<servlet-class>PageRedirect</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PageRedirect</servlet-name>
<url-pattern>/PageRedirect</url-pattern>
</servlet-mapping>
....
现在,使用URL http://localhost:8080/jspStudy/PageRedirect调用此servlet。这将重定向到URL 。
请求转发
请求转发,也是服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,前后页共用一个request,可以通过此来传递一些数据或者session信息:request.setAttribute()
和request.getAttribute()
。
因此请求转发使用request对象:request.getRequestDispatcher(String location).forward(request,response);
,注意:是forward,我把上面示例的重定向更改为请求转发后代码如下:
package servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PageRedirect extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设定回应内容类型
response.setContentType("text/html");
//新位置
String site = new String("");
/*要重定向的
//response.sendRedirect(site);
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site);
*/
//要请求转发
request.getRequestDispatcher(site).forward(request,response);
}
}
然后运行,发现他把要转发的新位置当成项目内的新位置:
如果我把请求转发的新位置换成项目内的页面呢:
//要请求转发
//request.getRequestDispatcher(site).forward(request,response);
request.getRequestDispatcher("index.html").forward(request,response);
我们可以看到,页面跳转成功了,但是地址栏并没有变化。
重定向和请求转发的区别
我们先从上面的例子,总结一下重定向和请求转发的差别:
在代码书写上,重定向为response.sendRedirect(URL);
或response.setStatus(response.SC_MOVED_TEMPORARILY); response.setHeader("Location", URL);
,而请求转发为request.getRequestDispatcher(URL).forward(request,response);
,其他方面上:
\ | 重定向 | 请求转发 |
地址栏 | 改变 | 不变 |
请求次数 | 2次 | 1次 |
转向项目外页面 | 可以 | 不可以 |
项目内目标地址书写 | 相对路径和绝对路径皆可 | 使用相对路径 |
由上面我们可以得出重定向和请求转发的路径问题:
重定向可以识别出我们写的路径是相对路径还是绝对路径,而请求转发会把我们写的路径默认在该项目下的路径。
扩:我们可以用request.getContextPath()
获取项目名。