springMVC中的视图解析器

 
在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值