使用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/>配置,添加此配置后,框架会自动注册RequestMappingHandlerMappingRequestMappingHandlerAdapter(spring3.1以后的版本),就可以处理@RequestMapping

二、不使用@RequestMapping,直接指定控制类,手动<bean name="/hello" class="com.niuwolfs.controller.HelloController"/>注册

public class HelloController implements Controller{

    @Override

    public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse respthrows Exception {

        ModelAndView mv = new ModelAndView();

mv.addObject("msg""hello spring mvc!");

mv.setViewName("hello");

return mv;

    }

}

三、手动注册RequestMappingHandlerMappingRequestMappingHandlerAdapter

<!-- 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等匹配。