url-pattern
本次项目的webapp结构
本次项目的index.jsp 注意:我们加入了jQuery(在js目录下哦)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.5.1.js"></script>
</head>
<body>
<p>访问静态资源</p>
<form action="some.do" method="post">
姓名:<input type="text" name="name">
年龄:<input type="text" name="age">
<input type="submit" value="提交参数">
</form>
<br/>
<img src="images/p3.jpg" alt="我是一个静态资源,不能显示">
</body>
</html>
本次项目的控制器
@RequestMapping(value = "/some.do" )
public ModelAndView doSome(String name,Integer age){
System.out.println("doSome():"+name+"=="+age);
ModelAndView mv=new ModelAndView();
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("show");
return mv;
}
其他(略)
在web.xml中有如下配置,代表指定后缀的请求都交给指定的中央调度器进行处理
在我们的web工程中,jsp是由DispatcherServlet(中央调度器)来处理,而静态资源(如html,js和图片等等)都是由tomcat来处理的。tomcat的安装目录下的conf的web.xml文件有一个叫default的servlet,这个servlet在服务器启动时创建
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern> 表示静态资源和未映射的请求都这个default处理
</servlet-mapping>
这个DefaultServlet作用
- 处理静态资源
- 处理未映射到其它servlet的请求
上面
DefaultServlet
中的<url-pattern>
的斜杠就是代表静态资源和未映射请求,我们可以在<url-pattern>
改成/
,这样就会代替tomcat的DefaultServlet,这样不用很繁琐地写很多个<url-pattern>
,比如<url-pattern>*.do</url-pattern>
等等,但是这样无法访问静态资源了;那如何在这种情况下还能处理静态资源呢?下面有两个处理静态资源的方法
一、使用<mvc:default-servlet-handler/>
在spring的配置文件中加入这个标签后,框架回创建控制器对象
DefaultServletHttpRequestHandler
(类似我们自己创建的MyController
)DefaultServletHttpRequestHandler
这个对象可以把接收的请求转发给tomcat的defaultservlet
二、使用<mvc:resources/>
(掌握)
在spring的配置文件中加入这个标签后,框架回创建控制器对象
ResourceHttpRequestHandler
,让这个对象来处理目标静态资源,这种方法不依赖于服务器,相对来说更常用
<mvc:resources mapping="/images/**" location="/images/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
访问效果
当然,还有个一次性配置完的方法,先早webapp下创建一个叫static的文件夹,然后把静态资源都放在里面,再加上
<mvc:resources mapping="/static/**" location="/static/"/>
即可;用这种方式别忘了调用静态资源时要在前面加上static/
需要特别注意,不管是使用<mvc:default-servlet-handler/>
还是<mvc:resources/>
,都会和RequestMapping发生冲突,所以我们要在配置文件中加入注解驱动<mvc:annotation-driven/>