九、Servlet中的转发和重定向
1、web系统中资源跳转的两种方式
1)转发forward request.getRequestDispatcher("/b").forward(request,response);
2)重定向redirect response.sendRedirect(request.getContextPath)+"/b";
2、转发和重定向的相同点和不同点?
不同点:
1)转发是request对象触发的;定向是response对象触发的
2)转发是一次请求,一次请求只求了一个人,浏览器地址栏上地址不会发生变化【/a】;重定向是两次请求,浏览器的地址发生了变化【/a,/b】,重定向的路径需要加webapp的根路径
3)转发是在本项目类完成资源跳转;重定向可以完成跨app跳转资源
相同点:
都可以完成资源的跳转
3、跳转的下一个资源可以是什么?
1)跳转的下一个资源可以是web服务器中任何一种资源,可以是Servlet,也可以 是HTML,也可以使用JSP....
4、什么时候采用转发,什么时候采用重定向?
1)重定向:若想完成跨app跳转,必须使用重定向;重定向可以解决浏览器的刷新问题
2)转发:若在上一个资源中向request范围中存储了数据,希望在下一个资源中从request范围中将数据提取出来,必须使用转发
备注:大部分情况下都使用重定向
5、重定向的原理是什么?
response.sendRedirect("/jd/login");程序执行到以上代码,将请求路径/jd/login反馈给浏览器。
浏览器自动又向web服务器发送了一次全新的请求:/jb/login (浏览器地址栏上最终显示的地址是:/jb/login)
备注:在浏览器上点击一个超链接,到最终网页停下来是一次请求。这句话已经不正确了,因为有重定向机制存在,
点击一个超链接到网页最终停下来,这个过程,可能是多次请求
备注:重定向可以解决页面刷新的问题,因为重新跳转到另外一个页面了
|实例:|
package com.bj;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setAttribute("username", "zhangjunbo");
//转发-->为一次请求
/*转发之后在浏览器地址栏上面地址仍然为:http://localhost:8080/prj-servlet10/a
req.getRequestDispatcher("/b").forward(req, resp);
*/
//重定向执行后共计为2次请求:AServlet请求和BServlet请求
//-->http://localhost:8080/prj-servlet10/b
resp.sendRedirect("/prj-servlet10/b");
}
}
package com.bj;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//从request范围中取数据
Object obj=req.getAttribute("username");
//在控制台进行输出:
System.out.println(obj);
//在浏览器上面进行显示:
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
out.print("获取的对象为"+obj);
}
}
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>prj-servlet10</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>a</servlet-name>
<servlet-class>com.bj.AServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>a</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>b</servlet-name>
<servlet-class>com.bj.BServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>b</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
</web-app>
index.xml文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/prj-servlet10/a">测试转发与重定向</a>
</body>
</html>