《Spring实战》读书笔记--SpringMVC之forward与redirect

1.forward与redirect介绍


1.1 redirect
重定向,服务器收到请求后发送一个状态码给客户端,让客户端再重新请求,并且第一次请求中Request里的数据消失。所以redirect相当于客户端向服务器发出两次请求,第一次请求的数据不会转发给第二次请求,URL地址会变化两次。

1.2 forward
转发(前往),服务器内部的重定向,在Servlet中通过RequestDispatcher转发给另一个程序处理请求,请求的数据依然在。所以forward相当于客户端向服务器发送一次请求,服务器处理两次,请求数据不会消失且URL地址只变化一次。

2.Servlet与SpringMVC中的forward与redirect


2.1 Servlet中的forward与redirect
Servlet中的HttpServletResponse类中有sendRedirect(String location)方法直接重定向到URL为location的地址。
应用:

 1 @WebServlet(name="deleteOneServlet",urlPatterns="/deleteOne.action")
 2 public class DeleteOneServlet extends HttpServlet{
 3     private static final long serialVersionUID = 1L;
 4     private ContentService contentService = new ContentService();
 5     @Override
 6     protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
 7     // 从页面中获取数据
 8     String id = req.getParameter("id");
 9     // 调用Servive执行业务逻辑
10     contentService.deleteOne(id);
11     // 重定向
12     resp.sendRedirect("/list.action");
13     }
14 }

Servlet可以通过HttpServletRequest类的getRequestDispatcher(String path)获得RequestDispatcher对象,该通过该对象的forward(ServletRequest request, ServletResponse response)方法转发请求与相应给任何资源(如Servlet、HTML file、JSP file)。
RequestDispatcher类的API

 1 package javax.servlet;
 2 public interface RequestDispatcher{
 3     public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException;
 4     public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException;
 5 }
 6 API上的介绍:
 7 Defines an object that receives requests from the client and sends them to any resource (such as a servlet, HTML file, or JSP file) on the server.
 8 The servlet container creates the RequestDispatcher object, which is used as a wrapper around a server resource located at a particular path or given by a particular name.
 9
10 This interface is intended to wrap servlets, but a servlet container can create RequestDispatcher objects to wrap any type of resource.

应用:

 1 @WebServlet(name="query",urlPatterns="/query.action")
 2 public class QueryServlet extends HttpServlet{
 3     private static final long serialVersionUID = 1L;
 4     private ContentService contentService = new ContentService();
 5     @Override
 6     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 7     // 从页面获取参数
 8     String command = req.getParameter("command");
 9     String description = req.getParameter("description");
10     // 调用Service处理业务逻辑
11     List<Message> messages = contentService.query(command, description);
12     // 向页面传递值
13     req.setAttribute("messages", messages);
14     req.setAttribute("command", command);
15     req.setAttribute("description", description);
16     // 转发到视图中
17     req.getRequestDispatcher("/WEB-INF/jsp/back/list.jsp").forward(req, resp);
18     }
19 }

2.2 SpringMVC中的Servlet
SpringMVC是基于Servlet的Web MVC框架,所以forward与redirect的处理结果一样,方式更为简单。SpringMVC中的InternalResourceViewResolver视图解析器会识别redirect与forward关键字,然后处理。
应用:

 1 @Controller
 2 @RequestMapping(value="/springMVC")
 3 public class UserController {
 4     @RequestMapping(value="/login")
 5     public String login() {
 6         return "login";
 7     }
 8
 9     @RequestMapping(value="/upload", method=RequestMethod.POST)
10     public String fileUpload(@RequestPart(value="file") MultipartFile multipartFile) throws Exception{
11         String path = "E:/java/fileupload/" + multipartFile.getOriginalFilename();
12         multipartFile.transferTo(new File(path));
13         // 重定向
14         return "redirect:/springMVC/index";
15         // 转发
16         return "foward:/springMVC/index";
17     }
18 }

3. SpringMVC重定向传递数据


从上面我们可以看出redirect不能传递数据,但我们可以使用其它方案传递数据。主要有:

  • 通过URL模板以路径变量或查询参数形式传递数据
  • 通过flash属性传递数据

3.1 通过URL模板进行重定向
方式如下:

 1 @Controller
 2 @RequestMapping(value="/springMVC")
 3 public class UserController {
 4     @RequestMapping(value="/index/{name}",method=RequestMethod.GET)
 5     public String index(@PathVariable(value="name") String name,
 6             @RequestParam(value="id") int id) {
 7         System.out.println(name + id);
 8         return "login";
 9     }
10
11     @RequestMapping(value="/data/{id}",method=RequestMethod.GET)
12     public String data(@PathVariable(value="id") int id, Model model) {
13         model.addAttribute("id", id);
14         model.addAttribute("name", "Tom");
15         return "redirect:/springMVC/index/{name}";
16     }
17 }

使用模板方式时,若使用了占位符则变为路径参数,否则变为请求变量。所以以上重定向URL路径变为"/springMVC/index/Tom?id=5"。
该方法简单有效,但传递数据值简单,若数据复杂则可使用下面的方式传递数据

3.2 使用flash属性
Spring提供了RedirectAttributes设置flash属性的方法重定向传递参数。
原理:在重定向执行之前,所有的flash属性会复制到session中。在重定向后,放在Session中的flash属性会被取出,放到Model中。注:RedirectAttributes类继承自Model类。
方式如下:

 1 @Controller
 2 @RequestMapping(value="/springMVC")
 3 public class UserController {
 4     @RequestMapping(value="/index",method=RequestMethod.GET)
 5     public String index(User user) {
 6         System.out.println(user);
 7         return "login";
 8     }
 9
10     @RequestMapping(value="/data/{id}",method=RequestMethod.GET)
11     public String data(@PathVariable(value="id") int id, RedirectAttributes model) {
12         User user = new User(id,"Tom");
13         model.addFlashAttribute("user", user);
14         return "redirect:/springMVC/index";
15     }
16 }

4.References

http://blog.csdn.net/tenor/article/details/4077079

转载于:https://www.cnblogs.com/maying3010/p/6682582.html

《Spring实战》读书笔记--SpringMVC之forward与redirect相关推荐

  1. Spring实战读书笔记 高级装配(1)

    一.条件化装配 1. 当你希望你的bean在特殊条件下才能装配时,比如在声明了特定的bean时,或者配置了特定的环境变量的时候.那么就可以使用 @Conditional注解,可以用在 @Bean注解下 ...

  2. Spring4实战读书笔记

    Spring4实战读书笔记 首先,我们需要明白,为什么我们需要引入Spring,也就是说Spring的好处.个人觉得主要是在于两方面解耦和对bean的管理. 第一部分:Spring核心 共分为四个章节 ...

  3. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类 1.教育工具 2.生活工具 3.社交应用 4.定位工具 5.游戏 6.报纸和杂志的阅读器 7.移动办公应用 8.财经工具 9.手机购物应用 10.风景区相关 ...

  4. Go语言实战读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...

  5. 机器学习实战---读书笔记: 第11章 使用Apriori算法进行关联分析---2---从频繁项集中挖掘关联规则

    #!/usr/bin/env python # encoding: utf-8''' <<机器学习实战>> 读书笔记 第11章 使用Apriori算法进行关联分析---从频繁项 ...

  6. Apache Kafka实战读书笔记(推荐指数:☆☆☆☆☆)

    Apache Kafka实战读书笔记(推荐指数:☆☆☆☆☆) 认识AK 快速入门 安装和启动 小案例 消息引擎系统 消息引擎范型 AK的概要设计 吞吐量/延时 消息持久化 负载均衡和故障转移: 伸缩性 ...

  7. 老男孩shell实战读书笔记 (6-10章节)

    老男孩shell教程 (6-10章节) shell脚本的条件测试与比较 在bash编程中,条件测试常用的语法形式如下表: 说明⚠️: 语法1中的test命令和语法2中的[]是等价的. 语法3中的[[] ...

  8. Spring揭秘 读书笔记 三 bean的scope与FactoryBean

    本书可作为王富强所著<<Spring揭秘>>一书的读书笔记  第四章 BeanFactory的xml之旅 bean的scope scope有时被翻译为"作用域&quo ...

  9. [原创]Maven实战-读书笔记

    Maven读书笔记  Maven读书笔记 依赖 快捷键:Alt+Shift+X M 使用ArcheType来创建Maven项目骨架: Maven中坐标的定义 依赖范围 依赖传递 依赖调解 可选依赖 ...

最新文章

  1. 【运维学习笔记】在 vSphere Client上创建新的虚拟机
  2. Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll
  3. 使用ildasm和ilasm修改dll
  4. 《计算机组成原理》_学习笔记(二)
  5. 八、后台与数据库(IVX 快速开发教程)
  6. html5游戏制作入门系列教程(二)
  7. 如果苹果公司允许其他手机厂商使用iOS系统,对苹果公司来说会有什么好处?
  8. 重磅:达摩院医疗AI团队CVPR'20论文解读 | 凌云时刻
  9. UML——实现图(构件图与部署图)
  10. 永恒之塔4.0单机MYSQL,永恒之塔数据库
  11. linux主机名hostname老是被更改为broad原理分析和恢复
  12. 基于Python的指数基金量化投资——指数基金估值榜
  13. 女版乔布斯的覆灭,这是今年我听过最唏嘘的真人故事
  14. 大数据Hadoop之——任务调度器Azkaban(Azkaban环境部署)
  15. 华为ICT学院2.0计划发布,未来5年培养全球200万ICT人才
  16. 在python中get是什么意思_python get函数有什么作用?示例解析
  17. 一次精彩的皮卡车降噪试验过程
  18. 摄影的工作原理:相机,镜头等
  19. DataType 数据类型
  20. 【Benewake(北醒) 】中距 TF02-Pro 40m介绍以及资料整理

热门文章

  1. 深度学习搞docker真的搞的我心态炸裂
  2. 区块链——配置和使用geth
  3. Head First JSP---随笔九(部署Web应用)
  4. Java8新特性之函数式接口
  5. UNIX再学习 -- 错误和警告
  6. 日常生活 -- 感悟
  7. 详解网络摄像机中的IR-CUT
  8. python 打开文件,读取文件内容
  9. Double Free浅析
  10. oracle 连续5分钟_3-1!10分钟3球杀入前四,连续5个客场大逆转,名字叫曼联