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

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

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

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

    Part V. The Web 文档的这一部分介绍了Spring框架对展现层的支持(尤其是基于web的展现层) Spring拥有自己的web框架--Spring Web MVC.在前两章中会有介绍. ...

  2. Spring官方文档翻译(1~6章)

    Spring官方文档翻译(1~6章) 转载至 http://blog.csdn.net/tangtong1/article/details/51326887 Spring官方文档.参考中文文档 一.S ...

  3. Spring官方文档翻译

    随笔:有人曾这样评价spring,说它是Java语言的一个巅峰之作,称呼它为Java之美,今天,小编就领大家一起来领略一下spring之美! Spring官方文档:http://docs.spring ...

  4. Spring官方文档翻译(转)

    http://blog.csdn.net/tangtong1/article/details/51326887 http://blog.csdn.net/tangtong1/article/detai ...

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

    所谓配置式开发是指,“处理器类是程序员手工定义的,实现了特定接口的类,然后再在SpringMVC配置文件中对该类进行显式的,明确的注册”的开发方式” 1.处理器映射器HandlerMapping Ha ...

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

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

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

    1其它非注解处理器映射器和适配器 .1BeanNameUrlHandlerMapping(映射器) 根据请求url(XXXX.action)匹配spring容器bean的 name 找到对应的bean ...

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

    映射器的属性清单 defaultHandler         在映射与所有处理器都不匹配的情况下,指定默认的处理器(处理器即你定义的Controller(action)类) order        ...

  9. 《SpringMVC从入门到放肆》四、SpringMVC配置式开发(处理器映射器)

    上一篇我们讲解了DispatcherServlet的url-pattern配置详解,今天我们来真正对SpringMVC进行配置式开发.所谓配置式开发是指“处理器类是程序员自己定义的.实现了特定接口的类 ...

随机推荐

  1. the prblem 3n+1

    题目描述计算机科学中的问题通常被归类为属于某一类问题(例如,NP,不可解,递归).在这个问题中,您将分析算法的属性,该算法的分类对于所有可能的输入都是未知的. 考虑下面的算法: 1.输入n 2.输出n ...

  2. Java可以远程操作服务器的协议笔记

    1.SCPClient(本地复制到远程.远程复制到本地.目前未看到可以远程操作文件) 2.SMB协议(可以远程操作文件:新增.修改) 3.SFTPv3Client(可以远程操作文件:新增.修改)

  3. input标签type为number时,输入小数,在Firefox浏览器上输入框标红的问题

    问题一:firefox 下 默认情况 <input   type="number"> 只允许输入整数,输入小数时会报错,输入框被标红 这时候可以添加参数 step=&q ...

  4. [HNOI2004]打砖块(敲砖块)

    题目:codevs1257.洛谷P1437 题目大意:有一些砖块呈倒三角形状,每块砖敲掉后有一个分数.除第一行外,敲掉一块砖必须先把上面两块砖敲掉.现在你能敲m块砖,求能得到的最大分数. 解题思路:此 ...

  5. pytorch 2 variable 变量

    import torch from torch.autograd import Variable tensor = torch.FloatTensor([[1, 2], [3, 4]]) variab ...

  6. 【BZOJ 1588】 [HNOI2002]营业额统计

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每天的最小波动值指的是和之前所有天的差值的绝对值中的最小值. 用set.的lower_bound函数. 每次找和他差值最小的数字就好 ...

  7. 9种常见的Android开发错误及解决方案

    整理总结了9个Android开发中的错误以及解决方案,共同探讨进步! 1. 如果你的项目的R文件不见的话,可以试下改版本号在保存,R文件不见一般都是布局文本出错导致. 2. 布局文件不可以有大写字母 ...

  8. 深入C++ new/delete,malloc/free解析

    深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...

  9. Linux经常使用命令(九) - cat

    cat命令的用途是连接文件或标准输入并打印.这个命令经常使用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1. 命令格式: cat [选项] 文 ...

  10. Vue小技巧,如何导入普通JS文件

    最近在开发一个展示3D模型的WEB程序,在工程中使用了VUE和ThreeJS库.Three.js本身是支持CommonJS的,但我们还用到了OBJLoader模块,此模块不支持CommonJS,改成C ...