springMVC中的视图解析器

来源:互联网 发布:淘宝客靠谱吗 编辑:程序博客网 时间:2024/06/15 21:38
 
在springMVC中,dispathcherServlet分发策略将视图逻辑解析成视图。springMVC中自带多种视图解析策略,这些bean实现基本的视图解析接口ViewResolver,该接口定义解析视图的基本方法<pre name="code" class="java">/** * Resolve the given view by name. * <p>Note: To allow for ViewResolver chaining, a ViewResolver should * return {@code null} if a view with the given name is not defined in it. * However, this is not required: Some ViewResolvers will always attempt * to build View objects with the given name, unable to return {@code null} * (rather throwing an exception when View creation failed). * @param viewName name of the view to resolve * @param locale Locale in which to resolve the view. * ViewResolvers that support internationalization should respect this. * @return the View object, or {@code null} if not found * (optional, to allow for ViewResolver chaining) * @throws Exception if the view cannot be resolved * (typically in case of problems creating an actual View object) */View resolveViewName(String viewName, Locale locale) throws Exception;
从注释从作者规定了要遵守的规定,在视图未定义返回null ,视图无法解析时抛出异常,从方法中我们也可以看到解析视图需要的参数viewName和本地化信息,支持国际化。不同的视图解析器实现不同,常见的<span style="color: rgb(44, 69, 87);"><u><span style="font-family:SimSun;font-size:12px;">InternalResourceViewResolver继承自UrlBasedViewResolver,其中定义了重定向前缀REDIRECT_URL_PREFIX、转发前缀FORWARD_URL_PREFIX、视图类viewClass和前缀prefix后缀suffix,常用配置如下:</span></u></span>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="viewClass">            <value>org.springframework.web.servlet.view.JstlView</value>        </property>        <property name="prefix">            <value>/WEB-INF/page/</value>        </property>        <property name="suffix">            <value>.jsp</value>        </property>    </bean>
在createView方法中,可以看出针对转发与重定向不同的处理方式。<pre name="code" class="java">if (viewName.startsWith(REDIRECT_URL_PREFIX)) {String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());RedirectView view = new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible());return applyLifecycleMethods(viewName, view);}// Check for special "forward:" prefix.if (viewName.startsWith(FORWARD_URL_PREFIX)) {String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());return new InternalResourceView(forwardUrl);}

 在buildView方法中有如上代码片段,可明白视图具体返回是前缀+实际viewName+后缀共同组成的地址
AbstractUrlBasedView view = (AbstractUrlBasedView) BeanUtils.instantiateClass(getViewClass());view.setUrl(getPrefix() + viewName + getSuffix());
在其构造方法中,发现默认配置的viewClass是jstlview,如果视图带有jstl标记的jsp模板,该属性可以不必配置
public InternalResourceViewResolver() {Class<?> viewClass = requiredViewClass();if (viewClass.equals(InternalResourceView.class) && jstlPresent) {viewClass = JstlView.class;}setViewClass(viewClass);}
如果单个视图解析策略无法满足要求,可以定义多个,通过or der属性区别优先级,数值越小代表优先级越高,所以通常将最低优先级分配给
InternalResourceViewResolver以保证其他视图是否存在都可以解析。
0 0
原创粉丝点击