zoukankan      html  css  js  c++  java
  • SpringMVC

      对于控制器的目标方法,无论其返回值是String、View、ModelMap或是ModelAndView,SpringMVC都会在内部将它们封装为一个ModelAndView对象进行返回。 
       spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP也可是Excell、 
    JFreeChart等各种表现形式的视图。

    SpringMVC的视图解析流程

      SpringMVC的视图解析流程为: 
       
    1、调用目标方法,SpringMVC将目标方法返回的String、View、ModelMap或是ModelAndView都转换为一个ModelAndView对象;

    2、然后通过视图解析器(ViewResolver)对ModelAndView对象中的View对象进行解析,将该逻辑视图View对象解析为一个物理视图View对象;

    3、最后调用物理视图View对象的render()方法进行视图渲染,得到响应结果。

    视图(View)

      视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。 
      为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义了一个高度抽象的View接口。 
      视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题。所谓视图是无状态的,是指对于每一个请求,都会创建一个View对象。 
      JSP是最常见的视图技术。 
       
      常用的视图实现类: 
      image_1b1ce221b11hn6kv3pv1jj4kcm9.png-351.2kB

    视图解析器(ViewResolver)

      视图解析器的作用是将逻辑视图转为物理视图,所有的视图解析器都必须实现ViewResolver接口。 
       SpringMVC为逻辑视图名的解析提供了不同的策略,可以在Spring WEB上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。程序员可以选择一种视图解析器或混用多种视图解析器。可以通过order属性指定解析器的优先顺序,order越小优先级越高,SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则抛出ServletException异常。 
       
       常用的视图解析器实现类: 
       image_1b1ce6cmvcq619dl1fv19i3fg29.png-264.4kB 
       
       以下是通过InternalResourceViewResolver作为视图解析器解析,将逻辑视图解析为JSP视图的实例:

    <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>

      若项目中使用了JSTL,则SpringMVC会自动把视图由InternalResourceView转为JstlView。 
      

    使用mvc:view-controller不经控制器直接跳转到页面

      若希望直接响应通过SpringMVC渲染的页面,可以使用mvc:view-controller标签实现:

      <!-- 配置直接转发的页面 -->      
    <!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法.  -->  
        <mvc:view-controller path="/success" view-name="success"/>  

      那么现在可以直接在某一页面中通过请求路径”success”访问到/WEB-INF/views/success.jsp页面(因为我们上面配置了视图解析器将逻辑视图解析为前缀为/WEB-INF/views/,后缀为.jsp的物理视图)。但是,这种情况下通过控制器就无法映射到请求了,需要再进行如下配置:

        <!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签,  之前的页面才不会因为配置了直接转发页面而受到影响 -->  
        <mvc:annotation-driven></mvc:annotation-driven>  

    关于重定向

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

    <a href="${pageContext.request.contextPath }/springmvc/testRedirect">Test Redirect</a>

    controller:

    @Controller
    @RequestMapping("/springmvc")
    public class SpringMVCTest {
    
        @RequestMapping("/testRedirect")
        public String testRedirect() {
            System.out.println("testRedirect");
            return "redirect:/index.jsp";
        }
    }

    即可重定向到index.jsp。也可在redirect:/后添加控制器方法的映射路径,重定向到该目标方法

  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/hhda/p/7402468.html
Copyright © 2011-2022 走看看