<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    歡迎使用我的 在線工具

    小D

    讀歷史、看小說、寫程序都是我所愛。技術不好,頭腦不靈光,靠的是興趣。
    隨筆 - 35, 文章 - 25, 評論 - 13, 引用 - 0
    數據加載中……

    Spring jpetstore 閱讀筆記

    1.org.springframework.beans.support.PagedListHolder
    PagedListHolder 是一個簡單狀態的,可以處理對象列表的持有者,它將這些對象分成頁面。頁號從0開

    始。
    這個主要在WEB UI中使用。具有代表的,一個實例將被以列示一列bean,將它們放置到session中,然后

    將它們導出為一個model(模型)。所有的屬性將程序化set/get,但是最常用的方式是數據綁定,例如組

    裝請求參數中的bean。View層中主要用到getter方法。
    使用一個屬性“sort”,將通過一個SortDifinition實現將基本的list排序。默認,一個

    MutableSortDefinition實例將被使用,使用相同的屬性將遞增給定的值。
    ?BeanWrapper要求,綁定數據名必須被稱作“pageSize”和 “sort.ascending”。 注意,名字

    和嵌套語法匹配各自的JSTL EL表達式,例如“myModelAttr.pageSize”和

    “myModelAttr.sort.ascending”。
    ?其實,就是用來提供給表現分頁用的。

    2.? org.springframework.beans.factory.InitializingBean
    ??這是一個能夠被bean實現的接口,如果這個bean需要一旦它所有的屬性被注入(還有指定的

    BeanFactoryAware和ApplicationContextAware接口相關的方法都被執行)后就做出反應:例如,執行一

    個自定義的初始化,或者僅僅是檢查所有托管的屬性是否被正確的注入。可以通過拋出異常阻止繼續初

    始化。
    ?我們也可以選擇指定一個自定義的 init-method來代替實現InitializingBean,這個init-

    method通過一個描述bean定義的XML定義。
    ?
    3.?org.springframework.aop. AfterReturningAdvice
    After returning advice 僅僅在正常的方法返回后調用,而不是在拋出異常時調用。這個通知能夠看到

    返回值,但是不能改變它。
    它唯一的方法為:void afterReturning(Object returnValue, Method method, Object[] args,

    Object target) throws Throwable;
    ??在指定的方法(其實就是JoinPoint)成功返回后被調用。
    ??參數 returnValue: 指定的方法的返回值。
    ??參數 method:被調用的方法。
    ??參數 args:方法的參數。
    ??參數 target:方法期待的目標。可以使null。JoinPoint所在的對象。
    ??@throws :如果當前對象希望中斷調用,則拋出異常。所有方法簽名中允許拋出的異

    常將會返回給調用者。否則將會被包裝為運行期異常。

    4.? org.springframework.mail.SimpleMailMessage
    設計一個簡單mail 信息,它包括收信人mail、發信人mail、主題和內容。
    ?考慮JavaMailSender 和 JavaMailMimeMessage 來創建更復雜的信息,例如帶有附件的信息,

    特殊符號,或者私人郵件。
    5.? org.springframework.samples.jpetstore.domain.logic. PetStoreImpl
    ?這里是該程序的作者對其說明,很有意義。
    ?JPetStore主要業務對象。
    這個對象使用了5個DAO對象,從具體的操作持久化API工作中解脫出來。因此,雖然這個程序使用

    iBATIS 做數據訪問,但是如果要使用其它的持久化工具來訪問,就不需要修改這個類的任何代碼。
    這個對象使用DAO實例是通過Spring容器依賴注入的(使用依賴注入使DAO變成是可配置的)。我們這里使

    用的setter注入,暴露每個DAO的setter方法給用戶。這就意味著我們只要在配置該類的bean時,使用“

    property”屬性就可以注入DAO。這里的屬性是只寫的(write-only):相應的setter方法沒有對應的

    getter方法。Getter方法是可選的:只有當你的業務對象需要訪問這些屬性時,才去暴露getter方法。
    ?在JPetStore程序中只有一個該類的對象。在Spring術語中,這叫做一個“singleton“(單例)

    對象。這就意味著每個程序上下文都只有一個。工廠創建一個單例對象;在這里沒有必要提供一個私有

    的構造器,靜態工廠方法等是單例模式的傳統實現方式。
    ?這是一個POJO(普通的Java對象,自我維護自身的狀態,處理本身的屬性及存取方法外,一般不

    提供任何API)。它不依賴于任何的Spring API。在Spring容器外,仍然可用,而且能夠在使用JUnit 測

    試時,初始化該對象。但是,我們仍然使用聲明式事務管理,而依賴Spring的AOP。
    ?這個類給每個方法定義了一個默認的事務屬性。
    ?注意,這個屬性定義僅僅在使用Commons Attribute auto-proxying (即使用Common Attribute

    或 Annotation時, Annotation是Spring提供的API,所以依賴了Spring API或Common Attribute API)

    時才是必須使用的。
    在 war/WEB-INF 目錄下的默認applicationContext.xml 文件中的TransactionFactoryProxyBean不需要

    定義attributes。
    而在接下來使用Commons Attributes attribute 語法來定義的attribute。

    6.?org.springframework.orm.ibatis.support.SqlMapClientDaoSupport
    給iBATIS SqlMapClientDAO提供的方便的父類。需要設置一個SqlMapClient,提供給子類一個基于設入

    的SqlMapClient的SqlMapClinetTemplate。
    你也可以傳遞一個已經配置好的SqlMapClientTemplate實例來代替傳遞一個SqlMapClient(也就是代替默

    認的SqlMapClientTemplate,默認的SqlMapClientTemplate使用了傳入的SqlMapClient)。這樣就使得你

    所有的DAO的分享同一個SqlMapClientTemplate配置,例如,一個自定義的SQLExceptionTranslator也可

    以使用這個SqlMapClientTemplate。

    7.? org.springframework.orm.ibatis.SqlMapClientTemplate
    ?一個幫助類,用來簡化使用iBATIS com.ibatis.sqlmap.client.SqlMapClient API進行數據訪

    問,依照org.springframework.dao 異常模型,將被檢查性異常SQLExceptions轉換成不受檢測異常

    DataAccessExceptions。使用和org.springframework.jdbc.core.JdbcTemplate相同的

    org.springframework.jdbc.support.SQLExceptionTranslator機制。
    ?這個類的主要方法執行了數據訪問行為的回調。此外,該類提供了眾多的方法去鏡像

    com.ibatis.sqlmap.client.SqlMapExecutor的執行方法。
    ?這個模版一般都使用了方便而簡單的方法去執行 query/insert/update/delete 操作。但是,

    更復雜的操作例如批量更新,就必須自定義一個SqlMapClientCallback,常常都是使用匿名的內部類實

    現。例如:
    getSqlMapClientTemplate().execute(new SqlMapClientCallback() {
    ?? public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {
    ??? executor.startBatch();
    ??? executor.update("insertSomething", "myParamValue");
    ??? executor.update("insertSomethingElse", "myOtherParamValue");
    ??? executor.executeBatch();
    ??? return null;
    ?? }
    ?});
    ?這個模版需要一個SqlMapClient來工作,可以通過”sqlMapClient”屬性來傳遞。一個Spring

    上下文都典型地使用一個SqlMapClientFactoryBean去構建SqlMapClient。模版還需要配置一個

    DataSource來取得連接,但是,如果在傳入的SqlMapClient中指定了DataSource(典型地,使用

    SqlMapClientFactoryBean的”dataSource”屬性),那么這不是必須的。
    ?所謂的回調就是指,一個對象通過調用另一個對象的方法來完成既定的行為(也可以說是委托

    給另一個對象來完成),而本對象可以去執行其它的操作。
    8.? org.springframework.samples.jpetstore.web.struts. BaseAction
    ?JPetStore的Web層的所有Struts Action的父類
    從ServletContext中獲得WebApplicationContext,然后又從WebApplicationContext中獲得

    PetStoreFacade,然后通過一個getter方法提供給子類。(或者是繼承Spring提供的ActionSupport類,

    它預實現了WebApplicatinContext的查找)但是這里在Struts中插入了Spring的API。所以增加了耦合度

    ,該Action類及其子類不能脫離Spring使用,這里并不是最佳實踐。
    比較好的方式是:配置Spring將Action作為Bean托管,使用ContextLoaderPlugin,并在Spring context


    ?* 中設置依賴關系。具體看Spring手冊。

    9.?org.springframework.util.StringUtils
    String工具方法的混合類。
    主要在Spring框架內工作;請參考Jakarta's Commons Lang 來了解更多而全面的String 工具類的信息


    這個提供了一些處理core Java String 和 StringBuffer的簡單功能,例如替換一個目標字符串中所有

    給定的子字符串的功能。它也提供易使用的方法去轉換定界字符串,如CSV字符串,和集合以及數組。
    關于持久層DAO接口的好處(個人想法)
    ?事實上,在程序中有很多對象依賴了DAO,如果我們直接使用DAO,而不是使用DAO的接口的話,

    那么如果我們改變底層的數據庫時(或者是不同的ORM框架),相關的依賴該DAO的對象的類,或者配置

    必須修改。例如,我們使用AOP可配置編程時,我們就必須修改織入的DAO,而如果我們使用DAO接口,我

    們可以直接織入到接口上,那么我們不需要修改任何代碼。業務層和持久層也應該通過接口通信。
    ?同樣,DAO接口也獲得所有接口必將獲得的好處,那么就是耦合度的下降。
    ?具體來說就是,避免其它API的污染,增加API維護和使用的復雜性;另外就是提供給一個更靈

    活的多態實現,也就是說在我們無法修改源碼的情況下,也能改變具體實現,而且我們應該總是避免,

    因為我們常常沒有這樣的權限,那么就要就API的設計者提供更好的實現(開--閉原理),這里是通過

    XML配置文件的方式。
    ?但是顯然,這里增加了間接性,增加了代碼量,似乎增加了復雜性,然而恰恰相反,合理的使

    用接口使得程序的結構更加的清晰。
    ?JPetStore使用了SecureBaseAction 主要是提供了當HttpSession中未包含登陸信息時,跳到登

    陸頁面,其實所有擴展了這個類的類的實例,都是需要在安全條件下(用戶權限控制)使用的,其實我們

    可以用filter代替。但是這樣顯然效率更高,但是耦合度也更高了,因為我們不可以配置自己的安全策

    略了。
    ?JPetStore在Struts Web控制代碼中使用了大量的Spring API,其實這是不推薦使用的,例如,

    BaseAction中使用了WebApplicationContext;SearchProductsAction使用了

    org.springframework.util.StringUtils,還有使用很頻繁的

    org.springframework.beans.support.PagedListHolder。
    ?JPetStore在使用Struts時,大量使用了HttpSession,好的建議是盡量少使用HttpSession,所

    以這里也不是好的實踐,例如,將所有的頁面都找出來,但是是緩存在HttpSession中,雖然提高了客戶

    端的用戶感受,但是會給服務器以沉重的負擔。
    ?JPetStore中將ActionForm做了兩種作用,一種主要是用于數據的提交(Form中用),一般以

    working開頭,一種主要用于處理過后的數據的顯示和數據的保存。因為都是存儲在HttpSession中,為

    了區分采用了不同的名字,而working FormBean的生命周期是在提交了數據后結束,因此在這時,我們

    應該將內存空間收回。

    posted on 2009-11-04 21:16 vagasnail 閱讀(766) 評論(0)  編輯  收藏 所屬分類: Java Web


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 99热在线日韩精品免费| 粉色视频成年免费人15次| 99在线免费观看| 亚洲愉拍99热成人精品热久久| 免费毛片在线播放| 亚洲成人福利在线| 亚洲一区免费视频| 91午夜精品亚洲一区二区三区| 亚洲精品国产综合久久久久紧| 免费夜色污私人影院网站电影| 免费黄网站在线观看| 国产V亚洲V天堂无码久久久| 中文字幕日本人妻久久久免费| 国产91免费视频| 亚洲av一本岛在线播放| 国产免费av片在线看| 欧洲亚洲国产精华液| 精品国产香蕉伊思人在线在线亚洲一区二区 | 伊人久久国产免费观看视频| 亚洲综合精品网站| 久久er国产精品免费观看2| 亚洲视频在线观看免费| av无码久久久久不卡免费网站| 亚洲人成色77777| 免费A级毛片无码视频| 亚洲一区二区三区高清不卡| 波多野结衣视频在线免费观看 | 精品少妇人妻AV免费久久洗澡| 亚洲成AV人片在线观看ww| 久久A级毛片免费观看| 亚洲精品无码中文久久字幕| 亚洲国产天堂久久久久久| 精品四虎免费观看国产高清午夜| 四虎成人精品在永久免费| 岛国岛国免费V片在线观看| 亚洲精品美女视频| 国产jizzjizz免费视频| 日韩精品无码免费专区午夜不卡| 亚洲人成影院在线观看| 99久久精品免费视频| 中文字幕乱码亚洲精品一区 |