SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向

目录

  • 一、静态资源访问问题
    • 1、mvc:default-servlet-handler 方式
    • 2、mvc:resources 资源映射 方式
    • 3、两种方式的对比
    • 4、url-pattern拦截方式
  • 二、( Controller ) 处理器方法响应处理
    • 1、返回void
    • 2、返回ModelAndView
    • 3、返回String
  • 三、请求跳转
    • 1、请求转发
    • 2、URL重定向
    • 3、请求转发和重定向的选择
    • 4、URL重定向共享数据
      在这里插入图片描述

一、静态资源访问问题

跳转到目录

当对前端控制器设置为拦截资源的路径( url-pattern )为/时,此时出现不能访问静态资源的问题。

导致原因 :
在Tomcat中处理静态资源的servlet ( default )所映射路径为就是/。在启动项目的时候,在Tomcat中的web.xml是先加载,项目的web.xml是后加载,如果配置了相同的映射路径,项目中的web.xml会覆盖Tomcat中web.xml相同的配置

也就是说, SpringMVC中的DispatcherServlet的映射路径覆盖了Tomcat默认对静态资源的处理的路径。此时SpringMVC会把静态资源当做是Controller ,寻找并访问,当然结果肯定是找不到。

为了效果明显,可以在web根目录新建一个test.html ,在images文件夹里面包含一张图片。
SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第1张图片

1、使用 方式(推荐使用)

跳转到目录

当没有在springmvc-servlet.xml中配置的测试如下:

  • 访问静态页面
    SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第2张图片
  • 访问images下的图片
    SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第3张图片

在springmvc-servlet.xml中配置配置后:

  • 成功访问到静态页面
    SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第4张图片
  • 成功访问到图片
    SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第5张图片
    原理:
    在这里插入图片描述

2、mvc:resources 资源映射

跳转到目录

在springmvc-servlet.xml中配置
该配置把web下的目录都为根目录, /**表示多级目录;这种方式相比第一种更强大一下,开发中使用的也比较多;
效果如下:
在这里插入图片描述

<mvc:resources location="/" mapping="/**"/>

3、两种方式的对比

跳转到目录

SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第6张图片

4、url-pattern拦截方式

跳转到目录

  • 配置如*.do、*.htm 是最传统方式,不会导致静态文件(jpg、js、Css )被拦截,但不支持RESTful风格。
  • 配置成 /,可以支持流行的RESTfull 风格,但会导致静态文件(jpg、js、 CSS )被拦截后不能正常显示。
  • 配置成/*,是错误的方式,可以请求到Controller 中,但调转到jsp时被拦截,不能渲染jsp视图。

二、处理器方法响应处理(Controller)

跳转到目录

1、返回void

跳转到目录

@Controller
// 窄化处理: 比如想访问/test1,必须在url中输入 /response/test1
@RequestMapping("/response")
public class HandleResponseController {
    //返回void类型,此时可以把Controller方法当做Servlet来使用
    @RequestMapping("/test1")
    public void test1(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //请求转发:
        request.getRequestDispatcher("").forward(request, response);
        //URL重定向
        response.sendRedirect("");
        //设置共享数据
        request.setAttribute("", "");
        //输出JSON格式
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().println("");
    }

SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第7张图片
注意: 在开发中如果要使用到Servlet API对象,此时就可以直接以参数的形式传递进去,或者以DI注解方式注入; 使用DI注解不推荐,因为Controller是单例的会造成线程不安全问题;

2、返回ModelAndView

跳转到目录

//返回ModelAndView
    @RequestMapping("/test2")
    public ModelAndView returnMv() {
        ModelAndView mv = new ModelAndView();
        //设置共享数据的key和value
        mv.addObject("msg", "返回ModelAndView");
        //设置共享数据value,此时会把value类型的首字母作为key:string
        mv.addObject("你好桂朝阳");
        mv.setViewName("welcome");
        return mv;
    }

SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第8张图片

3、返回String

跳转到目录

    // 返回String,逻辑视图名称,此时需要结合Model类型的参数一起使用
    @RequestMapping("test3")
    public String returnStr(Model model) {
        model.addAttribute("msg", "返回String");
        model.addAttribute("朝阳你好String");
        // 返回的就是视图名称
        return "welcome";
    }

SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第9张图片

三、请求跳转

跳转到目录

1、请求转发

跳转到目录

// 请求转发,浏览器地址栏不改变,可以共享请求的数据
    //原理:request.getRequestDispatcher("").forward(request, response);
    @RequestMapping("test4")
    public String test4(Model model) {
        return "forward:/hello.html";
    }

2、URL重定向

跳转到目录

    // URL重定向,浏览器地址栏会改变,不能共享请求中的数据
    // 原理: response.sendRedirect("");
    @RequestMapping("/test5")
    public String test5(Model model) {
        return "redirect:/hello.html";
    }

3、请求转发和重定向的选择

跳转到目录

请求转发 URL重定向
地址栏 不会 会变
共享数据 可以 不能?(可能会哟)
表单重复提交 导致 不会
  • 请求资源的路径问题(转发、重定向都一样): 以后访问资源的时候,都使用/开头.
    -重定向 redirect:/hello.html 和 redirect:hello.html

  • 访问资源的时候前面带上/,表示绝对路径,从根路径开始去寻找资源.

  • 访问资源的时候签名不加/,表示相对路径,从上一级上下文路径中去寻找资源.
    /response/test5----->“redirect:/hello.html”;—>localhost:/hello.html
    /response/test5----->“redirect: hello.html”;—>localhost:/response/hello.html

4、URL重定向共享数据

跳转到目录

传统的方式,在URL重定向的时候,因为是两次不同的请求,所以不能共享请求中的数据.在开发中有的时候,真的需要重定向跳转后共享数据.
spring3.1开始 提供了Flash属性.,只能使用从Controller重定向到Controller,不能到JSP.

    @RequestMapping("/a")
    public String a(RedirectAttributes ra) {
        ra.addAttribute("msg1", "gzy");
        ra.addFlashAttribute("msg2", "gzy");
        return "redirect:/response/b";
    }

    @RequestMapping("/b")
    public String b(String msg1, @ModelAttribute("msg2")String msg2) {
        System.out.println("msg1:" + msg1);
        System.out.println("msg2:" + msg2);
        return null;
    }

SpringMVC——静态资源访问问题、处理器方法响应类型、请求转发、URL重定向_第10张图片

你可能感兴趣的:(SpringMVC)