还记得以前在配置参数绑定时,视图渲染一直404- -、,注解的映射器和适配器没问题,扫描Controller包配置也没问题,视图逻辑名,请求路径都检查过很多遍,最后发现,竟然是视图解析器没配置好!!崩溃!!!排除故障后,正确运行,算是当初踩过的一个大坑。
请求映射
在前面配置注解的处理器映射器和适配器时,我用的是简写方式,即使用标签:
<mvc:annotation-driven></mvc:annotation-driven>
该标签默认加载的时RequestMappingHandlerMapping和RequestMappingHandlerAdapter。当然你也可以选择手动配置映射器和适配器的方式:
<!-- 注解形式配置映射器和适配器 -->
<!-- 注解形式的处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 注解形式的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
由Spring MVC的各个组件来看,Handler处理器和View视图这两个模块是程序员需要编写的,尤其是进行业务逻辑处理的Handler。在使用了注解的处理器映射器和适配器配置后,我们就可以在自己编写的Handler处理器模块,即Controller类上面,使用@Controller注解,以此来标识这个类是一个Handler处理器类,在Handler中,我们就要编写处理请求的实现方法。
在前面的Spring MVC工作流中我们知道,前端控制器DispatcherServlet在请求完处理器映射器HandlerAdapter后,会带着一个返回的Handler(或者说执行链),去请求处理器适配器HandlerAdapter,处理器适配器通过自己的supports(Object handler)方法,判断是否支持这个类型的Handler。那么处理器适配器是根据什么来判断支不支持这个Handler的呢?来看看这个判断的过程:
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
public boolean supports(Object handler) {
return getMethodResolver(handle).hasHandlerMethods();
}
public final boolean hasHandlerMethods() {
return !this.handlerMethods.isEmpty();
}
对于每一个处理器适配器,都要实现HandlerAdapter接口,由上面源码可以看到,supports()方法会去判断Handler处理器中是否至少存在一个实现方法,当存在至少一个时,则表明支持。
知道了处理器适配器是根据存在方法判断是否支持Handler处理器后,最后一个问题,处理器映射器是如何判断使用哪一个Handler处理器的呢?在注解的处理器映射器中,答案是使用@RequestMapping注解。
@RequestMapping
@RequestMapping注解的作用是将用户的HTTP请求,映射到可以处理该请求的Handler处理器中,即制定了某一个Handler可以处理那些URL请求。@RequestMapping注解提供的配置参数有很多,例如name属性指定映射器的名称,method属性指定请求方法的类型,params属性指定请求的参数,value和path属性指定映射路径等。这里我们拿value属性举例,因为它是一个十分常用到的属性配置。@RequestMapping注解可以放在Handler处理器类上,也可以放在类中的具体实现方法上,或者同时放在类与方法上都可以。
当@RequestMapping注解放到处理器类上时,表示的是一个前置请求路径,例如配置@RequestMapping(value=“/user”),那么我们就可以通过请求路径:(这是我的配置路径,以“.action”作为后缀)