`
starscream
  • 浏览: 285974 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring MVC 学习笔记 二 spring mvc Schema-based configuration

阅读更多
Spring mvc 目前支持5个tag,分别是
mvc:annotation-driven,mvc:interceptors,mvc:view-controller, mvc:resources和mvc:default-servlet-handler

mvc:annotation-driven
  注册 DefaultAnnotationHandlerMapping 和AnnotationMethodHandlerAdapter两个bean,及一系列缺省的messageconverter(需要classpath中有相应的lib包的支持。)
相当于以下配置的效果。
	<bean
		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
		<property name="order" value="0" />
	</bean>

	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="webBindingInitializer">
			<bean
				class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
				<property name="validator" ref="validator" />
			</bean>
		</property>
		<property name="messageConverters">
			<list>
				<bean
					class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
				<bean
					class="org.springframework.http.converter.StringHttpMessageConverter" />
				<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
				<bean
					class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
				<bean
					class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
			</list>
		</property>
	</bean>

	<bean id="validator"
		class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
	<bean id="conversion-service"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />

注意在3.0.5版本中不支持在 mvc:annotation-driven中再注册新的messageconveter,在3.1版本中可以支持,写法如下
	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
			<bean
				class="org.springframework.http.converter.ResourceHttpMessageConverter" />
			<bean
				class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
		</mvc:message-converters>
	</mvc:annotation-driven>


mvc:interceptors
注册HandlerInterceptors 或 WebRequestInterceptors 拦截器来拦截request请求。
例如

	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/*" />
			<bean class="net.zhepu.web.interceptor.Testinterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

拦截器实现代码如下
public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		log.debug("afterCompletion");
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		log.debug("postHandle");
	}

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		log.debug("preHandle");
		
		log.debug(handler.getClass().getName());
		return super.preHandle(request, response, handler);
	}


mvc:default-servlet-handler
    将spring mvc的DispatcherServlet替换当前web server的缺省的Servlet。这样做的好处是定义spring mvc处理请求时,不再需要定义*.do,*.action,/action/*之类的url-pattern,而是可以直接定义为<url-pattern>/</url-pattern> (注意不是<url-pattern>/*</url-pattern>,/*将匹配所有请求而导致所有jsp和静态内容都无法正常显示,而/只匹配缺省的servlet)。
    常见web 容器的default servlet name spring mvc中都能自动识别,但对于不常见的web 容器或default servlet name 被改写过的,则需增加参数 default-servlet-name来指定对应的servlet name.
需与<mvc:annotation-driven/>一起使用


mvc:view-controller
将指定路径的请求直接转到对应的view上,而不需要特定的controller来处理请求。
例如
<mvc:view-controller path="/hello/*" view-name="helloWorld"/>


mvc:resources
将指定URL 的匹配模式来访问静态文件,如
<mvc:resources mapping="/js/**" location="/WEB-INF/js/" cache-period="3600"/>

表示将/WEB-INF/js/目录映射到/js/目录,cache超时时间为3600秒。
则jsp中引用 js/helloWorld.js实际上指向的是 /WEB-INF/js/helloWorld.js.
4
0
分享到:
评论
4 楼 yujiaao 2012-05-30  
共享这么有用的东西,真是好人那!
3 楼 test_yulie 2011-12-08  
请教一下:和mvc:annotation-driven效果相当的纯bean配置文件,您是从哪里找到的。
遇到命名空间暂时还不支持的扩展时,往往需要将命名空间打散,可是我总是苦于没有办法找到命名空间的原始配置,只能盲目跟踪源代码。
请问您是怎么怎么得到这种命名空间对应配置的?
2 楼 test_yulie 2011-12-08  
补充一下:第一段xml代码的第10行和第11行之间,需要增加一个:
<property name="conversionService" ref="conversion-service" />

如果不这么做,那么org.springframework.validation.DataBinder的成员变量conversionService将会为null,如果碰巧需在Model中有这样的数据绑定写法:
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date birthday;

那么将会抛出异常:
Cannot convert value of type [java.lang.String] to required type [java.util.Date] for property 'birthday': no matching editors or conversion strategy found]

导致前台传入的表示日期的String绑定不到后台模型的Date中去。

其原理我猜测为FormattingConversionServiceFactoryBean这个Bean工厂的getObject方法返回的就是:conversionService,所以可以在ConfigurableWebBindingInitializer处引用。
1 楼 linvar 2011-09-17  
"mvc:default-servlet-handler
<url-pattern>/</url-pattern>
注意不是<url-pattern>/*</url-pattern>,/*将匹配所有请求而导致所有jsp和静态内容都无法正常显示,而/只匹配缺省的servlet)。
"

我使用"/*"时可以正常显示图片.
我理解mvc:default-servlet-handler的作用是:
如果没有找到相应的mapping handler来处理请求(不管静态,动态),
就丢给default-servlet来处理吧.

是这样吧?

相关推荐

Global site tag (gtag.js) - Google Analytics