转发和重定向(servlet+springmvc)

转发和重定向

image002

  • 介绍
转发
请求转发是一种资源的跳转方式,此外重定向也是一种资源的跳转方式

请求转发的特点:

(1)请求转发是一次请求,一次响应

(2)请求转发前后,地址栏地址不会发生变化

(3)请求转发前后,request对象是同一个(域对象)

(4)进行转发的两个资源必须属于同一个Web应用(属于不同web应用的资源之间是不能进行转发的)


重定向
重定向也是一种资源的跳转方式

重定向的特点:

(1)重定向是两次请求,两次响应

(2)重定向前后,地址栏地址会发生变化

(3)重定向前后,request对象不是同一个

(不能使用域对象)

(4)进行重定向的两个资源可以不是同一个Web应用(属于不同web应用的资源之间是可以进行重定向的)
  • 相关面试题

参照网址:https://blog.csdn.net/weixin_36027342/article/details/79809326?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160013237519724839254946%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160013237519724839254946&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-2-79809326.pc_ecpm_v3_pc_rank_v3&utm_term=%E8%BD%AC%E5%8F%91%E5%92%8C%E9%87%8D%E5%AE%9A%E5%90%91%E7%9A%84%E5%8C%BA%E5%88%AB&spm=1018.2118.3001.4187

不管是刚刚开始学习jsp,还是在面试中,转发与重定向的区别,都是一个十分重要的知识点。关于转发与重定向的区别,总结如下:

1.实现
转发:用request的getRequestDispatcher()方法得到ReuqestDispatcher对象,调用forward()方法

request.getRequestDispatcher("other.jsp").forward(request, response);
1
重定向:调用response的sendRedirect()方法

response.sendRedirect("other.jsp");
1
2.地址栏
转发:不变,不会显示出转向的地址
重定向:会显示转向之后的地址

3.请求
重定向:至少提交了两次请求

4.数据
转发:对request对象的信息不会丢失,因此可以在多个页面交互过程中实现请求数据的共享
重定向:request信息将丢失

5.原理
转发:是在服务器内部控制权的转移,是由服务器区请求,客户端并不知道是怎样转移的,因此客户端浏览器的地址不会显示出转向的地址。
重定向:是服务器告诉了客户端要转向哪个地址,客户端再自己去请求转向的地址,因此会显示转向后的地址,也可以理解浏览器至少进行了两次的访问请求。

servlet实现转发和重定向

1.Servetl实现转发

  • 关键方法
使用的是HttpServletRequest对象

request.getRequestDispatcher(转发到资源的URL地址).forward( request, response);

1.1 转发到jsp页面

  • servlet
package com.shaoming.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.shaoming.pojo.Demo;

import cn.hutool.core.collection.CollectionUtil;

/**
 * 
 */
public class ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// >>处理POST请求参数乱码
		request.setCharacterEncoding("utf-8");
		// >>处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		// TODO...
		// 生成一些测试数据,放在list集合中
		List<String> doorList = new ArrayList<>();
		doorList.add("1, 门店1");
		doorList.add("2, 门店2");
		doorList.add("3, 门店3");
		doorList.add("4, 门店4");
		doorList.add("5, 门店5");
		// 把list集合放到request域对象中
		request.setAttribute("list", doorList);
		// request实现转发
		request.getRequestDispatcher("doorList.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

  • jsp页面

forward.jsp

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf8"
    pageEncoding="utf8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>Insert title here</title>
</head>
<body>

    <h3>day10...doorList.jsp...</h3>

    显示所有门店信息: <br/>

    <%

       List<String> list = (List<String>)

                         request.getAttribute("list");

       for( String door : list ){

           out.write( door +"<br/>" );

       }

    %>

</body>
</html>

1.2 转发到html页面

  • servlet
package com.shaoming.servlet;

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 Forward1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//>>处理POST请求参数乱码
		request.setCharacterEncoding("utf-8");
		//>>处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		//TODO...
		request.getRequestDispatcher("/forward.html").forward(request, response);

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
  • html页面

forward.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>我是servlet转发后的html页面</h1>
</body>
</html>

说明:

jsp和html页面放在项目的WebContent目录下

我是用的eclipse,如果用的idea自行查找资料

2.servlet实现重定向

  • 关键方法
使用的是HttpServletResponse对象

response.sendRedirect( 重定向到资源的地址 );

2.1 重定向到本应用的html页面

  • servlet
package com.shaoming.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 测试的url:
 * http://localhost:8080/java-web/RedirectServlet
 */
public class RedirectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//>>处理POST请求参数乱码
		request.setCharacterEncoding("utf-8");
		//>>处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		//TODO...
		/**
		 * redirect.html该html页面是放在本工程的WebContent目录下
		 * 说明:
		 * 我使用的是eclipse,如果是idea,自行百度
		 */
		response.sendRedirect("redirect.html");

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
  • html页面

redirect.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>我是重定向后的html页面</h1>
</body>
</html>

2.2 重定向到本地应用的jsp页面

  • servlet
package com.shaoming.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 测试的url:
 * http://localhost:8080/java-web/RedirectServlet
 */
public class RedirectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//>>处理POST请求参数乱码
		request.setCharacterEncoding("utf-8");
		//>>处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		//TODO...
		/**
		 * redirect.jsp该jsp页面是放在本工程的WebContent目录下
		 * 说明:
		 * 我使用的是eclipse,如果是idea,自行百度
		 */
		response.sendRedirect("redirect.jsp");

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
  • jsp页面

redirect.jsp

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf8"
	pageEncoding="utf8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<title>测试ajax和servlet之间的请求响应</title>
<!-- 引入jQuery使用cdn的方式引入jQuery -->
<script src="http://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script>
</head>
<body>
	<h1>我是重定向后的jsp页面</h1>
</body>
</html>

说明:

jsp和html页面放在项目的WebContent目录下

我是用的eclipse,如果用的idea自行查找资料

2.3重定向到同一个tomcat的另一个javaweb工程的html页面

说明:

同理,也可以是jsp页面,这里就不测试重定向到jsp页面了

  • servlet
package com.shaoming.redirect;

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 RedirectServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// >>处理POST请求参数乱码
		request.setCharacterEncoding("utf-8");
		// >>处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		// TODO...
		/**
		 * 重定向到同一个tomcat的另一个javaweb工程的html页面
		 * 工程名为java-web2
		 */
		response.sendRedirect("/java-web2/redirect.html");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}
  • html页面

redirect.html

说明:

新建一个动态的web工程在eclipse里面

在项目路径下的WebContent目录下新建一个html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>我是javaweb2动态web工程的html页面</h1>
</body>
</html>

2.4重定向到一个网址

  • servlet
package com.shaoming.redirect;

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 RedirectServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//>>处理POST请求参数乱码
		request.setCharacterEncoding("utf-8");
		//>>处理响应正文乱码
		response.setContentType("text/html;charset=utf-8");
		//TODO...
		/**
		这网址是我个人博客网址,欢迎大家来光顾
		*/
        response.sendRedirect("http://www.shaoming.club");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

扫下方二维码,既可以访问我的个人博客主页

myblog

springmvc实现转发和重定向

  • 前提

我用ssm举例,springboot整合不一定是jsp模板引擎

  • 知道springmvc的视图解析配置

    通常实在springmvc-config.xml里面配置,这是springmvc的配置文件

    当然名字可以不一样

    我的配置如下

在同一个controller里面测试转发和重定向

package com.shaoming.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 
 * @ClassName: ForwarAndRedirectController
 * @Description: TODO(这里用一句话描述这个类的作用) 重定向到项目的url
 * 
 *               重定向到jsp页面
 * 
 *               重定向到网址
 * 
 *               通用的page.jsp页面
 * @author shaoming
 * @date 2020年9月15日
 *
 */
@Controller
public class ForwarAndRedirectController {
//重定向到某个网址
	@RequestMapping("/tomyblog")
	public String toMyBolog() {
		/**
		 * 重定向到我的博客网址 欢迎大家光顾
		 */
		return "redirect:http://www.shaoming.club";

	}

	// 到jsp页面
	@RequestMapping("/tojsp")
	public String tojsp() {
		return "hello";

	}

	// 重定向url
	@RequestMapping("/toredirecttojsp")
	public String totojsp() {

		return "redirect:tojsp";
	}
	/**
	 * 重定向到jsp页面
	 */
	@RequestMapping("/redirectjsp")
	public String toredirecthtml() {
        
		return "redirect:/index.jsp";
	}
	// 通用的page页面

	@RequestMapping("/{page}")
	public String totojsp(@PathVariable("page") String page) {

		return page;
	}

	/**
	 * 转发
	 */
	@RequestMapping("/forwardtojsp")
	public String toforwardjsp() {
        
		return "forward:tojsp";
	}
	
}

基于返回字符串
由于返回是字符串,所以mv的设置将没有作用,要用req来传送值
str=”forward : 路径”        请求转发到一个jsp中
str=”forward : controller的映射”  请求转发到一个controller方法中
str=”redirect: 路径”         请求转发到一个非WEB-INF的jsp
常用:
str=”redirect : controller的映射”  重定向到一个controller方法中
str=”XXX”            根据前后缀,请求转发到 前缀/XXX.后缀

dex.jsp";
}
// 通用的page页面

@RequestMapping("/{page}")
public String totojsp(@PathVariable("page") String page) {

	return page;
}

/**
 * 转发
 */
@RequestMapping("/forwardtojsp")
public String toforwardjsp() {
    
	return "forward:tojsp";
}

}


```markdown
基于返回字符串
由于返回是字符串,所以mv的设置将没有作用,要用req来传送值
str=”forward : 路径”        请求转发到一个jsp中
str=”forward : controller的映射”  请求转发到一个controller方法中
str=”redirect: 路径”         请求转发到一个非WEB-INF的jsp
常用:
str=”redirect : controller的映射”  重定向到一个controller方法中
str=”XXX”            根据前后缀,请求转发到 前缀/XXX.后缀
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值