zoukankan      html  css  js  c++  java
  • 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接口的工作。


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

  • 相关阅读:
    hdu 5646 DZY Loves Partition
    bzoj 1001 狼抓兔子 平面图最小割
    poj 1815 Friendship 最小割 拆点 输出字典序
    spoj 1693 Coconuts 最小割 二者取其一式
    hdu 5643 King's Game 约瑟夫环变形
    约瑟夫环问题
    hdu 5642 King's Order
    CodeForces 631C Report
    1039: C语言程序设计教程(第三版)课后习题9.4
    1043: C语言程序设计教程(第三版)课后习题10.1
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6932667.html
Copyright © 2011-2022 走看看