您当前的位置: 首页 >  spring

white camel

暂无认证

  • 1浏览

    0关注

    442博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

white camel 发布时间:2020-03-25 13:25:12 ,浏览量:1

目录
  • 一、静态资源访问问题
    • 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文件夹里面包含一张图片。 在这里插入图片描述

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

跳转到目录

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

  • 访问静态页面 在这里插入图片描述
  • 访问images下的图片 在这里插入图片描述

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

  • 成功访问到静态页面 在这里插入图片描述
  • 成功访问到图片 在这里插入图片描述 原理: 在这里插入图片描述
2、mvc:resources 资源映射

跳转到目录

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


3、两种方式的对比

跳转到目录

在这里插入图片描述

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("");
    }

在这里插入图片描述 注意: 在开发中如果要使用到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;
    }

在这里插入图片描述

3、返回String

跳转到目录

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

在这里插入图片描述

三、请求跳转

跳转到目录

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;
    }

在这里插入图片描述

关注
打赏
1661428283
查看更多评论
立即登录/注册

微信扫码登录

0.0376s