天天看点

springMVC源码解析--ViewResolver视图解析器执行(三)

之前两篇博客​​ springMVC源码分析--ViewResolver视图解析器(一)​​​和​​ springMVC源码解析--ViewResolverComposite视图解析器集合(二)​​中我们已经简单介绍了一些ViewResolver的知识,ViewResolver的主要功能就是根据配置的视图解析器实现类来生成一个View对象。接下来我们通过介绍常见InternalResourceViewResolver来对ViewResolver的运行流程有一个简单的了解和认识。

1、首先在配置文件中配置视图解析器

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/" />//视图文件路径
    <property name="suffix" value=".jsp" />//视图文件后缀
  </bean>      

2、在Controller中返回视图文件路径及名称,这样返回值jsp/ProductForm对应的其实就是一个jsp文件的路径了。

@RequestMapping(value = "input")
    public String inputProduct() {
        logger.info("inputProduct called");
        return "jsp/ProductForm";  //对应jsp页面名称
    }      

接下来我们介绍一个ViewResolver的执行流程。

1、首先执行的流程开始在DispatcherServlet的render函数中,会调用resolverViewName来获取View对象。

protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // Determine locale for request and apply it to the response.
    
    ........
    
    View view;
    ........
    //获得视图
    view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
    
    .......
  }      

resolveViewName的主要工作就是从配置的所有视图解析器中查找一个可以生成View对象的视图解析器。

protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
      HttpServletRequest request) throws Exception {

    for (ViewResolver viewResolver : this.viewResolvers) {
      View view = viewResolver.resolveViewName(viewName, locale);
      if (view != null) {
        return view;
      }
    }
    return null;
  }      
springMVC源码解析--ViewResolver视图解析器执行(三)

继续阅读