protected void exposeHelpers(HttpServletRequest request) throws Exception {
JstlUtils.exposeLocalizationContext(request, this.jstlAwareMessageSource);
}
}
在JstlUtils中包含了对于其他而言jstl特殊的数据处理和设置。
过程是不是很长?我们现在在哪里了?呵呵,我们刚刚完成的事MVC中View的render, 对于InternalResourceView的render 过程比较简单只是完成一个资源的重定向处理。需 要做的就是得到实际view的internalResource路径,然后转发到那个资源中去。怎样得到 资源的路径呢通过调用:
Java代码
protected String prepareForRendering(HttpServletRequest request, HttpServletResponse response)
throws Exception {
return getUrl();
}
那这个url在哪里生成呢?我们在View相关的代码中没有找到,实际上,他在 ViewRosolve的时候就生成了,在UrlBasedViewResolver中:
Java代码
protected AbstractUrlBasedView buildView(String viewName) throws Exception {
AbstractUrlBasedView view = (AbstractUrlBasedView) BeanUtils.instantiateClass(getViewClass());
view.setUrl(getPrefix() + viewName + getSuffix());
String contentType = getContentType();
if (contentType != null) {
view.setContentType(contentType);
}
view.setRequestContextAttribute(getRequestContextAttribute());
view.setAttributesMap(getAttributesMap());
return view;
}
这里是生成View的地方,自然也把生成的url和其他一些和view相关的属性也配置好了 。
那这个ViewResolve是什么时候被调用的呢?哈哈,我们这样又要回到 DispatcherServlet中去看看究竟,在DispatcherServlet中:
Java代码
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response)
throws Exception {
........
View view = null;
// 这里设置视图名为默认的名字
if (!mv.hasView()) {
mv.setViewName(getDefaultViewName(request));
}
if (mv.isReference()) {
//这里对视图名进行解析,在解析的过程中根据需要生成实际需要的视 图对象。
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
..........
}
......
}
Spring源代码解析(四):Spring MVC(10)
时间:2011-03-29 javaeye jiwenke
下面是对视图名进行解析的具体过程:
Java代码
protected View resolveViewName(String viewName, Map model, Locale locale, HttpServletRequest request)
throws Exception {
//我们有可能不止一个视图解析器
for (Iterator it = this.viewResolvers.iterator(); it.hasNext();) {
ViewResolver viewResolver = (ViewResolver) it.next();
//这里是视图解析器进行解析并生成视图的过程。
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
这里调用具体的ViewResolver对视图的名字进行解析 - 除了单纯的解析之外,它还根 据我们的要求生成了我们实际需要的视图对象。具体的viewResolver在bean定义文件中进 行定义同时在 initViewResolver()方法中被初始化 |