springmvc viewResolver

springmvc 我们每次请求都通过SpringMvc的DispactherServlet,找到相应的HandlerMaping(Controller)和HandlerAdapter(method),进行相应的处理后 会返回给我们一个ModelAndView,然后宣染到前台浏览器。在这个渲染的过程中,viewResolver会将modelAndView解析成相应的view返回给浏览器。

viewResolver和view两个接口视图解析过程中重要的两个接口 viewResolver是把逻辑视图名称解析成view对象 view主要是处理视图,然后返回给客户端

viewResolver是实现类有一下几个

AbstractCachingViewResolver 是一个abstract class,抽象类,会把它所解析的都每一个视图都保存起来,如果该视图没有解析过,第一次解析,会再解析后创建一个新的视图对象,把它放到有个用于缓存的map中 private final Map<Object, View> viewAccessCache = new ConcurrentHashMap<Object, View>(DEFAULT_CACHE_LIMIT); 默认的大小为1024,这种解析方式会把视图的解析性能降到最低

UrlBasedViewResolver url视图解析器 public class UrlBasedViewResolver extends AbstractCachingViewResolver implements Ordered 他继承了AbstractCachingViewResolver class,此种解析器主要就是提供了一种拼接url的方式来解析视图,可以通过配置他的 private String prefix = ""; 前缀信息

private String suffix = ""; 后缀信息

private Class<?> viewClass; 视图解析类,比如项目中经常使用的 org.springframework.web.servlet.view.tiles2.TilesView ,titles

下面是简单的实验

<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value="html"></property> <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/> <!-- 使jsp页面支持jstl 表达式 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> --> </bean>

项目中 输入图片说明

输入图片说明

浏览器上 http://127.0.0.1:9080/springquartz/test/viewResovler.do 输入图片说明

UrlBasedViewResolver解析器会按照返回的modelAndView此处的viewResovler字符串来,给它前后拼接,所以返回的就是WEB-INF/viewResovler.html

UrlBasedViewResolver 视图支持返回的modelAndView中支持redirect和forword,比如返回的字符串‘redirct:view/viewTest.do’,视图解析的时候回去解析view/viewTest.do返回的modelAndView,即支持视图之间重定向和转发

InternalResourceViewResolver 内部资源视图解析器 是UrlBasedViewResolver 的子类,会把返回的视图名称都解析为一个InternalResourceView,内部资源对象,而InternalResourceView会把Controller返回的属性模型 存放到对象的Request属性中 // Obtain a RequestDispatcher for the target resource (typically a JSP). RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath); if (rd == null) { throw new ServletException("Could not get RequestDispatcher for [" + getUrl() + "]: Check that the corresponding file exists within your web application archive!"); }

	// If already included or response already committed, perform include, else forward.
	if (useInclude(request, response)) {
		response.setContentType(getContentType());
		if (logger.isDebugEnabled()) {
			logger.debug("Including resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'");
		}
		rd.include(request, response);
	}

	else {
		// Note: The forwarded resource is supposed to determine the content type itself.
		if (logger.isDebugEnabled()) {
			logger.debug("Forwarding to resource [" + getUrl() + "] in InternalResourceView '" + getBeanName() + "'");
		}
		rd.forward(request, response);
	}

RequestDispatcher 转发到目标url上,即找到/WEB-INF/目录下面相应的页面,利用此特性可以在项目内部实现跳转,找到指定的页面,找到页面后,可以把request属性中相应的值,回填到jsp中

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/pages/" p:suffix=".jsp" />

每一个viewRelover都是实现了Order接口,可以配置viewRelover里面的order属性来决定视图解析器解析视图的循序,order的值越小,表示解析器排序越靠前,当解析器返回的一个非空view表示解析器解析完成,不会再往后解析该视图了,所以要注意InternalResourceViewResolver这种能解析所有的视图,即永远能返回一个非空View对象的ViewResolver一定要把它放在ViewResolver链的最后面。

转载于:https://my.oschina.net/u/3195939/blog/839547

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值