配置
Spring
環(huán)境公共設(shè)置的
applicationContext.xml
文件放在
/WEB-INF/
目錄下,
首先定義視圖類型為
Jstl
,并約定
JSP
文件的默認(rèn)保存路徑,配置異常捕獲處理
Bean
,當(dāng)系統(tǒng)發(fā)生異常時(shí),自動(dòng)重新定向到
error.jsp
文件顯示異常內(nèi)容。
<?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>
?
??? <!--
啟動(dòng)加載異常處理的類,用于監(jiān)聽各模塊中觸發(fā)的異常
-->
??? <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
??????? <property name="defaultErrorView" value="error.jsp"/>
??? </bean>
</beans>
|
在
applicationContext.xml
文件中加入下面配置,首先加載數(shù)據(jù)庫配置文件
jdbc.properties
,然后配置數(shù)據(jù)源,此處使用的是
TOMCAT
自帶的數(shù)據(jù)庫連接池實(shí)現(xiàn),其實(shí)就是
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>
?
<!--
數(shù)據(jù)源
-->
<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
文件中加入下面配置,數(shù)據(jù)庫事務(wù)管理,采用的是
AOP
代理,對(duì)所有文件名稱以
Logic
結(jié)尾的接口類進(jìn)行事務(wù)代理。在接口類中,方法名稱以
insert
、
update
等開頭的采用事務(wù)管理,設(shè)置
Propagation
為
REQUIRED
表示支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個(gè)事務(wù);而其他的方法以
*
表示,設(shè)置
Propagation
為
SUPPORTS
表示支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù)就以非事務(wù)方式執(zhí)行,
read-Only
為
true
表示對(duì)應(yīng)事務(wù)被最優(yōu)化為只讀事務(wù)。
<!--
事務(wù)管理器
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
??? <property name="dataSource" ref="dataSource"/>
</bean>
?
<!--aop
代理,對(duì)所有以
Logic
為后綴文件名的接口類進(jìn)行代理
-->
<aop:config>
??? <aop:advisor pointcut="execution(* *..*Logic.*(..))" advice-ref="txAdvice"/>
</aop:config>
?
<!--
數(shù)據(jù)庫事務(wù)代理,對(duì)類中的指定前綴的方法進(jìn)行事務(wù)控制
-->
<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?)
??
除了返回類型模式、名字模式和參數(shù)模式以外,所有的部分都是可選的;
??
返回類型模式(
ret-type-pattern
)決定了方法的返回類型必須依次匹配一個(gè)連接點(diǎn),返回類型模式
*
代表了匹配任意的返回類型;
??
名字模式(
name-pattern
)匹配的是方法名,可以使用
*
通配符作為所有或者部分命名模式;
??
參數(shù)模式(
param-pattern
)稍微有點(diǎn)復(fù)雜,
()
匹配了一個(gè)不接受任何參數(shù)的方法,而
(..)
匹配了一個(gè)接受任意數(shù)量參數(shù)的方法(零或者更多),模式
(*)
匹配了一個(gè)接受一個(gè)任何類型的參數(shù)的方法,模式
(*,String)
匹配了一個(gè)接受兩個(gè)參數(shù)的方法,第一個(gè)可以是任意類型,第二個(gè)則必須是
String
類型。
?
下面給出一些常見切入點(diǎn)表達(dá)式的例子。
??
任意公共方法的執(zhí)行:
execution(public * *(..))
;
??
任何一個(gè)以“
set
”開始的方法的執(zhí)行:
execution(* set*(..))
;
??
AccountService
接口的任意方法的執(zhí)行:
execution(* com.xyz.service.AccountService.*(..))
;
??
定義在
service
包里的任意方法的執(zhí)行:
execution(* com.xyz.service.*.*(..))
;
??
定義在
service
包或者子包里的任意方法的執(zhí)行:
execution(* com.xyz.service..*.*(..))
;
?
表達(dá)式
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
個(gè)參數(shù)或者多個(gè)參數(shù)的,任意類型,
(x,..)
第一個(gè)參數(shù)的類型必須是
X
,
(x,,,s,..)
匹配至少
4
個(gè)參數(shù),第一個(gè)參數(shù)必須是
x
類型,第二個(gè)和第三個(gè)參數(shù)可以任意,第四個(gè)必須是
s
類型。
控制器的配置文件為servlet-xxx.xml,xxx為URI請(qǐng)求的擴(kuò)展名,此文件可以在web.xml中配置,如果不配置,spring默認(rèn)查找的是xxx-servlet.xml文件,前后調(diào)轉(zhuǎn)一下可方便很多的同類文件排序查看。
如果配置了多個(gè)處理器映射,并且配置了對(duì)同一請(qǐng)求的處理,那么哪個(gè)處理器映射(BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping)會(huì)被優(yōu)先查找映射關(guān)系呢?最好的方法是配置order屬性,DispatcherServlet 按順序采用映射處理器,數(shù)值小的會(huì)被優(yōu)先匹配。
<?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>
??? <!--無攔截請(qǐng)求--> ??? <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>
??? <!--有攔截請(qǐng)求--> ??? <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>
?
??? <!--
請(qǐng)求與方法映射控制器
-->
??? <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>
|