JSP中Forward和Redirect之间的区别

为了说明JSP中Forward和Redirect之间的区别,写了一个测试web工程

index.jsp:

[html]  view plain  copy
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   
  4.         "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
  8. <title>index</title>  
  9. </head>  
  10. <body>  
  11. <form action='search' method='post'>  
  12.     Key Word<input id='keyWord' name='keyWord' value=''/>  
  13.     <input type="submit" value='Search'/>  
  14. </form>  
  15. </body>  
  16. </html>  

result.jsp:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"  
  2.     pageEncoding="ISO-8859-1"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   
  4.         "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">  
  8. <title>result</title>  
  9. </head>  
  10. <body>  
  11.     Key Word:<%= request.getParameter("keyWord")%><br/>  
  12.     The key Word can not be null or have * within it.  
  13. </body>  
  14. </html>  

web.xml:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  3.         xmlns="http://java.sun.com/xml/ns/javaee"   
  4.         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"   
  5.         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.                 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"   
  7.         id="WebApp_ID" version="2.5">  
  8.   <display-name>JSP</display-name>  
  9.   <welcome-file-list>  
  10.     <welcome-file>index.jsp</welcome-file>  
  11.   </welcome-file-list>  
  12.     
  13.   <servlet>  
  14.       <servlet-name>test</servlet-name>  
  15.       <servlet-class>com.sean.test</servlet-class>  
  16.   </servlet>  
  17.   <servlet-mapping>  
  18.         <servlet-name>test</servlet-name>  
  19.         <url-pattern>/search/*</url-pattern>  
  20.   </servlet-mapping>  
  21. </web-app>  

test.java:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.sean;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class test extends HttpServlet {  
  11.     private static final long serialVersionUID = 1L;  
  12.       
  13.     @Override  
  14.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  15.             throws ServletException, IOException {  
  16.         String keyWord = req.getParameter("keyWord");  
  17.         if(keyWord == null || keyWord.equals("") || keyWord.contains("*")){  
  18.             req.getRequestDispatcher("result.jsp").forward(req, resp);  
  19.         }else{  
  20.             //use baidu to search the keyword  
  21.             resp.sendRedirect("http://www.baidu.com/s?wd=" + keyWord);  
  22.         }  
  23.     }       
  24. }  
一,Forward

访问测试web工程主页,并在输入框中输入*

点击Search按钮,最终结果如下:

虽然最终显示了result.jsp页面,但是地址栏中的地址是http://127.0.0.1:8080/JSP/search,并不是http://127.0.0.1:8080/JSP/result.jsp

可以判断出Forward属于服务器内部的跳转,浏览器只是发送了请求,显示服务端响应,并不知道请求在服务器端进行了跳转,请求处理流程如下:

可以看到浏览器只发送了一条请求

由于是服务器内部跳转,所以只能跳转至服务器内部已经存在的JSP或servlet,并不能跳转至诸如http://www.baidu.com这样的外部地址

二,Redirect

访问测试web工程主页,并在输入框中输入JSP

点击Search按钮,最终结果如下:

显示了百度搜索结果页面,地址栏中的地址并不是http://127.0.0.1:8080/JSP/search,而是http://www.baidu.com/s?wd=jsp

由于浏览器地址栏的地址发生了变化,可以判断出Redirect属于浏览器端跳转,浏览器在接收到服务器响应后,再次向新的地址发起了请求,请求处理流程如下:

可以看到浏览器发送了2条请求,第一条请求的请求地址为http://127.0.0.1:8080/JSP/search,第二条请求的请求地址为http://www.baidu.com/s?wd=jsp,正是servlet中设置的redirect地址

看一下第一条请求的HTTP响应


可以看到状态码是302,Location是http://www.baidu.com/s?wd=jsp,是不是很清楚了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值