九、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>

 

posted @ 2017-02-14 20:01  爱笑的berg  阅读(228)  评论(0)    收藏  举报