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

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接口的工作。

如有翻译不准确的地方,希望指正更改~

时间: 2024-10-12 15:10:07

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

Spring官方文档翻译——15.1 介绍Spring Web MVC框架

Part V. The Web 文档的这一部分介绍了Spring框架对展现层的支持(尤其是基于web的展现层) Spring拥有自己的web框架--Spring Web MVC,在前两章中会有介绍.剩下的章节则用来介绍Spring和其他web技术的集成,比如Struts和JSF(这里只提两个). 本节以对Spring MVC portlet框架的介绍结尾. 第十五章--Web MVC框架(Web MVC framework) 第十六章--视图技术(View technologie) 第十七章--

Spring官方文档翻译

随笔:有人曾这样评价spring,说它是Java语言的一个巅峰之作,称呼它为Java之美,今天,小编就领大家一起来领略一下spring之美! Spring官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ 声明:此文章大部分转载自唐彤,本人只是在原基础上略作修改,对原文有兴趣的可以戳连接: 在谈spring之前,完美可以先看一下从官网结果来的图(当然是翻译后的啦~),让大家有一

Spring官方文档翻译——5.资源

5. 资源 5.1 简介 使用标准的java.net.URL类和各种URL前缀处理器并不能满足我们对访问底层资源.比如,没有用于访问classpath下或是相对于ServletContext的资源的标准化URL实现类.尽管可以为特定的URL前缀注册新的处理器(类似现有对http:前缀的处理器),但是这通常比较复杂,而且URL接口仍然缺少一些有用的方法,比如可以检查资源是否存在的方法. 5.2 Resource接口 Spring的Resource接口就是要抽象出对底层资源的访问,使之更合适: pu

SpringMVC处理器映射器和方法名称解析器

所谓配置式开发是指,“处理器类是程序员手工定义的,实现了特定接口的类,然后再在SpringMVC配置文件中对该类进行显式的,明确的注册”的开发方式” 1.处理器映射器HandlerMapping HandlerMapping接口负责根据request请求找到对应的Handler处理器即Interceptor拦截器,并将它们封装在HandlerExecutionChain对象中,返回给中央调度器. 其常用的实现类有两种: 01BeanNameUrlHandlerMapping 02SimpleUr

SpringMVC handleMapping 处理器映射器 属性清单

映射器的属性清单 defaultHandler         在映射与所有处理器都不匹配的情况下,指定默认的处理器(处理器即你定义的Controller(action)类) order                        Spring根据order的值对映射器进行排序,并使用第一个匹配的处理器,order值越小优先级越高(相当于链的索引位置,从0开始,0级最高) interceptors             使用的拦截器列表 alwaysUseFullPath 是否使用servl

springmvc03 非注解和注解处理器映射器和适配器

1其它非注解处理器映射器和适配器 1.1BeanNameUrlHandlerMapping(映射器) 根据请求url(XXXX.action)匹配spring容器bean的 name 找到对应的bean(程序编写的Handler) 1.2SimpleUrlHandlerMapping(映射器) <!--简单url映射, 集中配置bean的id对应 的url --> <bean class="org.springframework.web.servlet.handler.Simp

SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 SpringMVC请求流程图 SpringMVC请求流程图语述: request-------->DispatcherServler(中央调度器/前端控制器)-----> HandlerMapping(处理器映射器)------>返回一个执行链----->将执行链转交给HandlerAdap

SpringMVC(8) - 处理器映射

在以前的Spring版本中,用户需要在Web应用程序上下文中定义一个或多个HandlerMapping bean,以将传入的Web请求映射到适当的处理器.通过引入带注解的控制器,就不需要像之前那样定义了,因为RequestMappingHandlerMapping会自动在所有@Controller bean上查找@RequestMapping注解.但是,请记住,从AbstractHandlerMapping扩展的所有HandlerMapping类都具有以下可用于自定义其行为的属性: 拦截器:使用

web2py官方文档翻译03

概述 最美代码 web2py官方文档翻译 2016年2月10日 启动 web2py进来二进制包为Windows和Mac OS x包括Python解释器,所以你不需要预装. 还有一个源代码版本运行在Windows,Mac,Linux和其他Unix系统. Windows和mac OS X的二进制版本包括必要的Python解释器. Python源代码包假设已经安装在电脑上. web2py不需要安装. 首先,解压缩下载的zip文件的特定的操作系统和相应的执行 web2py 文件. 在Windows上,运