介绍SpringMVC中的handlerMappings对象用法的完整攻略如下:
什么是handlerMappings对象
handlerMappings对象是Spring MVC中的一个重要组件,负责将请求映射到对应的控制器处理器(handler)上。它是一个接口,定义了获取HandlerExecutionChain对象的方法。
HandlerExecutionChain对象是什么
HandlerExecutionChain对象是包装HandlerMethod对象的容器对象。它包含了处理器的所有拦截器对象,并提供了执行拦截器和执行处理器的方法。
如何使用handlerMappings对象
在SpringMVC中使用handlerMappings对象的过程如下:
第一步:在配置文件中定义handlerMappings对象
在SpringMVC的配置文件中定义handlerMappings对象。可以使用DefaultAnnotationHandlerMapping作为handlerMappings对象的实现,该实现会扫描所有带有@Controller注解的Bean,找到其中带有@RequestMapping注解的方法,并将其注册为处理请求的handler。
例如,在SpringMVC配置文件中进行如下配置:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
第二步:将handlerMappings对象注入到DispatcherServlet中
在DispatcherServlet中定义一个handlerMappings属性,并添加@Autowired注解注入handlerMappings对象。
例如,在DispatcherServlet配置文件中进行如下配置:
<bean class="org.springframework.web.servlet.DispatcherServlet">
<property name="handlerMappings">
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
</property>
</bean>
第三步:使用handlerMappings对象
通过handlerMappings对象的getHandler方法获取对应的HandlerExecutionChain对象。然后,可以使用HandlerExecutionChain对象的getInterceptors方法获取所有的拦截器对象,使用execute方法执行拦截器和处理器对象。
例如,在处理请求时可以进行如下代码编写:
HandlerExecutionChain chain = handlerMappings.getHandler(request);
Object handler = chain.getHandler();
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
// 获取拦截器列表
List<Object> interceptors = chain.getInterceptors();
// 执行拦截器
for (Object interceptor : interceptors) {
((HandlerInterceptor) interceptor).preHandle(request, response, handlerMethod);
}
// 执行处理器
ModelAndView mav = handlerAdapter.handle(request, response, handlerMethod);
// 执行拦截器
for (Object interceptor : interceptors) {
((HandlerInterceptor) interceptor).postHandle(request, response, handlerMethod, mav);
}
}
示例
下面提供两个示例说明handlerMappings对象的使用:
示例一:全局拦截器
使用handlerMappings对象定义一个全局拦截器,拦截所有请求,并在拦截前后输出日志。
- 在SpringMVC配置文件中定义handlerMappings对象
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
- 将handlerMappings对象注入到DispatcherServlet中
<bean class="org.springframework.web.servlet.DispatcherServlet">
<property name="handlerMappings">
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
</property>
<property name="interceptors">
<list>
<bean class="com.example.interceptor.LogInterceptor"/>
</list>
</property>
</bean>
- 定义一个全局拦截器
public class LogInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("before handling request");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("after handling request");
}
}
示例二:动态添加handlerMappings对象
动态添加一些handlerMappings对象,将不同的请求映射到不同的处理器上。
- 创建handlerMappings对象
public class TestHandlerMapping extends AbstractUrlHandlerMapping {
private Map<String, Object> handlerMap;
public TestHandlerMapping() {
handlerMap = new HashMap<>();
handlerMap.put("/test1", new Test1Controller());
handlerMap.put("/test2", new Test2Controller());
}
protected Object getHandlerInternal(HttpServletRequest request) throws Exception {
String requestUri = getUrlPathHelper().getLookupPathForRequest(request);
return handlerMap.get(requestUri);
}
}
- 在SpringMVC配置文件中动态添加handlerMappings对象
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<bean class="org.springframework.web.servlet.DispatcherServlet"
init-method="initServletBean">
<property name="handlerMappings">
<list>
<bean class="com.example.handler.TestHandlerMapping"/>
</list>
</property>
</bean>
</property>
<property name="targetMethod" value="onRefresh"/>
</bean>
这个示例中,我们动态创建了一个TestHandlerMapping对象,并将其添加到DispatcherServlet的handlerMappings列表中。该TestHandlerMapping对象会根据请求的URI动态选择一个处理器进行处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC中的handlerMappings对象用法 - Python技术站