1.Handler Interceptor
用Handler Interceptor拦截请求
Servlet API定义的Servlet过滤器可以在Servlet处理每个web请求的前后分别对它进行前置处理和后置处理。你想要在Spring的web应用程序上下文中配置一些类似于过滤器的东西,以使能够利用容器特性。此外,有些时候,你可能只想处理由某些Spring MVC处理程序处理的Web请求,并在这些处理程序返回的模型属性被传递到视图之前,对它们进行一些操作。
Spring MVC允许你通过处理拦截拦截web请求,进行前置处理和后置处理。处理拦截是在Spring的web应用程序上下文中配置的,因此它们可以利用各种容器特性,并引用容器中声明的任何Bean。处理拦截是针对特殊的处理程序映射进行注册的,因此它只拦截通过这些处理程序映射的请求。每个处理拦截都必须实现HandlerInterceptor接口,它包含三个需要你实现的回调方法:preHandle(),postHandle()和afterCompletion()。第一个和第二个方法分别是在处理程序处理请求之前和之后被调用的。第二个方法还允许访问返回的ModelAndView对象,因此可以在它里面操作模型属性。最后一个方法是在所有请求处理完成之后被调用的(如视图呈现之后).
假设你要测量请求处理程序在处理每个web请求时所花的处理时间,可以创建一个定制的处理拦截:
- package com.apress.springrecipes.court.web;
- ...
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
- public class MeasurementInterceptor implements HandlerInterceptor{
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response,Object handler)throws Exception{{
- long startTime = System.currentTimeMillis();
- request.setAttribute("startTime",startTime);
- return true;
- }
- public void postHandle(HttpServletRequest request,HttpServletResponse response,
- Object handler,ModelAndView modelAndView)throws Exception{
- long startTime = (Long)request.getAttribute("startTime");
- request.removeAttribute("startTime");
- long endTime = System.currentTimeMillis();
- modelAndView.addObject("handlingTime",endTime-startTime);
- }
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response,Object handler,Exception ex)throws Exception{
- }
- }
在这个拦截器的preHandler()方法中,你记录了起始时间,并将它保存到请求属性中。这个方法应该返回true,允许DispatcherServlet继续处理请求。否则,DispatcherServlet会认为这个方法已经处理了请求,直接将响应返回给用户。然后,在postHandler()方法中,从请求属性中加载起始时间,并将它与当前时间进行比较。你可以计算总的持续时间,然后把这个时间添加到模型中,传递给视图。最后,afterCompletion()方法无事可做,空着就可以了。
在实现接口时,即使不需要,也必须实现所有的方法。更好的方法是扩展拦截器适配器类。这个类默认实现所有的拦截器方法,你可以只覆盖你需要的方法。
- package com.apress.springrecipes.court.web;
- ...
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
- public class MeasurementInterceptor extends HandlerInterceptorAdapter{
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response,Object handler)throws Exception{
- ....
- }
- public void postHandle(HttpServletRequest request,HttpServletResponse response,
- Object handler,ModelAndView modelAndView)throws Exception{
- ....
- }
- }
在处理程序映射Bean中注册处理拦截,来拦截由这个Bean映射的web请求。你可以在interceptors属性中为处理程序映射指定多个拦截器,该属性是数组类型的。如果在web应用程序上下文中配置了不止一个处理程序映射,并且想要拦截由它们映射的所有请求,就必须在每一个处理程序映射中注册这个拦截器。
- <beans...>
- ...
- <bean id="measurementInterceptor"
- class="com.apress.springrecipes.court.web.MeasurementInterceptor"/>
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="interceptors">
- <list>
- <ref bean="measurementInterceptor"/>
- </list>
- </property>
- ...
- </bean>
- <bean class="org.springframework.web.servlet.mvc.support
- .ControllerClassNameHandlerMapping">
- <property name="interceptors">
- <list>
- <ref bean="measurementInterceptor"/>
- </list>
- </property>
- </bean>
- ....
- </beans>
2.Uricomponent
是一个工具类,帮助我们生成URL。如uriComonentsBuilder类使用方法:
UriComonentsBuilder.fromUriString(XXX).qureyParam(K,V).build().tostring()
相关推荐
if (handler instanceof HandlerMethod && ((HandlerMethod) handler).getMethodAnnotation(CustomAnnotation.class) != null) { // 拦截到带有@CustomAnnotation的方法,这里可以添加自定义逻辑 } return true;...
通过创建一个Handler实例并与Looper(消息循环)关联,我们可以发送和处理Message,从而实现在不同线程间的数据传递和回调。 在Fragment和Activity之间使用Handler,通常涉及以下步骤: 1. **创建Handler实例**:...
- `handler`通常与`Action`对象关联。`Action`允许你创建可重用的行为,它可以被多个组件引用。这有助于代码的复用和模块化。 - `Action`对象具有五个主要属性:`text`(文本内容)、`handler`(处理函数)、`...
`Handler`是Android消息处理机制的核心部分,它与`Looper`和`Message`共同协作,实现了线程间的消息传递。`Handler`通常在主线程(UI线程)中创建,用于接收并处理来自其他线程的消息。 ### 2. Handler工作原理 - ...
基本的`Handler`使用通常涉及到创建`Handler`对象,然后在后台线程中通过`Looper`和`Message`与之交互。以下是一个简单的例子: ```java // 在主线程中创建Handler Handler mHandler = new Handler() { @...
`Handler`通常与`Looper`配合使用,创建一个消息循环,使得`Handler`能够接收到并处理来自其他线程的消息。`Handler`的工作原理是,当创建一个`Handler`对象时,它会与当前线程的`Looper`关联,然后可以发送`Message...
在Android开发中,线程和线程池是处理异步任务的重要工具,而Handler则是用于在主线程和子线程之间通信的关键组件。本篇文章将深入探讨这些概念,以及它们在实际应用中的用法。 首先,让我们理解什么是线程。线程是...
"JobHandler调度器"是一种广泛应用于分布式任务调度的框架,主要设计用于处理大规模并发和定时任务的场景。在这个系统中,JobHandler是核心组件,它负责执行具体的业务逻辑。下面我们将详细探讨JobHandler调度器的...
2. 在HandlerThread内部,创建一个Handler实例,这样Handler就会与HandlerThread的Looper关联。 3. 使用主线程中的Handler实例,通过`sendMessage()`或者`post()`方法发送消息到后台线程的Handler,这些消息会被放入...
这通常在UI线程中完成,因为`Handler`与运行它的线程绑定。创建`Handler`时,可以重写`handleMessage(Message msg)`方法来定义处理消息的方式: ```java Handler handler = new Handler() { @Override public ...
Foxit PDF Preview Handler 是一款专为Outlook 2007设计的插件,它使得用户可以在不离开邮件客户端的情况下预览PDF附件。这款工具极大地提升了处理PDF文档的效率,尤其是在处理大量PDF邮件附件时,避免了频繁打开...
默认情况下,只有一个Looper与主线程关联,这就是为什么通常我们只需要在主线程中初始化Handler。如果需要在工作线程中使用Handler,我们需要手动调用Looper.prepare()和Looper.loop()来启动一个Looper。 消息的...
在Android开发中,Handler是一个至关重要的组件,它与线程、消息队列和Looper紧密关联,用于实现不同线程间的通信。本篇将深入探讨Handler的基本概念、使用方法以及其在多线程环境中的作用。 1. Handler是什么? ...
当我们在主线程中创建一个Handler实例时,这个Handler会自动与当前线程的Looper绑定。我们可以通过Handler发送Message对象到消息队列,Looper会按照先进先出(FIFO)的规则将这些消息传递给Handler来处理。 创建...
在Android开发中,`Handler`是一个至关重要的组件,主要用于处理线程间的通信,尤其是主线程(UI线程)与工作线程之间的交互。本`Handler`推荐用法的示例,旨在帮助开发者理解和掌握如何有效地使用`Handler`来管理...
### Android之Looper、MessageQueue、Handler与消息循环详解 #### 一、概述 在Android开发过程中,消息处理机制是至关重要的部分,它涉及到应用程序如何管理、传递和响应各种事件。本篇文章将深入探讨Android中...
在Android应用开发中,Handler是一种重要的线程通信机制,它与Looper、Message紧密配合,用于在不同的线程间传递消息,解决多线程同步问题。本篇将详细讲解Handler的使用,包括如何创建Handler对象、如何发送和处理...
注意,Handler的生命周期与创建它的上下文(通常是Activity)紧密关联。当Activity销毁时,Handler也应该被清理,否则可能会导致内存泄漏。因此,通常会在Activity的onCreate()方法中创建Handler,在onDestroy()方法...
4. Looper从消息队列中取出Message,检查其目标Handler是否与当前正在运行的Handler匹配。 5. 如果匹配,Looper将调用Handler的`handleMessage(Message msg)`方法处理消息。 源码分析: Handler的`sendMessage...