接SpringMVC源碼解析(一),mv = ha.handle後將要執行的是processDispatchResult(),這裏是已經得到ModelAndView以後的視圖解析部分。html
從圖中能夠看出,咱們在SpringMVC配置文件中配置了一個java
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean>
所以SpringMVC讀取到了InternalResourceViewResolver視圖解析器,它提供了一個resolveViewName方法,接下來咱們進入這個方法中。web
咱們並無攜帶任何的前綴開頭所以進入最後的super.creatView()方法中spring
進入了loadView()方法,繼續往下走
loadview()方法下最重要的就是buildView方法。
因爲buildview方法內太過複雜,因此沒有繼續往下,總之他最後經過buildview()SpringMVC給咱們返回了一個view對象。segmentfault
<bean class="com.lyh.view.ViewResolverTest"> <property name="order" value="1"></property> <!--order能夠設置優先級--> </bean>
package com.lyh.view; import java.util.Locale; import org.springframework.core.Ordered; import org.springframework.web.servlet.View; import org.springframework.web.servlet.ViewResolver; public class ViewResolverTest implements ViewResolver,Ordered{ private Integer order = 0; @Override public View resolveViewName(String viewName, Locale locale) throws Exception { if(viewName.startsWith("nihao:")){ return new MyView(); }else{ return null; } } @Override public int getOrder() { // TODO Auto-generated method stub return order; } //設置視圖解析器的優先級 public void setOrder(Integer order){ this.order = order; } }
package com.lyh.view; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.View; public class MyView implements View { @Override public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/html"); String name = (String) model.get("name"); String password = (String) model.get("password"); response.getWriter().write("<a>你好" + name + ",歡迎來到本頁面,你的密碼是" + password + ".</a><br/>"); } @Override public String getContentType() { return "text/html"; } }
能夠看到我本身配置的視圖解析器已經生效了,接下來他就會進入到我配置的視圖解析器中去執行。
jsp
ha.handle()方法執行後會生成一個ModelAndView對象,視圖解析器的功能就是負責解析這些對象生成對應的view對象。
視圖解析器(ViewResolver)種類繁多,能夠根據須要選擇合適的視圖解析器,不一樣的視圖解析器會負責生成不一樣的視圖對象(View),不一樣的視圖對象(View)又會渲染出來不一樣的頁面效果。
視圖對象種類
視圖解析器種類
。ide