今天在写项目时发现一个spring 总是报org.springframework.web.servlet.DispatcherServlet noHandlerFound警告: No mapping found for HTTP request with URI [/myspring/WEB-INF/jsp/index.jsp] in DispatcherServlet with name 'spring' 错误,也就是找不到我的index.jsp 我代码用
@RequestMapping(value="/login2")
public ModelAndView login2(){
return new ModelAndView("index");
}
这样总是无法找到index.jsp,但是下面却没问题,不会报错,
@RequestMapping(value ="/login")
public @ResponseBody String login(){
System.out.println("LLLLL");
return "SSSSSS";
}
最后查询发现是web.xml配置文件问题,把 url-pattern 值“/*”改为“/”如下
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这样就解决我的错误
所以我感觉url映射应该是
<url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url
<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)
下面是找到关于servlet容器对url相关知识,感觉还不错
一、servlet容器对url的匹配过程:
在web.xml文件中,以下语法用于定义映射:
1)
2)
3)“/” 是用来定义default servlet映射的。
4)剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断。