运行 SpringMVC 项目时,JSP 的代码报错:
代码语言:javascript复制ReferenceError: $ is not defined
JSP 相关代码如下:
代码语言:javascript复制...
<script src="js/jquery-3.3.1.min.js"></script>
<script>
$("#btn").on("click", function () {
$.ajax({
type: "post",
url: "register",
data: $("form").serialize(),
success: function (data) {
console.log(data);
alert("注册成功");
},
error: function (xhr, type, errorThrown) {
console.log("xhr:" xhr " type:" type " errorThrown:" errorThrown);
}
});
});
</script>
...
web.xml 文件相关配置如下:
代码语言:javascript复制<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这是因为配置的 DispatcherServlet 的映射路径为 /
时,会覆盖掉 tomcat 的 default 配置,所以需要在 SpringMVC 文件中进行配置,对静态资源进行放行:
...
<!-- 配置放行静态资源 -->
<mvc:default-servlet-handler/>
...
这样,发出静态资源请求后,然后 DispatcherServlet 会对请求进行映射匹配,如果匹配不成功,就会转交给 tomcat 的 default 进行处理。
如果不使用 SpringMVC 框架,这些静态资源请求都会由 tomcat 的 default 进行处理。
Tomcat 的 default 配置为在请求路径匹配完其他所有 Servlet 还是没有匹配到的情况下,请求会被发到 default,由 DefaultServlet 进行处理;一般请求的静态资源,无效路径等等都会通过 DefaultServlet 进行处理。