接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