URL请求映射与Controller处理器参数绑定

还记得以前在配置参数绑定时,视图渲染一直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”作为后缀)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值