您的位置:首页 > 移动开发

Spring官方文档翻译——15.4 处理器映射(Handler mappings)

2014-10-15 23:09 375 查看
15.4 处理器映射(Handler mappings) 注:下面将handler翻译成处理器



在Spring早先的版本中,用户还需要在web应用上下文中定义处理器映射来配置请求(requests)与处理器之间的关系。而在Spring2.5中,DispatcherServlet实现了一个默认的处理器映射的注解实现——DefaultAnnotationHandlerMapping,它能够寻找@RequestMapping和@Controllers注解(译者注:需要配置component-scan)。一般情况下,你不需要重写这个默认的映射关系,除非你需要自定义某些默认的属性值。下面列出了其中的属性:



interceptors(拦截器)

配置使用到的一组拦截器。HandlerInterceptors在本章中的“Intercepting requests - the HandlerInterceptor interface”部分有更进一步的介绍。



default handler

配置默认的处理器,也就是当处理器映射找不到匹配结果的时候使用。



order

Spring将上下文中所有可用的(available)处理器映射关系根据order值(see the org.springframework.core.Ordered interface)排序,然后按顺序匹配到第一个满足的handler



alwaysUseFullPath

如果为true,Spring将会在当前的servlet上下文中使用全路径来寻找一个合适的处理器。默 认为false,那么则会使用当前的servlet所在路径作为基路径。比如,一个servlet使用testing/* 来做映射,且alwaysUseFullPath属性被设置成true,此时使用的路径为 /testing/viewPage.html。相反,若alwaysUseFullPath为false,那么路径为/viewPage.html



urlDecode

对于Spring2.5来说,默认值为true。如果你更喜欢比较被编码的路径,将它设置成 false。然而,HttpServletRequest总是将servlet路径暴露在被解码的表单里。要知道当与被编码的路径比较时,servlet路径不会与之匹配。



lazyInitHandlers

允许单例处理器的懒加载(prototype处理器总是懒加载的)。默认值为false



注意

alwaysUseFullPath, urlDecode和lazyInitHandlers 这几个属性只有对于org.springframework.web.servlet.handler.AbstractUrlHandlerMapping的子类才生效



下面的例子显示了如何重写默认的mapping并增加一个拦截器(interceptor)

<beans>
	<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
		<property name="interceptors">
			<bean class="example.MyInterceptor"/>
		</property>
	</bean>
<beans>


拦截请求——HandlerInterceptor接口 Interceptingrequests - the HandlerInterceptor interface

Spring的处理器映射机制包括拦截器,当你想要对指定的requests应用一些特定的功能时会很有用,比如:鉴权;

位于handler mapping中的拦截器必须要实现org.springframework.web.servlet.HandlerInterceptor接口。这个接口定义了三个方法:preHandle方法在处理器handle执行之前被执行,postHandle方法在处理器handle方法执行之后被执行,而另一个afterCompletion方法则是在完整请求结束之后,也就是在渲染视图之后被执行(译者注:一般简单的需求使用org.springframework.web.servlet.handler.HandlerInterceptorAdapter,实现pre-only/post-only就可以了)这三个方法能够提供足够灵活的多种前置和后置处理。

其中preHandle方法返回一个布尔值。返回true,那么处理器执行链将会继续执行,若返回false,那么DispatcherServlet会认为拦截器自己已经托管了请求(比如,拦截器会为它渲染一个合适的视图),而不再去继续执行其他拦截器且当前的执行链也会被终止。

下面的例子定义了一个处理器映射,它会将所有匹配的URL("/*.form"或"/*.view")映射到指定的控制器(controller——editAccountFormController)上。其中添加了一个拦截器来拦截这些匹配的请求,实现了让不在上午9点到下午6点这段时间访问的请求都被重定向到另一个页面。

<beans>
		<bean id="handlerMapping"
			class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
			<property name="interceptors">
				<list>
					<ref bean="officeHoursInterceptor" />
				</list>
			</property>
			<property name="mappings">
				<value>
					Spring Framework
					3.0 Reference Documentation 440
					/*.form=editAccountFormController
					/*.view=editAccountFormController
				</value>
			</property>
		</bean>
		<bean id="officeHoursInterceptor" class="samples.TimeBasedAccessInterceptor">
			<property name="openingTime" value="9" />
			<property name="closingTime" value="18" />
		</bean>
		<beans>


package samples;

public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {
	private int openingTime;
	private int closingTime;

	public void setOpeningTime(int openingTime) {
		this.openingTime = openingTime;
	}

	public void setClosingTime(int closingTime) {
		this.closingTime = closingTime;
	}

	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		Calendar cal = Calendar.getInstance();
		int hour = cal.get(HOUR_OF_DAY);
		if (openingTime <= hour < closingTime) {
			return true;
		} else {
			response.sendRedirect("http://host.com/outsideOfficeHours.html");
			return false;
		}
	}
}


任何被该映射关系匹配的请求都会被TimeBasedAccessInterceptor拦截。如果当前时间不在办公时间(也就是上午9点到下午6点),那么用户将被重定向到一个静态HTML页面,比如你只能够在工作时间访问网站。



正如你所看到的,Spring适配器类HandlerInterceptorAdapter简化了直接实现HandlerInterceptor接口的工作。

如有翻译不准确的地方,希望指正更改~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: