请求转发与请求重定向
请求转发与请求重定向
forward: 表示转发
redirect: 表示重定向
forward 和 redirect 都是关键字, 有一个共同的特点不和视图解析器一同工作
相关信息
forward 和 redirect 他们都可以访问视图文件, 比如某个 jsp, html
forward:/hello.jsp forward:/main.html
forward 和 redirect 他们都可以访问其它的 controller
forward:/some.do , redirect:/other.do
处理器方法可以返回 ModelAndView, String, void 时, 都可以使用 forward, redirect
请求转发
处理器方法返回 ModelAndView,实现转发 forward
语法: setViewName("forward:视图文件完整路径")
forward 特点: 不和视图解析器一同使用, 无视视图解析器
@Controller
public class MyController {
@RequestMapping(value = "/doForward.do")
public ModelAndView doSome(){
ModelAndView mv = new ModelAndView();
mv.addObject("msg","欢迎使用springmvc做web开发");
mv.addObject("fun","执行的是doSome方法");
//显示转发
//mv.setViewName("forward:/WEB-INF/view/show.jsp");
mv.setViewName("forward:/hello.jsp");
return mv;
}
请求重定向
语法: setViewName("redirect:视图完整路径")
redirect 特点: 不和视图解析器一同使用, 无视视图解析器
框架对重定向的操作:
框架会把 Model 中的简单类型的数据, 转为 string 作为 hello.jsp 的 get 请求参数使用
目的是在 doRedirect.do 和 hello.jsp 两次请求之间传递数据
在目标 hello.jsp 页面可以使用参数集合对象${param}获取请求参数值
${param.myname}
提示
重定向不能访问/WEB-INF 资源
@RequestMapping(value = "/doRedirect.do")
public ModelAndView doWithRedirect(String name,Integer age){
ModelAndView mv = new ModelAndView();
//数据放入到 request作用域
mv.addObject("myname",name);
mv.addObject("myage",age);
// 重定向
mv.setViewName("redirect:/hello.jsp");
// http://localhost:8080/ch08_forard_redirect/hello.jsp?myname=lisi&myage=22
// 重定向不能访问/WEB-INF资源
// mv.setViewName("redirect:/WEB-INF/view/show.jsp");
return mv;
}
路径问题
绝对路径与相对路径的区分:
绝对路径为前面加上了 “/” 的路径,而相对路径则前面没有加上 “/”。
转发与重定向中的具体讨论:
转发:转发当中使用带 “/” 的绝对路径时,表示的是当前 web 应用的根目录再加上传入的目录,因为转发是在服务器内部进行的,写绝对路径 / 开头指的是当前的 Web 应用程序
假设当前的 web 应用目录为 http://localhost:8080/web-app 执行 req.getRequestDispatcher("/login.jsp")
则这个时候转到的目录为 http://localhost:8080/web-app/login.jsp
而当转发中使用的是不带 “/” 的相对路径的时候,表示的是当前的路径再加上传入的路径
假如当前的路径为 http://localhost:8080/web-app/abc 执行 req.getRequestDispatcher("login.jsp")
则这个时候转到的目录为 http://localhost:8080/web-app/abc/login.jsp
重定向:重定向中使用带 “/” 的绝对路径时,表示的是当前服务器的根目录再加上传入的目录!
假设当前的 web 应用目录为 http://localhost:8080/web-app 执行 res.sendRedirect("/login.jsp")
则这个时候转到的目录为 http://localhost:8080/login.jsp
而当转发中使用的是不带 “/” 的相对路径的时候,表示的是当前的路径再加上传入的路径 (和转发的时候一样)
假如当前的路径为 http://localhost:8080/web-app/abc 执行 req.getRequestDispatcher("login.jsp")
则这个时候转到的目录为 http://localhost:8080/web-app/abc/login.jsp
绝对路径中的 “/” 代表的不同情况下的不同意思的再总结
“/” 代表站点路径 即 http://localhost:8080 的情况
- 超链接的时候
- action 表单提交的时候
- 请求重定向的时候
“/” 代表的时 web 应用的根目录
即 http://localhost:8080/Context 的情况(可利用
request.getContext()
, 或者application.getContext()
来获取)
- 请求转发的时候
- 在 web.xml 文件中进行配置的时候,例如 URL 的配置的时候