springhibernate源碼
❶ hibernate和spring優缺點以及如何改進
Spring3.1去掉了HibernateDaoSupport類。hibernate4需要通過getCurrentSession()獲取session。並且設置org.springframework.orm.hibernate4.SpringSessionContext(在hibernate3的時候是thread和jta)。緩存設置改為net.sf.ehcache.hibernate.EhCacheProviderorg.hibernate.cache.ehcache.EhCacheRegionFactorySpring對hibernate的事務管理,不論是註解方式還是配置文件方式統一改為:getCurrentSession()事務會自動關閉,所以在有所jsp頁面查詢數據都會關閉session。要想在jsp查詢資料庫需要加入:org.springframework.orm.hibernate4.support.OpenSessionInViewFilter過濾器。Hibernate分頁出現需要設置hibernate結果集滾動false【引自9336703】
角求第三邊;已知三邊求角。) 用反三角
❷ spring+hibernate 事務配置需要依賴什麼jar包
//struts2核心包
2. struts2-core-2.0.11.2.jar
3. //struts2必須 (strust2 webwork的升級,webwork核心包)
4. xwork-2.0.5.jar
5. //struts2必須
6. freemarker-2.3.8.jar
7. //struts2必須
8. ognl-2.6.11.jar
9. //struts2整合Spring插件
10. struts2-spring-plugin-2.0.11.2.jar
11. //Spring整體包
12. spring.jar
13. //Hibernate必須使用,注意此包是包含全部的。
14. hibernate3.jar
15. //如果使用C3P0數據源實現資料庫連接
16. c3p0-0.9.0.4.jar
17. //MysqlJDBC驅動
18. mysql-connector.jar
19. //如果不用,啟動時不會出錯,但使用Dwr時,會拋出異常:java.lang.NoClassDefFoundError: antlr/ANTLRException
20. antlr-2.7.2.jar
21. //如果不用此包,在啟動時會拋出: nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
22. asm.jar
23. //如果不用此包,在啟動時拋出:nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
24. cglib-2.1.3.jar
25. //如果不用此包,在啟動時拋出:nested exception is java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap
26. commons-collections-3.1.jar
27. //這個似乎可以不用的 (用於上傳下載)
28. commons-fileupload-1.2.1.jar
29. //這個就不用說啦,幾乎所有框架都要使用的
30. commons-logging-1.0.4.jar
31. //如果不用此包會拋出:java.lang.NoClassDefFoundError:org/dom4j/DocumentException
32. dom4j-1.6.1.jar
33. //dwr必須
34. dwr.jar
35. //不用此包,在啟動時拋出:java.lang.NoClassDefFoundError:javax/transaction/TransactionManager
36. jta.jar
37. //如果想用junit測試,必須。
38. junit-4.4.jar
❸ spring和hibernate整合是,不聯網就報錯,一鏈接網路,就可以,求高手解答
呵呵,我比較確定的猜跟你的中文路徑有關。
log中前面是D:\學習工具,後面hibernate解析就變成亂碼。file:/D:/%e5%ad%a6%e4%b9%a0%e5%b7%a5%e5%85%b7/Eclipse/eclipse/JAVA-HOME/spring_hibernate_1/bin/hibernate.cfg.xml
明顯hibernate沒有識別轉義的中文。可能在聯網環境中 ,這個file:/D:/%e5%ad%a6%e4%b9%a0%e5%b7%a5%e5%85%b7能被轉義解析,才能被識別。
經驗總結,無論如何不要使用中文或有空格的路徑環境。
❹ spring+struts+hibernate做的項目在控制台不輸出SQL語句
<!-- SessionFactory -->
<bean id="SessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dbSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/lovo/epet/po/PetInfoPO.hbm.xml</value>
</list>
</property>
</bean>
檢查下你配置的位置是否正確吧
❺ 關於spring整合hibernate的時候自動創建表的問題
<prop key="hibernate.hbm2ddl.auto">update</prop>
漏了"hibernate",若沒寫全會被框架認為沒配置,所以不會導出schema;
關於update和create:
(1)update 但schema發生改變時進行更新,比如添加欄位,保留原有數據;
(2)create 每次運行重新創建schema,如果表存在,先刪除再創建,原有數據丟失;
update也會創建表,以下是配置>update<執行的代碼(hibernate的源碼):
if ( table.isPhysicalTable() ) {
TableMetadata tableInfo = databaseMetadata.getTableMetadata(
table.getName(),
( table.getSchema() == null ) ? defaultSchema : table.getSchema(),
( table.getCatalog() == null ) ? defaultCatalog : table.getCatalog(), table.isQuoted()
);
if ( tableInfo == null ) {
script.add(
table.sqlCreateString(
dialect,
mapping,
defaultCatalog, defaultSchema
)
);
}
else {
Iterator<String> subiter = table.sqlAlterStrings(
dialect,
mapping,
tableInfo,
defaultCatalog,
defaultSchema
);
while ( subiter.hasNext() ) {
script.add( subiter.next() );
}
}
Iterator<String> comments = table.sqlCommentStrings( dialect, defaultCatalog, defaultSchema );
while ( comments.hasNext() ) {
script.add( comments.next() );
}
}
}
表若不存在,也會被創建.
❻ spring整合hibernate的事務一直錯誤
SaUserDAO user=(SaUserDAO)context.getBean("userDAOProxy");
context.getBean("userDAOProxy"); 是說從spring環境context中拿出id=userDAOProxy對象.再把這個對象強制轉換成SaUserDAO.
你改成
SaUserDAO user=(SaUserDAO)context.getBean("SaUserDAO");
你把userDAOProxy對象強轉成SaUserDAO,這樣行不?
關鍵是要明白spring做了什麼
你的配置文件sessionFactory有沒有進行配置
SPRING就是一個IOC容器,簡單來講我們平常一般是NEW一個對象.
有了SPRING後,將對象配置在SPRING後,我們就可以從SPRING的容器裡面拿出那些對象了直接用.也就是所謂的注入.
比如說:你在A類中,要調用B類的方法時,通常是new一個B的實例.
用SPRING的話,只用在A中加一個屬性 B b;然後在配置文件中將A的屬性b進行配置就可以了.
<bean id="b" class="B">
<bean id="a" class="wgh.db.A">
<property name="b">
<ref bean="b" />這里的b就是上面的id=b的那個值
</property>
</bean>
關於SPRING的代理
AOP代理
Spring預設使用J2SE 動態代理(dynamic proxies)來作為AOP的代理。 這樣任何介面(或者介面集)都可以被代理。
Spring也可以使用CGLIB代理. 對於需要代理類而不是代理介面的時候CGLIB代理是很有必要的。如果一個業務對象並沒有實現一個介面,默認就會使用CGLIB。
簡單來講,你的類沒有實現介面就得強制使用CGLIB來代理.類實現了介面默認採用JDK的動態代理機制實現AOP.
強制使用CGLIB生成代理.
1在spring配置文件中加入
<aop:aspectj-autoproxy proxy-target-class="true"/>
2 加入CGLIB庫
spring/lib/cglib/*.jar
spring對事務的管理也就是AOP了
推薦你一個不錯的視頻
http://www.verycd.com/topics/93279/
我復制一個我學習時用到的配置文件
Spring與hibernate的集成
要控制事務,就得要拿到hibernate的session. hibernate的session獲得方式:sessionfactory.sessionfactory的創建configuration,configuration的獲得就由配置文件了.Spring整合Hibernate主要是對hibernate的Session進行管理,包含Session的創建、提交、關閉的整個生命周期。此處的session可以看作是一個connection.
聲明式事務的配置
1配置sessionfactory
2配置事務管理器
3配置事務的傳播特性
4配置哪些哪些方法使用事務
<!--配置sessionfactory -->
配置sessionFactory,讓spring來創建Session。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name=" configLocation ">
<value>classpath:hibernate.cfg.xml</value>hibernate的配置文件
</property>
</bean>
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"//只適合xml方式
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean//兼容註解
<!-- 配置事務管理器 -->
把sessionFactory拿過來放到事務管理器里. 創建了一個id為transactionManager的事務管理器,它匹配一個session工廠,<ref bean="sessionFactory"/>這個sessionFactory是指session工廠的ID。
<bean
id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="beanFactory" ref=」 sessionFactory」/>
</bean>
<!-- 配置事務的傳播特性 -->
這里創建了一個advice(通知),對事務管理器進行事務設置,這里意思是指,對於以save、del、update開頭的方法應用事務。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置哪些哪些方法使用事務 -->
配置的作用是把我們上面創建的advice應用到具體的類中。以下代碼的意思指,給包com.spring下的所有類的所有方法應用allManagerMethod()方法.
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.spring.*.*(..))"/>com.spring包下所有的類所有的方法
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>advisor可以理解為一個aspect,一個aspect一般有pointcut,advice.
</aop:config>
你學習這個最好弄懂SPRING的原理
IOC,AOP這些概念原理什麼的
❼ 如何學習hibernate源碼
我來分享一下查看源碼的方法:
查看源碼的首要任務是要有一款上手的工具,這里用的是 IDEA。IDEA 的功能比較強大,包括 查看類結構圖,debug。這兩個是查看源碼的關鍵功能。
查看源碼可以靜態查看和動態查看,靜態查看的方法是查看類圖,還有 ALT + f7 查看方法在哪裡被調用或者類在哪裡被調用。在看 spring 源碼的時候就是用這種方法,不過這種方法對閱讀者的要求比較高,包括要了解這個方法的執行,設計模式的理解,以及框架是如何配置這個類的。第二種方法是 debug。debug 方法是後來才發現的一個重要的 查看源碼的方法,要點是掌握執行棧,就能掌握整個執行流程。比如這個是在debug hibernate 源碼的時候的截圖,可以看到這個執行棧非常深,從 spring-data-jpa 到 hibernate 中間經過好幾層的代理,主要完成一些適配,事務,攔截器等等操作,然後再到 hibernate 核心代碼,最後就是 jdbc 的 statement。方法棧中的每一個方法都是可以查看的,裡面的變數有時候是代理了好幾層,所以要 F7 進去才能看到真正的執行類。
上面是簡單的簡述 mybatis 的 cache 機制的源碼,真正想讓讀者明白的是,debug 如何查看源碼,查看源碼需要抓住一個主題,不然在閱讀龐大的框架的時候會找不著北。
所以,閱讀源碼需要掌握工具使用,debug, 查看類圖,查看方法在哪裡調用,軟知識是要掌握設計模式,對框架的概念有了解。
❽ struts2+spring2.5+hibernate3.0整合問題
高水平、高質量的軟體出來。怎樣是高水平、高質量的軟體?它應當是易於維護、易於適應變更、可重用性好的一個系統。如何做到這一點呢?答案當然是「低耦合、高內聚」了。低耦合就是軟體在構造的時候,各個模塊、各個功能、各個類都不會過度依賴於它周圍的環境。只有這樣,才能使我們的模塊(功能、類)在周圍發生變更時不受影響,做到易於維護和易於適應變更。正因為如此,也使它更易於重用到其它功能類似的環境中,提高了重用性。高內聚則使軟體中的各個模塊(功能、類)能夠各盡其能而又充分合作,也就是對於軟體問題空間中需求的各個功能,系統可以合理地把它分配給各個模塊(功能、類)來共同完成,而不是一個或幾個八面玲瓏、包打天下的超級類一個人完成。而對於該系統中的某一個模塊(功能、類),具有自己高度相關的職責,即該職責中的幾個任務是高度相關的。每一個模塊(功能、類)都決不去完成與自己無關職責的任務。
那麼怎樣能構造一個低耦合、高內聚的系統能,時下最流行的框架結構之一的struts+spring+hibernate為我們提供了方便。使用struts我們可以應用MVC模型,使頁面展現與業務邏輯分離,做到了頁面展現與業務邏輯的低耦合。當我們的頁面展現需要變更時,我們只需要修改我們的頁面,而不影響我們的業務邏輯;同樣,我們的業務邏輯需要變更的時候,我們只需要修改我們的java程序,與我們的頁面無關。使用spring我們運用IoC(反向控制),降低了業務邏輯中各個類的相互依賴。假如類A因為需要功能F而調用類B,在通常的情況下類A需要引用類B,因而類A就依賴於類B了,也就是說當類B不存在的時候類A就無法使用了。使用了IoC,類A調用的僅僅是實現了功能F的介面的某個類,這個類可能是類B,也可能是另一個類C,由spring的配置文件來決定。這樣,類A就不再依賴於類B了,耦合度降低,重用性提高了。使用hibernate則是使我們的業務邏輯與數據持久化分離,也就是與將數據存儲到資料庫的操作分離。我們在業務邏輯中只需要將數據放到值對象中,然後交給hibernate,或者從hibernate那裡得到值對象。至於用Oracle、MySQL還是SQL Server,如何執行的操作,與我無關。
然而我要說的是,即使我們使用了struts+spring+hibernate框架構建我們的軟體,就可以做到「低耦合、高內聚」了嗎?我認為這是遠遠不夠的!我認為我們在使用struts+spring+hibernate框架的時候常常會有以下幾個問題值得改進。
分析與決策1. 編寫DAO的時候不要直接去使用hibernate或spring對hibernate的支持。
現在我們在編寫DAO的時候普遍都是直接繼承spring對hibernate的封裝類HibernateDaoSupport,然後使用該類提供的諸如saveOrUpdate(), saveOrUpdateCopy(), find()等等。另外,在使用excute()方法實現一些更復雜的hibernate功能的時候還會使用hibernate的類,諸如Query, Session, Type等。這樣直接使用spring和hibernate的類存在的問題在於,你的代碼將不得不依賴與spring和hibernate的某個版本。比如說,現在hibernate3出來了,改動挺大,實際上最要命的是包結構,hibernate2的包結構是net.sf.hibernate.*,然而hibernate3是org.hibernate.*。同樣,spring為了支持hibernate3,包名也改為org.springframework.orm.hibernate3.*。假如,你現在新開發一個項目,這沒什麼關系,如果是升級一個項目問題就來了。如果你希望將你的一個項目從hibernate2升級為hibernate3,你不得不修改DAO中所有對hibernate和spring-hibernate的引用。如果你的代碼中出現hibernate2與hibernate3不兼容的方法和類,比如saveOrUpdateCopy()(在hibernate3中已經沒有了),你還將不得不改寫。那麼你可能會說,我不會這樣升級。如果你的軟體生命周期有好多年,hibernate升級到4,升級到5,你還是依然使用hibernate2?如果你以這種方式開發一個平台,你能要求所有使用你平台的軟體項目都只能使用hibernate2?更進一步說,我現在開發一個產品,今後的客戶將是成千上萬。經過1、2年我需要升級了,這時我的升級包有幾十M,幾乎把所有的DAO都換了個遍,這樣的升級無異於重裝。也許,有人會提出另一個方案,在HibernateDaoSupport與DAO中間增加了一個基礎類,這樣將基礎類中的org.springframework.orm.hibernate.support.HibernateDaoSupport,改為了org.springframework.orm.hibernate3.support.HibernateDaoSupport,這樣其下面繼承的DAO就不用改動了。然而在源碼上是小小的改動,但對於類來說,兩個不同版本的HibernateDaoSupport其相關的屬性和方法還是有不少變化,那麼在基礎類重新編譯的同時,你的繼承類重新編譯否。既然已經重新編譯了,因此你的所有DAO在升級的時候依然要打入升級包,問題依然存在。以上問題,究其原因,是我們項目中的DAO依賴於hibernate和spring,因為我們對它們的使用是繼承,是一種很強的關聯,就是一種依賴。我們只需要稍微進行一些調整,就可以解決這個問題,那就是不使用直接繼承,而使用介面進行分離。可以使用Façade模式,先建立一個叫BasicDao的基礎類,從名稱我們可以看出,它是所有DAO的基礎類,實現DAO操作所需的所有諸如save()、delete()、load()、query()等方法,除了一些基本的方法,諸如翻頁查詢、getCount、解析查詢條件形成HQL語句等功能也在這里實現,但是不要使用與hibernate或spring有關的任何方法和類。同時,BasicDao調用一個叫DaoSupport的介面,DaoSupport的介面則是提供持久化所需的基本方法,最原始的元素。然後,我為DaoSupport介面提供各種不同的實現,比如hibernate2的實現DaoSupportHibernateImp、hibernate3的實現DaoSupportHibernate3Imp,整個結構如下圖所示。BasicDao可以使用hibernate或spring提供的方法,但是不是直接使用,而是通過調用DaoSupport的實現類來使用。然而BasicDao到底是使用的那個實現類,我們通過spring的IoC,通過配置文件來決定到底使用哪個實現。同時,BasicDao也不要使用諸如SpringContext的類來實現IoC,而是通過建立setDaoSupport()和getDaoSupport()方法,然後在spring配置文件中建立引用。
2. 編寫Action的時候不要直接使用spring和spring的繼承類
前面我說了應當避免DAO引用spring或hibernate及其繼承類。同樣的事情也發生在Action中。由於Action通常不納入spring的管理,因此Action在通過spring調用某個BUS的時候,往往是去引用一個叫SpringContext的類(spring的類ContextLoaderServlet的繼承類),然後使用它的getBean()方法。如此的使用,我們的Action將依賴與spring。我們同樣可以使用一個叫BasicAction的父類,然後用一個介面來隔離spring。由於Action通常不納入spring的管理,我們通過一個*.property的配置文件來決定介面到底調用哪個實現類。這樣的結構的另一個好處是,我們還可以將所有Action都必須使用的諸如寫日誌、用戶校驗、異常處理都放在父類BasicAction中,提高系統的可維護性。
3. 當BUS需要獲取別的模塊的數據的時候,不要直接去使用該模塊的DAO
我舉一個簡單的例子:我需要設計一個軟體評審的管理軟體,該軟體分為評審組織者制訂評審計劃、評審者分別填寫評審表後由評審組織者匯總評審表、評審組織者製作評審報告。這是一個非常簡單的項目,分成了三個人來完成。但是項目進行快結束的時候卻出現了問題。填寫評審表需要獲得評審計劃中的一些數據,製作評審報告的數據來源於評審表。項目組在開始編程前先開了一次會,大家約定好了各個部分的數據格式及其規則,然後開始工作。然而數天後項目組把各個模塊整合以後發現,系統根本跑不起來,為什麼呢?設計評審計劃的人發現,所有評審計劃應當按照產品編號來進行管理而不是項目編號。由於這個變更,填寫評審表模塊在待評審列表中什麼都無法顯示;同樣,設計評審表的人發現,在一個評審計劃中評審表與評審者不是一對多的關系,而是一對一的關系,因而修改了這兩個表的關聯。因為這樣,在製作評審報告時就不能正確得到評審表數據。其實一個軟體項目在整個進行過程中總是不斷變更。我們需要做的不是去抑制這些變更,而應當是通過軟體的結構去適應這些變更,即是降低各模塊間的依賴(耦合),提高內聚。拿這個實例來說,當評審表需要調用評審計劃的數據的時候,不應當是自己寫一個DAO去調用評審計劃的數據,而應當是調用評審計劃的介面,將這個任務交給評審計劃類來完成。當評審報告需要調用評審表的數據的時候,同樣應當去調用評審表的介面,由評審表來實現。同時,這種調用應當是去調用BUS層的介面。為什麼呢?比如在評審計劃中的一個業務邏輯是只有在評審計劃發布以後才能製作評審表,那麼怎樣才是已發布的評審計劃呢?這個業務邏輯應當由誰來定義?當然是評審計劃。在什麼地方定義?當然是BUS而不是DAO,因為DAO僅僅是實現數據的持久化,而BUS才是實現業務邏輯的地方。既然如此,如果評審表去調用評審計劃的DAO,那麼已發布評審計劃的業務邏輯必然包含在了評審表的業務邏輯里了。我們假設有一天,已發布評審計劃的業務邏輯發生變更了(實際上這樣的會在你毫不經意間就發生了),編寫評審計劃的人會很快就修改了評審計劃的業務實現並且測試通過了。他不知道評審表裡也包含了這樣的業務邏輯,因而修改後的程序在運行到評審表的時候就很可能會出錯。不幸的是,在實際工作中,同樣一個業務邏輯可能包含在無數個你可能知道,但你也可能不知道的代碼中。這樣的結構就是一個不易於維護的差的結構。
總結:從技術升級和需求變更兩方面適應變化軟體開發專家Alistair Cockburn在《敏捷軟體開發》中說過,軟體在整個生命周期中變更是無時無刻不發生的。我認為,軟體的變更一方面是技術的更新,今天我們使用struts+spring+hibernate,明天呢,我們將使用什麼呢?正因為技術變更得太快,我們的系統應當不要太依賴於某個具體的技術或框架,以便於明天的技術更新。同時,來自客戶的需求變更也是我們必須面對的另一個壓力。一句經典的話是這樣描述客戶的變更:「當我看到時我的需求就變更了。(I changed just when I saw it.)」過去我們用需求說明書來抑制用戶的變更,現在發現不能這樣了。敏捷軟體開發提出了許多應對用戶變更的辦法,其中建立低耦合高內聚的軟體結構也是辦法之一。系統中的所有對象都有自己的明確職責,這個職責應當不多且高度相關。每個對象都應當只完成自己的職責,而把其它的任務交給別人去做。正如我前面提到的例子,評審表對象只完成與評審表相關的操作,而在它需要完成的任務中,需要使用評審計劃數據的相關功能,交給評審計劃對象去完成,評審表只管調用。這樣的構造要求開發者相互協調,彼此多交流,同時,也需要有人來統一規劃,站在全局的設計這個系統。通過這些,我們才可以適應變化,提高設計水平。
另外,團IDC網上有許多產品團購,便宜有口碑
❾ 如何在CentOS上搭建 Struts2+Spring+Hibernate的運行環境
Struts2+Spring+Hibernate是J2EE的最新流行框架。本篇是我搭建這個框架的經驗總結,有很多人搭建這個框架總會遇到
大大小小的問題,網上也沒有什麼行之有效的方案或成體系的介紹,所以我就決定總結一下我的搭建過程。給一些搭
建尚存問題的朋友提供幫助。
我用這個框架,實現的是基本的CRUD功能的一個雇員管理系統,本來打算豐富一下功能,但是一直沒能抽出空去搞。
目前版本暫定為1.0,除了CRUD外還配置了表單驗證框架JSValidation。功能都能很順利的實現。
現在分享部分源碼,來說明一些注意事項。
以下是部分搭建過程及源碼:
1.先組合實現Hibernate3.2+Spring2.5支持,刪除hibernate.cfg.xml文件,修改applicationContext.xml文件的內容,增加SessionFactory和dataSource的設置。
2.通過MyEclipse的向導方式,生成POJO類和對應的映射文件。
3.修改applicationContext.xml文件中<property name="mappingResources">元素的內容。
4.編寫DAO介面和實現類。
5.修改applicationContext.xml文件,增加對Dao實現類的配置。
6.組合Struts2和Spring2.5,修改web.xml文件,增加struts2的所需要的過濾器配置。
7.增加struts2相應類庫,增加struts2與spring的配置jar包。
8.拷貝struts.xml文件到src根目錄下,再修改struts.xml文件,進行常量配置。
9.修改web.xml文件,配置Spring監聽器,和上下文變數。並增加OpenSessionInViewFilter的設置。
10.寫入action類。
11.配置struts.xml文件。
12.修改applicationContext.xml
13.編寫Jsp文件。
14.載入運行項目。
下面是關鍵文件的源碼:
struts.xml源碼: