1. 程式人生 > >springMVC原始碼解析--ViewResolver檢視解析器執行(三)

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

這裡選取的是InternalResourceViewResolver。

在InternalResourceViewResolver中的操作就是將viewName和locale設定到View物件中,這樣就完成了View物件的建立。