posts - 60, comments - 116, trackbacks - 1, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          單獨使用Spring建立簡易開發框架(五)

          Posted on 2007-09-11 23:10 匪客 閱讀(1943) 評論(3)  編輯  收藏 所屬分類: 開發技術

          6. Spring 配置

          6.1. 視圖配置

          配置 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>

          6.2. 數據庫連接

          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

          6.3. 數據庫事務

          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 類型。

          6.4. 控制器配置

          控制器的配置文件為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>

          6.5. 邏輯類配置

          邏輯類的配置文件為 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>


          評論

          # re: 單獨使用Spring建立簡易開發框架(五) [未登錄]  回復  更多評論   

          2007-09-12 13:53 by Jerry
          Oracle 還能換成MySQL啊?

          # re: 單獨使用Spring建立簡易開發框架(五)   回復  更多評論   

          2007-09-12 14:40 by James.Q
          框架本身是沒有問題的,對各種數據庫支持都可以,只是在寫業務SQL的時候需要主意,沒法兼容,另外翻頁的時候也是有針對性的。

          # re: 單獨使用Spring建立簡易開發框架(五) [未登錄]  回復  更多評論   

          2009-09-01 17:27 by 小馬
          你總在牛A與牛C之間徘徊,~\(≧▽≦)/~

          主站蜘蛛池模板: 祁阳县| 长治市| 宜都市| 高密市| 南投市| 景泰县| 潞城市| 虹口区| 鄱阳县| 大洼县| 柯坪县| 鄢陵县| 庄浪县| 内黄县| 务川| 恩平市| 盘锦市| 蓬溪县| 鸡东县| 建水县| 禄劝| 平潭县| 扶风县| 康保县| 休宁县| 轮台县| 安新县| 赣榆县| 隆安县| 泸州市| 名山县| 岳阳县| 昂仁县| 靖边县| 象州县| 宣恩县| 秭归县| 靖江市| 青河县| 桐梓县| 宝丰县|