一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Struts Spring Hibernate上傳下載--之三 - c/c - CSD...

 nbtymm 2006-12-31

業(yè)務(wù)層

  1、業(yè)務(wù)層接口

  "面向接口而非面向類編程"是Spring不遺余力所推薦的編程原則,這條原則也已經(jīng)為大部開發(fā)者所接受;此外,JDK的動態(tài)代理只對接口有效,否則必須使用CGLIB生成目標(biāo)類的子類。我們依從于Spring的倡導(dǎo)為業(yè)務(wù)類定義一個接口:

  代碼 7 業(yè)務(wù)層操作接口

1. public interface FileService
2. {
3. void save(FileActionForm fileForm);//將提交的上傳文件保存到數(shù)據(jù)表中
4. List getAllFile();//得到T_FILE所示記錄
5. void write(OutputStream os,String fileId);//將某個文件的文件數(shù)據(jù)寫出到輸出流中
6. String getFileName(String fileId);//獲取文件名
7. }


  其中save(FileActionForm fileForm)方法,將封裝在fileForm中的上傳文件保存到數(shù)據(jù)庫中,這里我們使用FileActionForm作為方法入?yún)?,F(xiàn)ileActionForm是Web層的表單數(shù)據(jù)對象,它封裝了提交表單的數(shù)據(jù)。將FileActionForm直接作為業(yè)務(wù)層的接口入?yún)ⅲ喈?dāng)于將Web層傳播到業(yè)務(wù)層中去,即將業(yè)務(wù)層綁定在特定的Web層實現(xiàn)技術(shù)中,按照分層模型學(xué)院派的觀點,這是一種反模塊化的設(shè)計,但在"一般"的業(yè)務(wù)系統(tǒng)并無需提供多種UI界面,系統(tǒng)Web層將來切換到另一種實現(xiàn)技術(shù)的可能性也微乎其微,所以筆者覺得沒有必要為了這個業(yè)務(wù)層完全獨立于調(diào)用層的過高目標(biāo)而去搞一個額外的隔離層,浪費了原材料不說,還將系統(tǒng)搞得過于復(fù)雜,相比于其它原則,"簡單"始終是最大的一條原則。

  getAllFile()負責(zé)獲取T_FILE表所有記錄,以便在網(wǎng)頁上顯示出來。

  而getFileName(String fileId)和write(OutputStream os,String fileId)則用于下載某個特定的文件。具體的調(diào)用是將Web層將response.getOutputStream()傳給write(OutputStream os,String fileId)接口,業(yè)務(wù)層直接將文件數(shù)據(jù)輸出到這個響應(yīng)流中。具體實現(xiàn)請參見錯誤!未找到引用源。節(jié)下載文件部分。

  2、業(yè)務(wù)層接口實現(xiàn)類

  FileService的實現(xiàn)類為FileServiceImpl,其中save(FileActionForm fileForm)的實現(xiàn)如下所示:

  代碼 8 業(yè)務(wù)接口實現(xiàn)類之save()

1. …
2. public class FileServiceImpl
3. implements FileService
4. {
5. private TfileDAO tfileDAO;
6. public void save(FileActionForm fileForm)
7. {
8. Tfile tfile = new Tfile();
9. try
10. {
11. tfile.setFileContent(fileForm.getFileContent().getFileData());
12. }
13. catch (FileNotFoundException ex)
14. {
15. throw new RuntimeException(ex);
16. }
17. catch (IOException ex)
18. {
19. throw new RuntimeException(ex);
20. }
21. tfile.setFileName(fileForm.getFileContent().getFileName());
22. tfile.setRemark(fileForm.getRemark());
23. tfileDAO.save(tfile);
24. }
25. …
26. }


  在save(FileActionForm fileForm)方法里,完成兩個步驟:

  其一,象在水桶間倒水一樣,將FileActionForm對象中的數(shù)據(jù)倒入到Tfile對象中;

  其二,調(diào)用TfileDAO保存數(shù)據(jù)。

  需要特別注意的是代碼的第11行,F(xiàn)ileActionForm的fileContent屬性為org.apache.struts.upload.FormFile類型,F(xiàn)ormFile提供了一個方便的方法getFileData(),即可獲取文件的二進制數(shù)據(jù)。通過解讀FormFile接口實現(xiàn)類DiskFile的原碼,我們可能知道FormFile本身并不緩存文件的數(shù)據(jù),只有實際調(diào)用getFileData()時,才從磁盤文件輸入流中獲取數(shù)據(jù)。由于FormFile使用流讀取方式獲取數(shù)據(jù),本身沒有緩存文件的所有數(shù)據(jù),所以對于上傳超大體積的文件,也是沒有問題的;但是,由于數(shù)據(jù)持久層的Tfile使用byte[]來緩存文件的數(shù)據(jù),所以并不適合處理超大體積的文件(如100M),對于超大體積的文件,依然需要使用java.sql.Blob類型以常規(guī)流操作的方式來處理。

  此外,通過FileForm的getFileName()方法就可以獲得上傳文件的文件名,如第21行代碼所示。

  write(OutputStream os,String fileId)方法的實現(xiàn),如代碼 9所示:

  代碼 9 業(yè)務(wù)接口實現(xiàn)類之write()

1. …
2. public class FileServiceImpl
3. implements FileService
4. {
5.
6. public void write(OutputStream os, String fileId)
7. {
8. Tfile tfile = tfileDAO.findByFildId(fileId);
9. try
10. {
11. os.write(tfile.getFileContent());
12. os.flush();
13. }
14. catch (IOException ex)
15. {
16. throw new RuntimeException(ex);
17. }
18. }
19. …
20. }


  write(OutputStream os,String fileId)也簡單地分為兩個操作步驟,首先,根據(jù)fileId加載表記錄,然后將fileContent寫入到輸出流中。

  3、Spring事務(wù)配置

  下面,我們來看如何在Spring配置文件中為FileService配置聲明性的事務(wù)

1. <beans>
2. …
3. <bean id="transactionManager"
4. class="org.springframework.orm.hibernate3.HibernateTransactionManager">
5. <property name="sessionFactory" ref="sessionFactory"/>
6. </bean>
7. <!-- 事務(wù)處理的AOP配置 //-->
8. <bean id="txProxyTemplate" abstract="true"
9. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
10. <property name="transactionManager" ref="transactionManager"/>
11. <property name="transactionAttributes">
12. <props>
13. <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
14. <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
15. <prop key="save">PROPAGATION_REQUIRED</prop>
16. <prop key="write">PROPAGATION_REQUIRED,readOnly</prop>
17. </props>
18. </property>
19. </bean>
20. <bean id="fileService" parent="txProxyTemplate">
21. <property name="target">
22. <bean class="sshfile.service.FileServiceImpl">
23. <property name="tfileDAO" ref="tfileDAO"/>
24. </bean>
25. </property>
26. </bean>
27. </beans>


  Spring的事務(wù)配置包括兩個部分:

  其一,定義事務(wù)管理器transactionManager,使用HibernateTransactionManager實現(xiàn)事務(wù)管理;

  其二,對各個業(yè)務(wù)接口進行定義,其實txProxyTemplate和fileService是父子節(jié)點的關(guān)系,本來可以將txProxyTemplate定義的內(nèi)容合并到fileService中一起定義,由于我們的系統(tǒng)僅有一個業(yè)務(wù)接口需要定義,所以將其定義的一部分抽象到父節(jié)點txProxyTemplate中意義確實不大,但是對于真實的系統(tǒng),往往擁有為數(shù)眾多的業(yè)務(wù)接口需要定義,將這些業(yè)務(wù)接口定義內(nèi)容的共同部分抽取到一個父節(jié)點中,然后在子節(jié)點中通過parent進行關(guān)聯(lián),就可以大大簡化業(yè)務(wù)接口的配置了。

  父節(jié)點txProxyTemplate注入了事務(wù)管理器,此外還定義了業(yè)務(wù)接口事務(wù)管理的方法(允許通過通配符的方式進行匹配聲明,如前兩個接口方法),有些接口方法僅對數(shù)據(jù)進行讀操作,而另一些接口方法需要涉及到數(shù)據(jù)的更改。對于前者,可以通過readOnly標(biāo)識出來,這樣有利于操作性能的提高,需要注意的是由于父類節(jié)點定義的Bean僅是子節(jié)點配置信息的抽象,并不能具體實現(xiàn)化一個Bean對象,所以需要特別標(biāo)注為abstract="true",如第8行所示。

  fileService作為一個目標(biāo)類被注入到事務(wù)代理器中,而fileService實現(xiàn)類所需要的tfileDAO實例,通過引用3.2節(jié)中定義的tfileDAO Bean注入。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲一区二区三区在线免费| 亚洲午夜av一区二区| 99久久人妻中文字幕| 精品日韩av一区二区三区| 亚洲一区二区精品福利| 又大又紧又硬又湿又爽又猛| 97人摸人人澡人人人超碰| 日本久久精品在线观看| 一区二区免费视频中文乱码国产| 国产亚洲精品香蕉视频播放| 青青免费操手机在线视频| av在线免费观看在线免费观看| 国产成人人人97超碰熟女| 好吊视频有精品永久免费| 伊人久久青草地婷婷综合| 91在线国内在线中文字幕| 午夜精品久久久免费视频| 日本91在线观看视频| 五月激情婷婷丁香六月网| 日本亚洲精品在线观看| 中国一区二区三区人妻| 精品推荐国产麻豆剧传媒| 色婷婷视频免费在线观看| 亚洲精品成人福利在线| 欧美午夜伦理在线观看| 欧美乱视频一区二区三区| 国产一区二区久久综合| 精品女同在线一区二区| 亚洲高清中文字幕一区二区三区| 久久国产成人精品国产成人亚洲| 欧美黑人黄色一区二区| 伊人网免费在线观看高清版| 在线懂色一区二区三区精品| 激情偷拍一区二区三区视频| 字幕日本欧美一区二区| 亚洲高清亚洲欧美一区二区| 欧美国产日韩在线综合| 99久久精品午夜一区二区| 国产一级内射麻豆91| 亚洲精品蜜桃在线观看| 国产精品视频一区麻豆专区|