servlet重定向和转发的区别_session跨页面传值

servlet重定向和转发的区别_session跨页面传值Forward是服务端跳转,浏览器只发起一起请求,服务端接收到浏览器请求后,进行跳转,然后将结果返回至浏览器。浏览器不知道请求在服务端进行了跳转,故浏览器地址栏的地址不变Redirect是浏览器端跳转,浏览器总共发起2次请求,服务端接收到第一次请求后,返回302状态码,浏览器将向响应头中Location属性值中保存的地址再次发起请求。由于是2次请求,故浏览器地址栏的地址会发生变化

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

servlet重定向和转发的区别_session跨页面传值

index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
		"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>index</title>
</head>
<body>
<form action='search' method='post'>
	Key Word<input id='keyWord' name='keyWord' value=''/>
	<input type="submit" value='Search'/>
</form>
</body>
</html>

result.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
		"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>result</title>
</head>
<body>
	Key Word:<%= request.getParameter("keyWord")%><br/>
	The key Word can not be null or have * within it.
</body>
</html>

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_2_5.xsd" 
		id="WebApp_ID" version="2.5">
  <display-name>JSP</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
	  <servlet-name>test</servlet-name>
	  <servlet-class>com.sean.test</servlet-class>
  </servlet>
  <servlet-mapping>
  		<servlet-name>test</servlet-name>
  		<url-pattern>/search/*</url-pattern>
  </servlet-mapping>
</web-app>

test.java:

package com.sean;

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 test extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String keyWord = req.getParameter("keyWord");
		if(keyWord == null || keyWord.equals("") || keyWord.contains("*")){
			req.getRequestDispatcher("result.jsp").forward(req, resp);
		}else{
			//use baidu to search the keyword
			resp.sendRedirect("http://www.baidu.com/s?wd=" + keyWord);
		}
	}     
}

一,Forward

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

servlet重定向和转发的区别_session跨页面传值

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

servlet重定向和转发的区别_session跨页面传值

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

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

servlet重定向和转发的区别_session跨页面传值

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

servlet重定向和转发的区别_session跨页面传值

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

二,Redirect

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

servlet重定向和转发的区别_session跨页面传值

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

servlet重定向和转发的区别_session跨页面传值

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

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

servlet重定向和转发的区别_session跨页面传值

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

servlet重定向和转发的区别_session跨页面传值

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

servlet重定向和转发的区别_session跨页面传值

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

 

今天的文章servlet重定向和转发的区别_session跨页面传值分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/57795.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注