在上一篇博客使用静态路径问题时,出现了No mapping found for HTTP request with URI这种错误,对这个问题有了进一步 体会
问题描述
具体如下
WARN 2019-05-23 22:19:12,926 org.springframework.web.servlet.DispatcherServlet: No mapping found for HTTP request with URI [/SongSSM/WEB-INF/page/admin/login.html] in DispatcherServlet with name 'springDispatcherServlet'
如图
在console控制台错误信息
问题描述
项目controller文件下代码
package com.song.controller;
@Controller
@RequestMapping("/userController")
public class Login {
@RequestMapping("/AdminLogin")
public String AdminLogin(){
return "admin/login";
}
}
web.xml 文件代码,只贴出关于spring-mvc的部分
<!-- SpringMVC配置 -->
<!-- 注意:/ 会匹配所有url,但不包括 * .jsp,* .html,* .js这样的文件这样的文件。也就是*.jsp不会进入Spring的DispatcherServlet
,所以需要在springmvc中来加载指定静态资源文件,之后在配置springmvc配置文件中会解释 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
spring-mvc.xml 中的代码
<!-- 启用spring mvc 注解 -->
<context:annotation-config />
<mvc:annotation-driven />
<!-- springmvc配置文件,包含网站的跳转逻辑的控制 -->
<context:component-scan
base-package="com.song.controller" />
解决方案一、不适用 激活 Tomcat 的 defaultServlet 来处理
对于这个错误,在spring-mvc中所加载的配置有错误,其他保持不变,将spring-mvc.xml 配置改为
<!-- 启用spring mvc 注解 -->
<!-- 另一种方式两个标准配置使用这种方式在web.xml 中不需要配置 激活 Tomcat 的 defaultServlet 来处理静态资 -->
<mvc:default-servlet-handler />
<mvc:annotation-driven />
<!-- springmvc配置文件,包含网站的跳转逻辑的控制 -->
<context:component-scan
base-package="com.song.controller" />
运行结果
解决方案二,使用激活 Tomcat 的 defaultServlet 来处理
其他保持不变,更改web.xml配置,在<!-- SpringMVC配置 -->上面加上如下信息
<!-- 正常拦截html,js,cssSpringMVC配置 激活 Tomcat 的 defaultServlet 来处理静态资源 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!-- SpringMVC配置 -->
<!-- 注意:/ 会匹配所有url,但不包括 * .jsp,* .html,* .js这样的文件这样的文件。也就是*.jsp不会进入Spring的DispatcherServlet
,所以需要在springmvc中来加载指定静态资源文件,之后在配置springmvc配置文件中会解释 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
运行结果
注:
这是对于没有加入到到mapping控制器错误的两种解决方案,里面的原理以及逻辑问题,还不是太明白,但是在代码中都有具体的注解,还是比较清楚的。
参考的资料如下: