阅读spring 的代码首先从配置文件看起,首先看看 web.xml.
xml 代码
- <context-param>
- <param-name>contextConfigLocationparam-name>
- <param-value>
- /WEB-INF/applicationContext.xml /WEB-INF/schedulingContext-quartz.xml
- param-value>
- <!---->
- <param-value>
- /WEB-INF/applicationContext.xml /WEB-INF/schedulingContext-timer.xml
- param-value>
- -->
- context-param>
这个地方和countires 例子有些不同。这里定义了2个spring需要的配置文件。
其实引申起来,同样可以定义3个,4个多个配置文件。
其中注释掉的 schedulingContext-timer.xml 部分,我们稍后再看看是做什么用的。
xml 代码
- <servlet>
- <servlet-name>imageservlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
- <load-on-startup>2load-on-startup>
- servlet>
- <servlet-mapping>
- <servlet-name>imageservlet-name>
- <url-pattern>/image/*url-pattern>
- servlet-mapping>
这部分代码已经不陌生了,之前的例子我们看过,就是定义servlet的处理。
好,接下来去看看 applicationContext.xml 里面都有什么。
xml 代码
- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="locations">
- <list>
- <value>WEB-INF/jdbc.propertiesvalue>
- <value>WEB-INF/mail.propertiesvalue>
- list>
- property>
- bean>
这个 propertyConfigurer , 从名字就可以看出是读取配置文件的。只不过读取的配置文件不是在代码里用,而是在
当前这个配置文件(applicationContext.xml )里用。再往下看我们就会看到作用。
xml 代码
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
- <property name="driverClass" value="${jdbc.driverClassName}"/>
- <property name="jdbcUrl" value="${jdbc.url}"/>
- <property name="user" value="${jdbc.username}"/>
- <property name="password" value="${jdbc.password}"/>
- bean>
这里定义了一个 datasource, 这里我们就能看到propertyConfigurer的作用了。这个 “${jdbc.driverClassName}”
就是配置文件里定义的。我们可以去看看 jdbc.properties, 就会看到相应的配置。
xml 代码
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource"/>
- bean>
这是定义了一个事务管理的bean, 管理的数据源就是上面定义的 datasource.
xml 代码
- <bean id="imageDatabaseTarget" class="org.springframework.samples.imagedb.DefaultImageDatabase">
- <property name="dataSource" ref="dataSource"/>
- <property name="lobHandler" ref="${imageDatabase.lobHandler}"/>
- bean>
-
-
- <bean id="imageDatabase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="transactionManager" ref="transactionManager"/>
- <property name="target" ref="imageDatabaseTarget"/>
- <property name="transactionAttributes">
- <props>
- <prop key="getImages">PROPAGATION_REQUIRED,readOnlyprop>
- <prop key="streamImage">PROPAGATION_REQUIRED,readOnlyprop>
- <prop key="storeImage">PROPAGATION_REQUIREDprop>
- <prop key="clearDatabase">PROPAGATION_REQUIREDprop>
- props>
- property>
- bean>
这里先定义了一个 imageDatabaseTarget bean, 这个 bean 是具体的业务逻辑处理的类。
下面又定义了一个 imageDatabase 代理的bean, 这个 bean 实现了 imageDatabaseTarget 的事务管理功能。
注意,实际中,我们要使用 imageDatabase 这个 bean, 这样才具有事务管理的功能。
那么,接下来我们来看看 image-servlet.xml .(忘了这个文件怎么来的?去看看 countries 例子。)
xml 代码
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
首先定义了一个 CommonsMultipartResolver, 要上传文件,必须使用 multipartResolver, 当然,你也可以使用
CosMultipartResolver , 只是在 spring 的例子了,把它注释掉了。
xml 代码
- <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
- <property name="resourceLoaderPath" value="WEB-INF/views/"/>
- bean>
- <bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
- <property name="templateLoaderPath" value="WEB-INF/views/"/>
- bean>
- <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
- <property name="suffix" value=".vm"/>
- bean>
这些配置都是 spring 集成 Velocity, Freemarker 的定义。具体信息可以参考
http://www.redsaga.com/spring_ref/2.0/html/view.html#view-velocity
xml 代码
- <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="defaultHandler" ref="imageController"/>
- bean>
-
-
- <bean id="imageController" class="org.springframework.samples.imagedb.web.ImageController">
- <property name="methodNameResolver">
- <bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
- <property name="mappings">
- <props>
- <prop key="/imageList">showImageListprop>
- <prop key="/imageContent">streamImageContentprop>
- <prop key="/imageUpload">processImageUploadprop>
- <prop key="/clearDatabase">clearDatabaseprop>
- props>
- property>
- bean>
- property>
- <property name="imageDatabase" ref="imageDatabase"/>
- bean>
这部分就是配置 url 处理的定义了。
看到这个定义,我打赌 ImageController 一定是继承自 MultiActionController。
这和 countries 例子是一样的用法。
从配置上可以看出,ImageController 会处理四种请求:
图象的列表、显示图片、上传图片、清空数据库(看名字好像是这样?)
好,目前为止,配置文件基本清晰了,下面就该去看代码了!
代码部分不是特别复杂,其中 显示图片,上传图片,我想我们以后会用得到 :)
到时来参考一下也好。
不过,我们好像漏了什么,对,就是 schedulingContext-quartz.xml !
还记得 web.xml 里定义的吧!
从名字我们就能看出,这个是计划任务的一个配置。看来spring 真是包容一切,
连计划任务的功能也提供。
这部分的资料可以参考 http://www.redsaga.com/spring_ref/2.0/html/scheduling.html
不过例子也很经典,以后如果有计划任务功能的需求,看看spring的这个例子也好。