SpringMVC-11-重定向和转发

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 SpringMVC-11-重定向和转发,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

4.Spring MVC重定向和转发

  • Spring MVC 请求方式分为转发、重定向 2 种,分别使用 forward 和 redirect 关键字,都在 controller 层进行处理。

servletAPI可以进行输入,转发、重定向,Spring MVC 的DispatcherServlet也可以,都会经过doService方法

  • 转发是服务器行为,重定向是客户端行为。
  • 重定向是将用户的请求定向到另一个视图(例如 JSP)或处理请求,以前的请求(request)中存放的信息全部失效,并进入一个新的 request 作用域;转发是将用户对当前处理的请求转发给另一个视图或处理请求,以前的 request 中存放的信息不会失效。

转发:客户发送 http 请求,Web 服务器收到请求,在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里转发的路径必须是同一个 Web 容器下的 URL,其不能转向到其他的 Web 路径上,中间传递的是自己的容器内的 request。此时,在客户浏览器的地址栏中显示的仍然是其第一次访问的路径

客户浏览器发送 http 请求,Web 服务器接受后发送 302 状态码响应及对应新的 location 给客户浏览器,客户浏览器发现是 302 响应,则自动再发送一个新的 http 请求,请求 URL 是新的 location 地址,服务器根据此请求寻找资源并发送给客户。

在这里 location 可以重定向到任意 URL,既然是浏览器重新发出了请求,那么就没有什么 request 传递的概念了。在客户浏览器的地址栏中显示的是其重定向的路径,客户可以观察到地址的变化。重定向行为是浏览器做了至少两次的访问请求。

  • 在 Spring MVC 框架中,控制器方法的 return 语句默认就是转发实现,只不过实现的是转发到视图
  • 设置ModelAndView对象,根据view名字和视图解析器解析跳到指定页面
@RequestMapping("/login4")
public String login4(@RequestParam("username") String username,@RequestParam("pwd") String pwd, Model model){
    if ("zs".equals(username)&&"123456".equals(pwd)){
        model.addAttribute("msg","4登录ok");
    }else {
        model.addAttribute("msg","4登录false");
    }
    return "result"; //转发到视图result.jsp
}
  • 可以转发到方法
/**
 * 同一个控制器类中/user/类路径可以省略
 * */
@RequestMapping("/login9")
public String login9(@RequestParam("username") String username,@RequestParam("pwd") String pwd, Model model){
    if ("zs".equals(username)&&"123456".equals(pwd)){
        model.addAttribute("msg","4登录ok");
    }else {
        model.addAttribute("msg","4登录false");
    }
    return "forward:login10";
}
@RequestMapping("/login10")
public String login10(){
    return "/result";
}
@RequestMapping("/login11")
public String login11(@RequestParam("username") String username,@RequestParam("pwd") String pwd, Model model){
    if ("zs".equals(username)&&"123456".equals(pwd)){
        model.addAttribute("msg","4登录ok");
    }else {
        model.addAttribute("msg","4登录false");
    }
    return "redirect:/user/login12";
}
@RequestMapping("/login12")
public String login12(Model model){
    model.addAttribute("msg","重定向,request域失效");
    return "/result";
}
<h4>转发</h4>
<form action="/user/login9" method="post">
  <input type="text" name="username" placeholder="login">
  <input type="text" name="pwd" placeholder="login">
  <input type="submit" value="提交">
</form>
<h4>重定向</h4>
<form action="/user/login11" method="post">
  <input type="text" name="username" placeholder="login">
  <input type="text" name="pwd" placeholder="login">
  <input type="submit" value="提交">
</form>
</body>
  • 在 Spring MVC 框架中,不管是重定向或转发,都需要符合视图解析器的配置,如果直接转发到一个不需要 DispatcherServlet 的资源
@RequestMapping("/login13")
    public String login13(@RequestParam("username") String username,@RequestParam("pwd") String pwd, Model model){
        if ("zs".equals(username)&&"123456".equals(pwd)){
            model.addAttribute("msg","4登录ok");
        }else {
            model.addAttribute("msg","4登录false");
        }
        return "forward:/WEB-INF/static/head.jsp";
    }
  • 则需要使用 mvc:resources 配置:
<mvc:resources mapping="/static/**" location="/WEB-INF/static/"/>

注意:这块也可以不用视图解析器,注释掉,用servletAPI的重定向和转发

但是需要写转发路径的全限定名,若是在WEB-INF下那需要写:/WEB-INF/static/head.jsp

@RequestMapping("/login14")
public String login14(@RequestParam("username") String username,@RequestParam("pwd") String pwd, Model model){
    if ("zs".equals(username)&&"123456".equals(pwd)){
        model.addAttribute("msg","4登录ok");
    }else {
        model.addAttribute("msg","4登录false");
    }
    return "/WEB-INF/jsp/result.jsp"; //ServletAPI进行转发
}

有视图解析器时或者@RestController和@ResponseBody注解时:

显式直接重定向页面:加了redirect:/index.jsp 不会走视图解析器

显式直接转发页面:forward:/result.jsp 也不会走视图解析器,但是找不到/result.jsp或/result,除非return “forward:/WEB-INF/jsp/result.jsp”

/WEB-INF目录下的页面和资源是不能通过浏览器进行直接访问的,但是后台可以通过转发**或者重定向(多走一个方法)进行访问,视图解析器默认使用转发,重定向不走视图解析器,重定向不能访问WEB-INF下的内容,

重定向是不会走视图解析器,因为没有权限去访问WEB-INF目录,就算显示写了也不可以

下一篇:SpringMVC-12-格式化Formatter

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123891.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!