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


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

  • 相关阅读:
    leetcode目录
    Windows下tuxedo配置
    实习总结
    n人比赛,可轮空,比赛轮数和场数
    Ubuntu中Eclipse安装与配置
    Lunix中文乱码解决方案
    tuxedo入门
    useradd和adduser的区别
    每个位上都是素数
    TUXEDO错误解决方案
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6932667.html
Copyright © 2011-2022 走看看