配置
Spring
环境公共设置的
applicationContext.xml
文件放在
/WEB-INF/
目录下,
首先定义视图类型为
Jstl
,并约定
JSP
文件的默认保存路径,配置异常捕获处理
Bean
,当系统发生异常时,自动重新定向到
error.jsp
文件显示异常内容。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--
返回的视图资源的前缀和后缀,基于
Jstl
模板
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
</bean>
<!--
启动加载异常处理的类,用于监听各模块中触发的异常
-->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="error.jsp"/>
</bean>
</beans>
|
在
applicationContext.xml
文件中加入下面配置,首先加载数据库配置文件
jdbc.properties
,然后配置数据源,此处使用的是
TOMCAT
自带的数据库连接池实现,其实就是
Apache DBCP
连接池的重新封装。
<!--
加载
properties
配置文件
-->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/jdbc.properties</value>
</list>
</property>
</bean>
<!--
数据源
-->
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" destroy-method="close">
<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>
|
jdbc.properties
文件在
/WEB-INF/
目录下:
jdbc.driverClassName=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:oradb
jdbc.username=demo
jdbc.password=123456
|
在
applicationContext.xml
文件中加入下面配置,数据库事务管理,采用的是
AOP
代理,对所有文件名称以
Logic
结尾的接口类进行事务代理。在接口类中,方法名称以
insert
、
update
等开头的采用事务管理,设置
Propagation
为
REQUIRED
表示支持当前事务,如果当前没有事务,就新建一个事务;而其他的方法以
*
表示,设置
Propagation
为
SUPPORTS
表示支持当前事务,如果当前没有事务就以非事务方式执行,
read-Only
为
true
表示对应事务被最优化为只读事务。
<!--
事务管理器
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--aop
代理,对所有以
Logic
为后缀文件名的接口类进行代理
-->
<aop:config>
<aop:advisor pointcut="execution(* *..*Logic.*(..))" advice-ref="txAdvice"/>
</aop:config>
<!--
数据库事务代理,对类中的指定前缀的方法进行事务控制
-->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="upload*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
|
pointcut
的语法说明如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)
Ø
除了返回类型模式、名字模式和参数模式以外,所有的部分都是可选的;
Ø
返回类型模式(
ret-type-pattern
)决定了方法的返回类型必须依次匹配一个连接点,返回类型模式
*
代表了匹配任意的返回类型;
Ø
名字模式(
name-pattern
)匹配的是方法名,可以使用
*
通配符作为所有或者部分命名模式;
Ø
参数模式(
param-pattern
)稍微有点复杂,
()
匹配了一个不接受任何参数的方法,而
(..)
匹配了一个接受任意数量参数的方法(零或者更多),模式
(*)
匹配了一个接受一个任何类型的参数的方法,模式
(*,String)
匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是
String
类型。
下面给出一些常见切入点表达式的例子。
Ø
任意公共方法的执行:
execution(public * *(..))
;
Ø
任何一个以“
set
”开始的方法的执行:
execution(* set*(..))
;
Ø
AccountService
接口的任意方法的执行:
execution(* com.xyz.service.AccountService.*(..))
;
Ø
定义在
service
包里的任意方法的执行:
execution(* com.xyz.service.*.*(..))
;
Ø
定义在
service
包或者子包里的任意方法的执行:
execution(* com.xyz.service..*.*(..))
;
表达式
execution(* *..BookManager.save(..))
的解读:
Ø
第一颗
*
代表
ret-type-pattern
返回值可任意;
Ø
*..BookManager
代表任意
Pacakge
里的
BookManager
类,如果写成
com.xyz.service.*
则代表
com.xyz.service
下的任意类,
com.xyz.service..* com.xyz.service
则代表
com.xyz.service
及其子
package
下的任意类;
Ø
save
代表
save
方法,也可以写
save*
代表
saveBook()
等方法;
Ø
(..)
匹配
0
个参数或者多个参数的,任意类型,
(x,..)
第一个参数的类型必须是
X
,
(x,,,s,..)
匹配至少
4
个参数,第一个参数必须是
x
类型,第二个和第三个参数可以任意,第四个必须是
s
类型。
控制器的配置文件为servlet-xxx.xml,xxx为URI请求的扩展名,此文件可以在web.xml中配置,如果不配置,spring默认查找的是xxx-servlet.xml文件,前后调转一下可方便很多的同类文件排序查看。
如果配置了多个处理器映射,并且配置了对同一请求的处理,那么哪个处理器映射(BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping)会被优先查找映射关系呢?最好的方法是配置order属性,DispatcherServlet 按顺序采用映射处理器,数值小的会被优先匹配。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<import resource="applicationContext.xml"/>
<bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="order" value="0"/> </bean>
<bean name="/mainpage.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController"> <property name="viewName" value="mainpage.jsp"/> </bean>
<!--无拦截请求--> <bean id="noInterceptors" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="order" value="2"/> <property name="mappings"> <props> <prop key="login.do">doController</prop> </props> </property> </bean>
<!--有拦截请求--> <bean id="hasInterceptors" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="order" value="1"/> <property name="interceptors"> <list> <ref bean="authInterceptor"/> </list> </property> <property name="mappings"> <props> <prop key="enter.do">doController</prop> <prop key="logout.do">doController</prop> </props> </property> </bean>
<!--
请求与方法映射控制器
-->
<bean id="doController" class="com.fyyk.core.LogicController">
<property name="logicClass" ref="doLogic"/>
<property name="uriMethodMapping">
<props>
<prop key="login">login</prop>
<prop key="enter">enter</prop>
<prop key="logout">logout</prop>
</props>
</property>
</bean>
</beans>
|
逻辑类的配置文件为
applicationContext-xxx.xml
,此文件可以在
web.xml
中配置,如
applicationContext-admin.xml
文件,也可以配置合并在
applicationContext.xml
中:
<bean id="authInterceptor" class="com.fyyk.interceptor.AuthInterceptor">
<property name="noLoginRedirect" value="/WEB-INF/jsp/noLogin.jsp"/>
</bean>
<bean id="doLogic" class="com.fyyk.logic.DoLogicImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
|