本文系转载,原文地址:https://blog.csdn.net/m0_37450089/article/details/78703366
 
servlet的请求转发(forward)和重定向(sendRedirect):
请求转发(forward)
用法:request.getRequestDispacther(“/test.jsp”).forword(request,response);
过程:客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的test.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来。整个过程是一个请求,一个响应。
重定向(sendRedirect)
用法:response.sendRedirect(“test.jsp”);
过程:客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问test.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。
了解servlet的页面跳转工作情况之后,下面看看spring mvc如何实现controller之间跳转,与重定向的原理相同。
两者的不同的适用场景:
请求转发只需要请求一次服务器,可以提高访问速度。
重定向可以跳转到任意服务器,可以用在系统间的跳转。
 
1. 请求转发,参数传递可以借助HttpServletRequest来处理,由于是处理同一个请求,所以request对象还是同一个,中文也不会出现乱码现象。
  1. @RequestMapping(“/forward1”)
  2. public String forward1(HttpServletRequest request){
  3. request.setAttribute(”forward”, “请求转发”);
  4. return “forward:forward2.html”;
  5. }
  6. @RequestMapping(“/forward2”)
  7. public String forward2(HttpServletRequest request){
  8. System.out.println(request.getAttribute(”forward”));
  9. return “forward:index.html”;
  10. }
@RequestMapping("/forward1")
public String forward1(HttpServletRequest request){
request.setAttribute("forward", "请求转发");
return "forward:forward2.html";
}
@RequestMapping("/forward2")
public String forward2(HttpServletRequest request){
System.out.println(request.getAttribute("forward"));
return "forward:index.html";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
2. 重定向,参数传递可以直接拼接url也可以使用RedirectAttributes来处理,由于是不同的请求,重定向传递的参数会在地址栏显示,所以传递时要对中文编码进行处理。
  1. @RequestMapping(“/redirect1”)
  2. public String index2(RedirectAttributes attr) throws UnsupportedEncodingException{
  3. attr.addAttribute(”ds”, URLEncoder.encode(“重定向”, “utf-8”));
  4. return “redirect:redirect2.html”;
  5. }
  6. @RequestMapping(“/redirect2”)
  7. public String index22(String ds) throws UnsupportedEncodingException{
  8. System.out.println(URLDecoder.decode(ds, ”utf-8”));
  9. return “index”;
  10. }
@RequestMapping("/redirect1")
public String index2(RedirectAttributes attr) throws UnsupportedEncodingException{
attr.addAttribute("ds", URLEncoder.encode("重定向", "utf-8"));
return "redirect:redirect2.html";
}
@RequestMapping("/redirect2")
public String index22(String ds) throws UnsupportedEncodingException{
System.out.println(URLDecoder.decode(ds, "utf-8"));
return "index";
}

SpringMVC 重定向和请求转发(转载)的更多相关文章

  1. web初学之重定向与请求转发

    重定向与请求转发的问题 (1)RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法. (2 ...

  2. 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

      请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...

  3. 深入浅出Java 重定向和请求转发的区别

    深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...

  4. java重定向与请求转发的区别

    最近工作不算太忙,今天在这里对java中的重定向和请求转发稍作总结,希望能帮助到大家. 请求转发: request.getRequestDispatcher().forward(); 重定向: res ...

  5. 【Servlet】深入浅出JavaServlet重定向和请求转发

    import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax. ...

  6. Struts2中重定向和请求转发配置

    struts2中默认跳转为dispatcher请求转发 只能往jsp转发,跳转action报404 重定向 设置为redirect ,可以是jsp也可以是action <!--同一个包下的act ...

  7. jsp之 ---- 页面重定向和请求转发(笔记之深度说明)

    1.  HttpServletResponse对象的sendRedirect(String location)方法称作重定向. 如果location地址前面加上“/”,则表示  相对于Servlet容 ...

  8. HTTP中的重定向和请求转发的区别

    原文出处:http://blog.csdn.net/meiyalei/article/details/2129120 一.调用方式 我们知道,在servlet中调用转发.重定向的语句如下: reque ...

  9. javaweb中重定向和请求转发(response.sendRedirect()和request.getRequestDispatcher(rul).forward(request,response)))的区别

    先来两张图,方便理解: 可以看出,重定向时,是服务器向游览器重新发送了一个response命令,让游览器再次向url2发送请求,以获取url2的资源 而请求转发时,类似于是服务器自己向自己发了一个跳转 ...

随机推荐

  1. Centos7 安装nginx1.14

    一丶官网 http://nginx.org/en/download.html 至于安装那个版本首先要看清楚版本代表什么意思 Nginx官网提供了三个类型的版本Mainline version:Main ...

  2. CVE-2017-12615和CVE-2017-12616

    Tomcat代码执行漏洞分析测试 1. 漏洞花絮        2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-20 ...

  3. ubuntu yolov2 训练自己的数据集

    项目需求+锻炼自己,尝试用yolov2跑自己的数据集,中间遇到了很多问题,记下来防止忘记 一.数据集 首先发现由于物体特殊没有合适的现成的数据集使用,所以只好自己标注,为了减少工作量,先用opencv ...

  4. Linux双线双网卡双IP双网关设置方法

    机房上架了一台测试机,系统是Ubuntu 9.04 X64的系统,母机IBM X336机器.用户需求是双线,故采用一个网卡配置电信地址,另一个网卡配置联通地址,安装好系统后配置好IP发现联通地址和电信 ...

  5. Delphi调用大漠插件示例

    Delphi XE2 版本调用大漠插件方法:打开Component->Import Component->默认Import a Type Library,点击Next->找到Dm.d ...

  6. __slots__用法

    class Test(object): __slots__ = ("name","age") t = Test() t.name = "老王" ...

  7. Kubernetes Service Account如何生成Token

    Service Account是运行pods用到的帐号,默认是default.如果apiserver启动配置--admission-control=ServiceAccount,Service Acc ...

  8. hash 在 perl 中的用法(转载)

    Perl的数据结构中最有趣的一个特性是哈希(hash),它使得在数据片段之间建立键-值(key-value)关联成为可能.虽然这些哈希要远远比普通系统中以数字索引的数组用途更广,但是往往也会使初学者不 ...

  9. python网页爬虫开发之五-反爬

    1.头信息检查是否频繁相同 随机产生一个headers, #user_agent 集合 user_agent_list = [  'Mozilla/5.0 (Windows NT 6.1; WOW64 ...

  10. nodejs模块循环引用讲解

    CommonJS 模块的重要特性是加载时执行,即脚本代码在require的时候,就会全部执行.一旦出现某个模块被"循环加载",就只输出已经执行的部分,还未执行的部分不会输出. 让我 ...