使用spring通常配置url-pattern为/时,会代替web服务器的servlet成为default servlet,静态资源无法访问,添加<mvc:default-servlet-handler/>指定web服务器的servlet为default servlet,静态资源就可以访问了。当时访问@RequestMapping("/model")又不能访问了。
原因是:当未配置<mvc:default-servlet-handler/>时,框架会默认注册AnnotaitonMethodHandlerAdapter这个bean,能处理@RequestMapping;配置<mvc:default-servlet-handler/>后,框架注册的HandlerAdapter无法处理@RequestMapping,无法找到controller。解决方案有以下几种:
一、添加<mvc:annotation-driven/>配置,添加此配置后,框架会自动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter(spring3.1以后的版本),就可以处理@RequestMapping。
二、不使用@RequestMapping,直接指定控制类,手动<bean name="/hello" class="com.niuwolfs.controller.HelloController"/>注册
public class HelloController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "hello spring mvc!");
mv.setViewName("hello");
return mv;
}
}
三、手动注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter
<!-- Spring3.1后使用此类配置Handler Mapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- Spring3.1后使用此类配置Handler Adapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
四、不配置<mvc:default-servlet-handler/>,把spring的url-pattern配置为.do等,就不会代替web服务的default servlet了,但是控制器的访问一定要和配置的.do等匹配。
Spring MVC的default-servlet-handler和annotation-driven配置
原文地址:http://wolfs.blog.51cto.com/2123151/1970518