通过上面的分析,可以看到视图解析器是可以省略的,但是在实际中我们会写上,防止文件映射出问题
配置视图解析器
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置视图对jstl标签库的支持 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<!-- 设置逻辑视图名的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 设置逻辑视图名的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
映射路径问题
1)拦截所有请求 <url-pattern>/</url-pattern>
弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。但是这些文件在开发项目的时候肯定是会有的。
优点:将来可以实现REST风格的访问 /user/add
2)自定义拦截请求的后缀名 <url-pattern>/*.action</url-pattern>
拦截*.do、*.html、*.action /user/add.do
这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。
弊端:Controller的后缀只能固定成某一个
将来不便于实现REST风格的访问
3)静态资源的访问,如jpg,js,css
如果DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。
如果DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。
例如:
<link href="static/css/hello.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="static/js/hello.js"></script>
<img alt="none" src="static/images/logo.png">
为了实现实现REST风格的访问,同时让静态资源不被拦截,有以下解决方案
解决方式一:利用Tomcat的defaultServlet来处理静态文件
在web.xml
中放入下面的代码
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</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>*.css</url-pattern>
</servlet-mapping>
或者简写成这样子:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
特点:1.要配置多个,每种文件配置一个。
2.要写在DispatcherServlet的前面(和tomcat版本有关),让defaultServlet先拦截请求,这样请求就不会进入Spring了
3. 高性能。
解决方式二: 使用spring的mvc标签<mvc:resources>
在[servlet-name]-servlet.xml文件中放入下面的代码,新建文件夹static,将图片,js,css这些静态资源都放在一个static目录下
<mvc:resources mapping="/static/images/**" location="/static/images/"/>
<mvc:resources mapping="/static/js/**" location="/static/js/"/>
<mvc:resources mapping="/static/css/**" location="/static/css/"/>
mapping: 映射两个*,表示映射指定路径下所有的URL,包括子路径
*代表下面的资源
**代表下面或者所有的子目录
location:本地资源路径
这样如果有访问/images或者/js或者/css路径下面的资源的时候,spring就不会拦截了
解决方式三: 使用spring的mvc标签<mvc:default-servlet-handler/>标签
在[servlet-name]-servlet.xml文件中放入下面的代码
在spring配置文件中加入此标签配置即可
<mvc:default-servlet-handler/>
总结:
方案一,与tomcat的版本有关
方案二,很清晰直观的知道什么资源不被拦截,一看就知道那些是静态资源(常用的)
方案三,虽然方便,但是想看项目中引入了哪些静态资源不方便