- 请求转发: 服务器内部转发,整个过程处于同一个请求当中。
- 重定向: 浏览器重新发送请求,相当于向服务器端发送了两个请求。
区别:
问题 | 重定向 | 请求转发 |
---|---|---|
第二次请求谁请求的? | 浏览器 | 服务器 |
浏览器发送了几次请求? | 2次以上 | 1次 |
servlet可以共享request吗? | 不可以 | 可以 |
地址栏是否发生改变? | 是 | 否 |
浏览器地址栏显示的哪一次访问地址? | 最后一次 | 第一次 |
可以跳转到什么资源? | 任意资源 | 项目内部 |
第二次的请求路径是? | 绝对路径 | 内部路径 |
是否可以跨域访问? | 可以 | 不可以 |
SpringMVC如何设定重定向和转发?
- 转发:在返回值前面加"
forward:
",比如:forward:user.do?name=method4
- 重定向:在返回值前面加"
redirect:
",比如:redirect:http://www.baidu.com
Servlet如何设定重定向和转发?
- 转发:
request.getRequestDispatcher(user.do?name=method4).forward(request, response)
- 重定向:
response.sendRedirect(http://www.baidu.com)
SpringMVC默认处理方式就是请求转发还是重定向?
在SpringMVC中,处理请求时,默认返回的是View组件的名称,是按照转发进行处理的。
一般我们传值到页面是通过 request.setAttribute("key", value);
方式,所以可以看出默认是请求转发的。
向前端页面提供数据的集中方式:
- 【不推荐】通过HttpServletRequest转发
request.setAttribute("key", value);
- 【不常用】通过ModelAndView转发数据
在ModelAndView
中,Model
表示的就是转发的数据,可以通过ModelAndView(String viewName, Map<String, ?> model)
构造方法封装Model
,而这里Model
的类型就是Map<String, Object>
,代码:
public ModelAndView login(String username, String password) {
// 封装需要转发的数据
Map<String, Object> model= new HashMap<String, Object>();
model.put("username", username);
model.put("password", password);
// 创建返回的对象
ModelAndView mv = new ModelAndView("login", model);
// 执行返回
return mv;
}
- 【推荐】通过ModelMap转发数据
在处理请求的方法中,添加ModelMap
类型的参数,当需要转发数据时,调用它的addAttribute(String name, Object value)
方法即可封装数据,如果需要封装多条数据,则多次调用该方法即可:
public String login(String username, String password, ModelMap modelMap) {
// 转发数据:直接向参数modelMap中封装数据
modelMap.addAttribute("username", username);
// 返回
return "login";
}
运用场景:
Forward:一用于用户登陆的时候,根0角色转发到相应的模块. redirect:一般用于用户注销登
陆时返回主页面和跳转到其它的网站等