首先看个index.jsp首页的代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
<script src="js/jquery.min.js"></script>
<script>
$(function(){
$("#btn").click(function(){
alert("hello btn");
});
});
</script>
</head>
<body>
<br/>
<button id="btn">提交</button>
</body>
</html>
页面代码很简单,就一个简单的按钮,点击弹出“hello btn”这样一个事件。但在没有配置静态资源过滤器的情况下,springMVC会拦截掉jquery.min.js
文件的加载,让这样简单的一个需求都实现不了。
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在上述DispatcherServlet
的配置中,我们默认该控制器会控制所有资源,所有请求。页面在加载过程中,需要请求静态资源的js文件,而这一请求被该控制器所拦截,所以demo的效果就是点击按钮没有任何反应,跟没有引入js文件是一个效果。
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
在springmvc.xml文件中加入以上三个资源映射,当然具体的文件名可以与上面的不一样。这样可以在加载js文件的时候,跳过DispatcherServlet的控制。当然还有其它方法可以实现,比如在DispatcherServlet前加上defaultServlet,先对js等静态资源进行拦截,这样该类请求就不会交由springmvc处理了。
这里提一下误区,上面提到的js/css/images
三个Directory静态资源目录,千万千万不能建在WEB-INF
目录下,这种目录在配置文件中识别不了,并且mvc:resources
会显示红色。直接创建在webapp
下面,让该类目录与WEN-INF
平级。
设置有效的资源目录,在springmvc.xml
文件中不会出现红色的报错,另外,映入的js文件,通过ctrl
+鼠标左键可以直接访问查看。