processDispatchResult()细节
接SpringMVC源码解析(一),mv = ha.handle后将要执行的是processDispatchResult(),这里是已经获得ModelAndView之后的视图解析部分。
1.进入processDispatchResult()
2.进入render()方法
3.进入ResolveViewName()方法
从图中可以看出,我们在SpringMVC配置文件中配置了一个
<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方法,接下来我们进入这个方法中。
4.InternalResourceViewResolver.resolveViewName方法
5.creatView方法
我们并没有携带任何的前缀开头因此进入最后的super.creatView()方法中
6.super.creatView()方法
进入了loadView()方法,继续往下走
loadview()方法下最重要的就是buildView方法。
由于buildview方法内太过复杂,所以没有继续往下,总之他最后通过buildview()SpringMVC给我们返回了一个view对象。
7.渲染页面
应用:自己配置视图解析器
1.在SpringMVC中配置文件注入自己的视图解析器
<bean class="com.lyh.view.ViewResolverTest">
<property name="order" value="1"></property>
<!--order可以设置优先级-->
</bean>
2.编写ViewResolverTest文件
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; }
}
3.编写视图文件MyView()
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";
}
}
4.查看源码中的变化
可以看到我自己配置的视图解析器已经生效了,接下来他就会进入到我配置的视图解析器中去执行。
总结
ha.handle()方法执行后会生成一个ModelAndView对象,视图解析器的功能就是负责解析这些对象生成对应的view对象。
视图解析器(ViewResolver)种类繁多,可以根据需要选择合适的视图解析器,不同的视图解析器会负责生成不同的视图对象(View),不同的视图对象(View)又会渲染出来不同的页面效果。
视图对象种类
视图解析器种类。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。