SpringMVC03_视图解析

视图【View】和视图解析器【ViewResolver】对象

SpringMVC如何解析视图

  • 1)不论处理器方法返回一个String,ModelAndView还是View,Spring MVC 都会在内部将它们转换成一个 ModelAndView 对象,由视图解析器解析视图,然后,进行页面的跳转。

  • 2)Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 HTML ,也可能是JSP、 Excel、JFreeChart等各种表现形式的视图。

  • 3)对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦。

1 视图解析器对象【ViewResolver】
  • 作用:将视图【View】对象从ModelAndView中解析出来

  • 1)视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。

  • 2)所有的视图解析器都必须实现 ViewResolver 接口

  • 3)可以在 SpringMVC 上下文中配置一种或多种解析器,每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。例如在springmvc.xml中配置的【ThymeleafViewResolver】解析器

  • 4)SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。

2 视图对象【View】
  • 作用

    • 将数据共享到域中
    • 跳转路径
  • 1)视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。

  • 2)视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。

  • 3)为了实现视图模型和具体实现技术的解耦,Spring 在org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口。

@RequestMapping("/responsedata")
public ModelAndView testResponseData(){
    ModelAndView mv = new ModelAndView();
    //为mv设置数据模型
    mv.addObject("deptId",1001);
    mv.addObject("deptName","秘书部门");
    //为mv设置视图对象
    mv.setViewName("success");
    return mv;
}

mvc:view-controller标签

  • 作用:匹配请求路径与逻辑视图名【如不需要处理业务,只希望跳转路径时,使用该标签】

  • 注意:如添加当前标签,会导致@RequestMapping注解失效,此时需要添加如下标签解决问题:

    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
    <mvc:annotation-driven></mvc:annotation-driven>
    

SpringMVC重定向及静态资源加载问题

重定向语法

1)一般情况下,处理器方法返回字符串类型的值会被当成逻辑视图名处理。如果返回的字符串中带 forward: 或 redirect: 前缀时,SpringMVC 会对他们进行特殊处理:将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理。

  • redirect:/prefix_test.html:会完成一个到 prefix_test.html 的重定向的操作。
  • forward:/prefix_test.html:会完成一个到 prefix_test.html 的转发操作。
@RequestMapping("/testRedirect")
    public String testRedirect(){
        System.out.println("测试重定向");
//        return "forward:/prefix_test.html"; //转发到prefix_test.html页面
        return "redirect:/prefix_test.html"; //重定向到prefix_test.html页面
    }

注意:直接手动转发或重定向到html页面时会出现404。

  • 原因:请求静态资源html文件的请求被DispacherServlet拦截,但是没有找到映射该请求的处理方法。

    之前【JavaWeb】没有被拦截,现在被拦截原因:DispacherServlet配置URL是【/】,将tomcat->config->web.xml中的defaultServlet配置URL的【/】覆盖了。

解决方案,添加如下配置
<!--配置处理静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--配置了处理静态资源之后也需要配置以下标签-->
<mvc:annotation-driven></mvc:annotation-driven>

mvc:default-servlet-handler说明

  • 配置了该标签之后将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 WEB 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。

  • 如果WEB服务器中配置的Servlet的名字不是default,那么mvc:default-servlet-handler标签中需要显示指定Servlet的名称;如果是default可以省略不指定。

<mvc:default-servlet-handler default-servlet-name="WEB服务器中配置的Servlet的名称"></mvc:default-servlet-handler>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值