spring
ContextLoaderListener
一般可以使用ContextLoader来产生ApplicationContext实例,对于web项目来说,还可以通过ContextLoaderListener
来注册:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
ContextLoaderListener会监听contextConfigLocation
变量(默认/WEB-INF/applicationContext.xml
)
contextConfigLocation
变量的值会用(预先定义的)分割符(逗号,分号,空格)来分割,同时支持Ant-style的路径模式,如/WEB-INF/*Context.xml
,/WEB-INF/**/*Context.xml
CharacterEncodingFilter
全名org.springframework.web.filter.CharacterEncodingFilter
,配置如:
<filter>
<filter-name>encodingFilter</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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
PropertyPlaceholderConfigurer
占位符配置
作用: 将属性值从bean的定义里移到Properties
格式的文件中
配置举例:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:com/foo/jdbc.properties"/>
</bean>
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
对应的properties文件里:
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root
PropertyPlaceholderConfigurer
不仅寻找指定的properties文件,如果找不到默认还会寻找系统属性
日志
默认日志
Spring实现日志依赖的方式是: spring-core
(唯一外部)依赖commons-logging
(Jakarta Commons Logging API (JCL)),然后其它spring模块依赖spring-core
commons-logging
有运行时发现算法,用来发现其它日志框架,但经常可能出问题.
替换默认日志
如果要使用slf4j日志框架,则需添加以下依赖(此依赖会自动将slf4j(日志接口)与log4j(日志实现)绑定):
<!--包含slf4j api与log4j api-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.6.2</version>
</dependency>
<!--包含log4j实现-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.6.2</version>
</dependency>
添加了上面的后,日志框架就会自动被commons-logging
运行时发现,但这发现算法可能有问题,为了防止万一,可以把默认的日志关掉(也就是说,一般情况下不关也不会出错),并且为了防止出错(因为依赖被删了),必须同时添加jcl-over-slf4j
(会将Spring原来输出到jcl的日志导向slf4j):
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.3.BUILD-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.5.8</version>
</dependency>
</dependencies>
注解
@RestController
相当于@Controller
+@ResponseBody
解决PUT方法接收不到参数的问题
现象
SpringMvc的Controller中使用@RequestParam来获取请求参数,会发现获取不到form里带的参数
原因
按Spring官方说明: Servlet规定form中的数据对POST方法可用,但对PUT与PATCH方法无用
解决
添加过滤器,此过滤器会拦截content-type为application/x-www-form-urlencoded
的PUT与PATCH请求,并使参数可用:
<filter>
<filter-name>httpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>httpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>