空空叶博客 学习与开发博客

spring

2017-05-05

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>

上一篇 rest

下一篇 sql

目录