一、web.xml中的配置
web.xml总结:
1、web.xml学名叫部署描述符文件,是在Servlet规范中定义的,是web应用的配置文件;
1、java web的三大组件(Servlet、Filter、Listener),也就是我们在web.xml配置文件中看到的配置标签;
2、web.xml的加载顺序是:<context-param>-><listener>-><filter>-><servlet>。
1、定义contextConfigLocation初始化参数
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:conf/spring/spring-ds.xml,
classpath*:conf/spring/spring-mybatis.xml,
classpath*:conf/spring/spring-base.xml,
classpath*:conf/spring/spring-kafka.xml,
classpath*:conf/spring/spring-mq.xml,
classpath*:conf/spring/spring-impl.xml
</param-value>
</context-param>
说明:
① <param-value>标签中定义的是服务器启动时初始化装载的spring配置文件,一般用于加载除Web层的Bean(如DAO、Service等)
② ServletContextListener进行加载时,会查找<param-name>为contextConfigLocation的参数文件进行加载,若未配置contextConfigLocation,默认WEB-INF/下的applicationContext.xml 文件。
③ 可通过通配符来简化,classpath*:conf/spring/spring-*.xml
2、定义Listener监听器
<listener>
<listenerclass>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
说明:
① 使用ContextLoaderListener类定义监听器,与<param-name>contextConfigLocation</param-name>配合使用,获取其设置的参数值并进行加载
3、定义Filter过滤器
编码过滤器配置:
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
补充扩展:
① 作用域:在请求和响应对象在Servlet处理之前和之后,上面配置了编码格式,保证出入参数的编码格式
② 由于现在前后端分离,包括静态资源部署到CDN服务器,都带来跨域访问的问题,使用jsonp及cors过滤器可解决跨域问题
③ 防止常见XSS 过滤 SQL注入 JAVA过滤器filter
4、配置<servlet-name>default</servlet-name>
原因:
如何你的DispatcherServlet拦截".do"这样的有后缀的URL,就不存在访问不到静态资源的问题。
如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对.js,.jpg等静态文件的访问也就被拦截了
**作用:**对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理,不会因为找不到静态文件报404。
**注意:**要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,性能是最好。
不同容器的默认servlet-name是不同的,以下为列表
Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default"
Google App Engine 自带的 默认Servlet的名字 -- "_ah_default"
Resin 自带的 默认Servlet的名字 -- "resin-file"
WebLogic 自带的 默认Servlet的名字 -- "FileServlet"
WebSphere 自带的 默认Servlet的名字 -- "SimpleFileServlet"
配置如下:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</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>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ico</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>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
补充扩展:
5、配置DispatcherServlet
<servlet>
<servlet-name>cosm-admin</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:conf/spring/spring-servlet.xml,
classpath:conf/spring/spring-resolver.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cosm-admin</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
作用:
1、DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。
说明:
① **contextConfigLocation:**指明了初始化配置文件的文件名,不使用默认配置文件名;若未指定,则默认在WEB-INF文件夹下寻找名为[servlet-name]-servlet.xml。特别强调的是:如果未指定配置文件,则配置文件应放在WEB-INF文件夹下。
两处加载spring配置文件的区别:
a.ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;
b.DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。
② <load-on-startup>1</load-on-startup>是启动顺序,让这个Servlet随Servletp容器一起启动