继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

控制器的响应与数据转发(三)

慕雪血影
关注TA
已关注
手记 9
粉丝 1
获赞 9
控制器的响应:
【转发】在转发过程中,客户端只发出过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:作为前缀,是重定向,否则,是转发!


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP