处理器映射( Handler Mapping ) Spring算法prototypeJDKIDEA
程序员文章站
2022-07-06 16:26:26
...
从哪儿来的? 当收到请求时,DispatcherServlet将请求传递给一个 处理器映射 ,让它对请求进行检查 并寻找一条匹配的 处理器执行链 (HandlerExecutionChain),然后DispatcherServlet就会执行定义在这条链中的 处理器 和 拦截器. 呵呵,很简单,就是这样的.
在 处理器映射 中有很强大的一招 : 配置拦截器.包括了处理器执行前,执行后,以及执行前后这三种拦截器.
还可以自定义 HandlerMapping 来支持更多的功能, 比如不仅仅根据请求的URL, 还要根据和请求相关的session状态来选择 处理器。
最常用的 处理器映射,有两个: BeanNameUrlHandlerMapping , SimpleUrlHandlerMapping , 他们都是 AbstractHandlerMapping 的子类. 因此也继承了如下重要属性:
[1] interceptors : 在映射中使用的拦截器的列表.对,是列表,因为在在配置文件中设置的方式是:
<property name="interceptors">
<list>
<ref bean="..."/>
</list>
</property>而且,查了 AbstractHandlerMapping 的原代码,interceptors属性的类型是Object[].
[2] defaultHandler : 默认的处理器. 没有合适的处理器可以匹配请求时,就用它啦.
[3] order : 由于在Spring上下文中可以同时使用多个处理器映射, 就需要一个选择机制了 ( DispatcherServlet需要传递请求给一个 处理器映射 嘛 ). order属性就是干这个事情的.它的值越小,优先级越高.也就被DispatcherServlet选中咯. 同样是查了一下原代码,在 AbstractHandlerMapping 中, 属性 order 被初始化为 Integer.MAX_VALUE , 呵呵,是不是很有想法啊 ,自己一边乐去 !
[4] urlDecode : 这个属性默认为false. 因为HttpServletRequest对象默认返回未解码的请求URI/URL. HttpServletRequest中的请求URL和URI还处于HTTP协议所定义的编码状态,如果你想在 处理器映射 使用它们 发现合适的处理器之前 对URL进行解码,你应该把这个属性设成true (注意这需要JDK 1.4的支持)。解码方法会选用HTTP请求中指定的编码格式,或缺省的ISO-8859-1编码方法。 HTTP请求中一般会声明编码的格式,如果没有的话,默认值是ISO-8859-1。Spring会使用相应的解码算法。
[5] lazyInitHandlers : 这个属性的默认值是false. 该属性允许你设置 是否延迟 singleton处理器的初始化工作 ( prototype处理器的初始化都是延迟的 ) 。
注意:后三个属性只有 AbstractUrlHandlerMapping 的子类才具有哦.
不得不再罗嗦几句 AbstractHandlerMapping 与 AbstractUrlHandlerMapping ,前者继承自 WebApplicationObjectSupport ,并实现了 HandlerMapping 和 Ordered 接口; AbstractUrlHandlerMapping 直接继承了 AbstractHandlerMapping ; BeanNameUrlHandlerMapping 和 SimpleUrlHandlerMapping 都是直接继承 AbstractUrlHandlerMapping .
在 处理器映射 中有很强大的一招 : 配置拦截器.包括了处理器执行前,执行后,以及执行前后这三种拦截器.
还可以自定义 HandlerMapping 来支持更多的功能, 比如不仅仅根据请求的URL, 还要根据和请求相关的session状态来选择 处理器。
最常用的 处理器映射,有两个: BeanNameUrlHandlerMapping , SimpleUrlHandlerMapping , 他们都是 AbstractHandlerMapping 的子类. 因此也继承了如下重要属性:
[1] interceptors : 在映射中使用的拦截器的列表.对,是列表,因为在在配置文件中设置的方式是:
<property name="interceptors">
<list>
<ref bean="..."/>
</list>
</property>而且,查了 AbstractHandlerMapping 的原代码,interceptors属性的类型是Object[].
[2] defaultHandler : 默认的处理器. 没有合适的处理器可以匹配请求时,就用它啦.
[3] order : 由于在Spring上下文中可以同时使用多个处理器映射, 就需要一个选择机制了 ( DispatcherServlet需要传递请求给一个 处理器映射 嘛 ). order属性就是干这个事情的.它的值越小,优先级越高.也就被DispatcherServlet选中咯. 同样是查了一下原代码,在 AbstractHandlerMapping 中, 属性 order 被初始化为 Integer.MAX_VALUE , 呵呵,是不是很有想法啊 ,自己一边乐去 !
[4] urlDecode : 这个属性默认为false. 因为HttpServletRequest对象默认返回未解码的请求URI/URL. HttpServletRequest中的请求URL和URI还处于HTTP协议所定义的编码状态,如果你想在 处理器映射 使用它们 发现合适的处理器之前 对URL进行解码,你应该把这个属性设成true (注意这需要JDK 1.4的支持)。解码方法会选用HTTP请求中指定的编码格式,或缺省的ISO-8859-1编码方法。 HTTP请求中一般会声明编码的格式,如果没有的话,默认值是ISO-8859-1。Spring会使用相应的解码算法。
[5] lazyInitHandlers : 这个属性的默认值是false. 该属性允许你设置 是否延迟 singleton处理器的初始化工作 ( prototype处理器的初始化都是延迟的 ) 。
注意:后三个属性只有 AbstractUrlHandlerMapping 的子类才具有哦.
不得不再罗嗦几句 AbstractHandlerMapping 与 AbstractUrlHandlerMapping ,前者继承自 WebApplicationObjectSupport ,并实现了 HandlerMapping 和 Ordered 接口; AbstractUrlHandlerMapping 直接继承了 AbstractHandlerMapping ; BeanNameUrlHandlerMapping 和 SimpleUrlHandlerMapping 都是直接继承 AbstractUrlHandlerMapping .
上一篇: 一个通用的链接类 JPageUrl
下一篇: Prototype Loader