控制器的响应: 【转发】在转发过程中,客户端只发出过1次请求!在浏览器的地址栏中,也只会显示第1次请求的路径!转发是在服务器内部完成的,可以传递数据! 【重定向】当服务器响应重定向时,客户端会发出第2次请求!最终,在浏览器的地址栏中,会显示第2次请求的路径!由于是2次不同的请求,基于Http协议是无状态协议,没有经过特殊处理(Session/Cookie/数据库存取……)的数据是无法在2次请求之间传递的! 至于常见的响应码,这里就不列举了,相信大家都可以通过网络资源整理出来…… 数据的转发: 【不推荐】将转发的数据封装在HttpServletRequest对象中 可以为处理请求的方法添加HttpServletRequest request参数,当需要转发数据时,将数据封装在request中即可,后续也不需要显式的执行转发,在SpringMVC的控制器中,默认的响应方式就是转发。 @RequestMapping("handle_reg.com") public String handleReg(User user, HttpServletRequest request) { // 假定输入的用户名已经被占用 // 提示:您输入的用户名XXX已经被占用 request.setAttribute("msg","您输入的用户名" + user.getUsername() + "已经被占用!"); // 返回视图名,也可以理解为文件的文件名 return "error"; // 页面:/WEB-INF/error.jsp } JSP代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!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=UTF-8"> <title>Error Message</title> </head> <body> <h1> ${msg } </h1> </body> </html> 【不推荐】使用ModelAndView 可以将处理请求的方法的返回值设置为ModelAndView类型,该类型的常用构造方法有: ModelAndView() ModelAndView(String viewName) ModelAndView(String viewName, Map<String, ?> model) 当需要转发数据时,可以使用以上3种中的最后一种: @RequestMapping("handle_reg.com") public ModelAndView handleReg(String username) { String viewName = "error"; Map<String, Object> model = new HashMap<String, Object>(); model.put("msg","[2] 您输入的用户名" + username + "已经被占用!"); ModelAndView mav = new ModelAndView(viewName, model); return mav; } 由于这种方式使用相对比较复杂,所以,一般不推荐使用这种做法! 【推荐】使用ModelMap封装需要转发的数据 使用ModelMap的流程与使用HttpServletRequest完全相同,即:方法的返回值依然使用String类型,在方法中声明该参数,然后在方法体中直接封装数据,最后,返回视图名: @RequestMapping("handle_reg.com") public String handleReg(String username,ModelMap modelMap) { modelMap.addAttribute("msg","[3] 您输入的用户名" + username + "已经被占用!"); return "error"; } 小结 在SpringMVC中,转发数据共有3种做法, 第1种使用HttpServletRequest的做法简单直接.但是,并不推荐这样处理,主要是因为框架已经帮我们处理了request需要执行的任务,而我们在编写代码时应该尽量不干预框架的处理过程。 第2种使用ModelAndView,是框架的核心处理方式.但是,因为使用方式过于麻烦,所以,也不推荐这样使用。 第3种使用ModelMap,使用简洁,推荐使用。 附:重定向 在SpringMVC中,当需要重定向时,首先,应该保证处理请求的方法的返回值是String类型(与转发一样),然后,返回值使用redirect:作为前缀即可,例如: @RequestMapping("handle_reg.com") public String handleReg() { // 假设注册成功,需要登录 return "redirect:login.do"; } 需要注意的是:在redirect:右侧的不是视图名,而是重定向的目标的路径,可以是绝对路径,也可以是相对路径。 当处理的请求的返回值类型是String时,如果返回值使用redirect:作为前缀,是重定向,否则,是转发!
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦