MicroFish

          Open & Open hits
          隨筆 - 33, 文章 - 2, 評論 - 4, 引用 - 0
          數據加載中……

          幾種所見所得的在線編輯器

          ?1.FCKeditor 編輯器

          FCKeditor is compatible with most internet browsers which include: IE 5.5+ (Windows), Firefox 1.0+, Mozilla 1.3+ and Netscape 7+.
          最新版本:FCKeditor 2.0
          語言環境:多國語言
          特性功能:所見所得,支持平臺眾多,支持XHTML 1.0,文本格式設置,常見的編輯,復制,粘貼,撤銷,文件上傳等功能
          授權方式:Open Source & Free
          官方地址:http://www.fckeditor.net/
          下載地址:http://www.fckeditor.net/download/default.html
          演示:http://www.fckeditor.net/demo/default.html
          小節:FCKeditor的2.0版比1.6版有了許多的改進。首先是FCKeditor的文件結構更加清晰,
          可以更方便地將其部署在自己的系統中。另外2.0版開始支持了Firefox瀏覽器

          2.WebEditor
          WebEditor系列文檔控件,采用了ESS專業電子簽名和電子蓋章的技術,除繼續支持手寫簽名,電子印章,痕跡保留外,
          該版本采用了我們強大的B/S通訊技術,能夠自由的將服務器數據庫

          最新版本:WebEditor[V4.3.0.0 OCX版]
          語言環境:簡體中文
          技術特性
          采用IE5.0以上版本內置的傳輸協議,通訊性能穩定,高效。
          采用標準HTTP通訊端口80,使用方便,無需特別配置、安全性好、更無需特別設置防火墻。
          采用插件技術,可以完全融入IE瀏覽器中,方便系統維護、方便用戶操作。
          采用自定義協議包進行數據的組裝和分析,系統開放性好,便于二次開發。
          采用了Com組件和JavaBean組件技術,很好的實現了跨平臺系統,便于開發。
          官方地址:http://www.dragongod.com/
          演示:http://www.dragongod.com/WebEditor/Demo.asp
          下載:http://www.dragongod.com/download/index.asp#item1
          小節:這個編輯器很具有中國特色的,但必須支持安裝WebEditor插件,才能正常運行
          對于很多用戶來說,,這個是無法接收的.

          3.InnovaStudio WYSIWYG Editor在線編輯器WYSIWYG 英文:What You See Is What You Get(所見所得)
          一款基于web的WYSIWYG(所見即所得)的HTML編輯器,支持ASP, PHP, ASP.NET
          最新版本:InnovaStudio WYSIWYG Editor version 2.9
          功能特性:快速加載,融合所有的HTML標簽,全屏編輯模式,所見所得預覽,拼寫檢查.
          特有的嵌入式WEB編輯.
          官方:http://www.innovastudio.com/
          演示:http://www.innovastudio.com/editor_tutorial.asp
          下載:官方好像都是收費的,,自己去網上搜索找找,好像有人已經做過有2.0的漢化版


          小節:采用DHTML, JavaScript 構件的WYSIWYG也有很多不足之處,由于代碼放在遠程服務器,
          一些控件事先沒有下載到客戶端,使得一些操作速度變慢,那些加入了ActiveX 控件的更慢,
          另外它無法在網頁里直接調用CSS,所以在操作框里的界面效果和尺寸和實際上的界面有差距。
          有很多WYSIWYG對各種瀏覽器還不兼容,而且有的也要在IE的高版本下才能正常運行(此段出自老鬼的blog).


          4.eWebEditor在線編輯器

          eWebEditor是基于網頁的、所見即所得的在線HTML編輯器。她能夠在網頁上實現許多桌面編輯軟件
          (如:Word)所具有的強大可視編輯功能;她是一個真正的綠色軟件,不需要在計算機上安裝
          任何的客戶端軟件;她的易用使得WEB開發人員只要一行代碼即可完成調用。
          最新版本:Version 3.6 (ASP版、PHP版、JSP版、ASP.NET版)
          官方:http://www.ewebsoft.com/
          演示:http://ewebeditor.webasp.net/demo.asp
          下載:http://ewebeditor.webasp.net/download.asp
          功能特性:
          純靜態:大大提高了效率,最佳的融入您的產品;
          多樣式支持:您只需要在您的整個網站中使用一個eWebEditor;
          自動提交:無需在提交按鈕中加入腳本進行處理;
          自動獲取遠程文件:把別人服務器上的圖片等文件自動傳到自己的服務器;
          相對或絕對路徑:完全擺脫了站點或系統或目錄遷移而帶來的路徑問題;
          圖形熱點鏈接:始創能夠在線編輯實現圖形的熱點鏈接功能;
          多種編輯模式:HTML代碼模式、可視設計模式、純文本模式、預覽模式;
          大小自適應:可以按你調用的寬度和高度自適應編輯器的大小;
          內附文件上傳功能:自帶有從客戶端直接上傳到服務器端的功能;
          完善的接口:您可以通過接口實時控制或者獲取編輯器的內容或者狀態;


          小節:我個人比較推薦這個編輯器,為什么呢?除了他是國產的外,比較符合國人的習慣,另外也可能是眾多編輯器,
          唯一還帶后臺管理模式,可以直接在后臺管理編輯模式,
          另外接口定制非常容易,具體的自己可以去官方下載回來看看.


          5.htmlarea
          htmlarea.com is a directory of browser based wysiwyg editor components for use
          in CMS (content management software) and other web software.
          htmlArea是一款非常優秀的所見即所得編輯器,被使用在CMS系統或其他的WEB系統中..
          語言環境:多國語言版
          版本:version 3.0
          官方:http://www.htmlarea.com/
          演示:沒找到,
          下載:官方沒找到下載地址,我自己找了個3.0的版本 http://www.92key.com/mp3/chinahtml@_HTMLArea3.rar
          小節:這個編輯器調用也非常方便,
          已經廣泛用在各種CMS和blog系統里,記得bo-blog,phpArticle里整合了這個編輯器.


          6.XStandard XHTML (Strict or 1.1) WYSIWYG Editor 也是所見所得,比起前幾個,,它已經完全支持XHTML 1.1的嚴格驗證,
          這個非常厲害 @@
          版本:XStandard Version 1.6.2
          官方:http://xstandard.com/
          下載:http://xstandard.com/download.asp
          演示:
          小節:這個編輯器,我也很少在國內的CMS,blog上見到有人使用,當然一個原因就是它是一個共享軟件.
          XStandard Lite是免費的
          XStandard Pro是30天的試用期,而且價格還不菲$179


          7.Cross-Browser Rich Text Editor
          The cross-browser rich-text editor (RTE) is based on the designMode() functionality introduced in Internet Explorer 5, and implemented in Mozilla 1.3+ using the Mozilla Rich Text Editing API. The cross-browser rich-text editor now includes table support (as of 2/10/2005) as well as an option to generate xhtml-compliant code

          官方:http://www.kevinroth.com
          演示:http://www.kevinroth.com/rte/demo.htm
          下載:http://www.kevinroth.com/rte/demo.htm

          posted @ 2007-03-06 17:18 劉璐 閱讀(284) | 評論 (0)編輯 收藏

          轉 J2EE開發之常用開源項目介紹

          主要就我所了解的J2EE開發的框架或開源項目做個介紹,可以根據需求選用適當的開源組件進行開發.主要還是以Spring為核心,也總結了一些以前web開發常用的開源工具和開源類庫
          ?
          1持久層:
          1)Hibernate
          這個不用介紹了,用的很頻繁,用的比較多的是映射,包括繼承映射和父子表映射
          對于DAO在這里介紹個在它基礎上開發的包bba96,目前最新版本是bba96 2.0它對Hibernate進行了封裝, 查詢功能包括執行hsql或者sql查詢/更新的方法,如果你要多層次邏輯的條件查詢可以自己組裝QueryObject.可以參考它做HibernateDAO.也可以直接利用它
          2) iBATIS
          另一個ORM工具,Apache的,沒有Hibernate那么集成,自由度比較大
          2:SpringMVC
          ?????? 原理說明和快速入門:
          ?????? 配置文件為:
          Spring的配置文件默認為WEB-INF/xxxx-servelet.xm其中xxx為web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name。
          ?????? Action分發:
          Spring將按照配置文件定義的URL,Mapping到具體Controller類,再根據URL里的action= xxx或其他參數,利用反射調用Controller里對應的Action方法。
          輸入數據綁定:
          Spring提供Binder 通過名字的一一對應反射綁定Pojo,也可以直接從request.getParameter()取數據。
          輸入數據驗證
          Sping 提供了Validator接口當然還可以使用開源的Commons-Validaor支持最好
          Interceptor(攔截器)
          Spring的攔截器提供接口需要自己編寫,在這點不如WebWork做的好.全面
          ?????? (這里提一下WebWork和Struts的區別最主要的區別在于WebWork在建立一個Action時是新New一個對象而Struts是SingleMoule所有的都繼承它的一個Action,所以根據項目需要合適的選擇.)
          3:View層
          1) 標簽庫:JSP2.0/JSTL
          由于Webwork或Spring的標簽確實很有限,一般view層用JSTL標簽,而且據說JSTL設計很好速度是所有標簽中最快的使用起來也很簡單
          ?
          2) 富客戶端:DOJO Widgets, YUI(YahooUI),FCKEditor, Coolest日歷控件
          Dojo主要提供Tree, Tab等富客戶端控件,可以用其進行輔助客戶端開發
          YahooUI和DOJO一樣它有自己的一套javascript調試控制臺,主要支持ajax開發也有很多Tree,Table,Menu等富客戶端控件
          FCKEditor 最流行的文本編輯器
          Coolest日歷控件 目前很多日歷控件可用,集成在項目中也比較簡單,這個只是其中的一個,界面不錯的說..
          ?
          3) JavaScript:Prototype.js
          Prototype.js作為javascript的成功的開源框架,封裝了很多好用的功能,通過它很容易編寫AJAX應用,現在AJAX技術逐漸成熟,框架資源比較豐富,比如YUI,DWR等等,也是因為JavaScript沒有合適的調試工具,所以沒有必要從零開始編寫AJAX應用,個人認為多用一些成熟的Ajax框架實現無刷新更新頁面是不錯的選擇.
          ?
          4)表格控件:Display Tag ,Extreme Table
          這兩個的功能差不多,都是View層表格的生成,界面也比較相向,可以導出Excel,Pdf,對Spring支持很容易.
          相比較而言比較推薦ExtremeTable,它的設計很好功能上比DisplayTag多一些,支持Ajax,封裝了一些攔截器,而且最方面的是在主頁wiki中有詳細的中文使用文檔.
          ?
          5):OSCache
          OSCache是OpenSymphony組織提供的一個J2EE架構中Web應用層的緩存技術實現組件,Cache是一種用于提高系統響應速度、改善系統運行性能的技術。尤其是在Web應用中,通過緩存頁面的輸出結果,可以很顯著的改善系統的穩定性和運行性能。
          它主要用在處理短時間或一定時間內一些數據或頁面不會發生變化,或將一些不變的統計報表,緩沖在內存,可以充分的減輕服務器的壓力,防治負載平衡,快速重啟服務器(通過硬盤緩存).
          ?
          6)SiteMesh
          sitemesh應用Decorator模式主要用于提高頁面的可維護性和復用性,其原理是用Filter截取request和response,把頁面組件head,content,banner結合為一個完整的視圖。通常我們都是用include標簽在每個jsp頁面中來不斷的包含各種header, stylesheet, scripts and footer,現在,在sitemesh的幫助下,我們刪掉他們輕松達到復合視圖模式.
          Sitemesh也是 OpenSymphony的一個項目現在最近的版本是2.2,目前OpenSymphony自從04年就沒有更新的版本了..感覺它還是比較有創新的一種頁面組裝方式, OpenSymphony開源組織的代碼一般寫的比較漂亮,可以改其源代碼對自己的項目進行適配.
          測試發現Sitemesh還存在一些問題,比如中文問題,它的默認編碼是iso-8859-1在使用時候需要做一些改動.
          ?
          7)CSS,XHTML
          這個不用說了,遵循W3C標準的web頁面開發.
          ?
          8)分頁標簽: pager-taglib組件
          Pager-taglib?是一套分頁標簽庫,可以靈活地實現多種不同風格的分頁導航頁面,并且可以很好的與服務器分頁邏輯分離.使用起來也比較簡單.
          ?
          9)Form: Jodd Form taglib
          Jodd Form taglib使用比較簡單,只要把<form>的頭尾以<jodd:form bean= "mybean">包住
          就會自動綁定mybean, 自動綁定mybean的所有同名屬性到普通html標記input, selectbox, checkbox,radiobox.....在這些input框里不用再寫任何代碼…
          ??????
          10)Ajax:DWR
          ?????? J2EE應用最常用的ajax框架
          ??????
          ?????? 11)報表 圖表
          Eclipse BIRT功能比較強大,也很龐大..好幾十M,一般沒有特別需求或別的圖表設計軟件可以解決的不用它
          JasperReports+ iReport是一個基于Java的開源報表工具,它可以在Java環境下像其它IDE報表工具一樣來制作報表。JasperReports支持PDF、HTML、XLS、CSV和XML文件輸出格式。JasperReports是當前Java開發者最常用的報表工具。
          JFreeChart主要是用來制作各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。
          ??????琴棋報表,國產的..重點推薦,適合中國的情況,開放源代碼,使用完全免費。純JAVA開發,適用多種系統平臺。特別適合B/S結構的系統。官方網站有其優點介紹,看來用它還是不錯的選擇,最重要的是支持國產呵呵
          ?
          4:權限控制: Acegi
          Acegi是Spring Framework 下最成熟的安全系統,它提供了強大靈活的企業級安全服務,如完善的認證和授權機制,Http資源訪問控制,Method 調用訪問控制等等,支持CAS
          (耶魯大學的單點登陸技術,這個單點登陸方案比較出名.我也進行過配置使用,可以根據項目需要,如果用戶分布在不同的地方不同的系統通用一套登陸口令可以用它進行解決,一般注冊機登陸機就是這樣解決的)
          ?????? Acegi只是于Spring結合最好的安全框架,功能比較強大,當然還有一些其他的安全框架,這里列舉一些比較流行的是我從網上找到的,使用方法看其官方文檔把…
          JAAS, Seraph, jSai - Servlet Security, Gabriel, JOSSO, Kasai, jPAM, OpenSAML都是些安全控制的框架..真夠多的呵呵
          ?
          5:全文檢索
          ?????? 1) Lucene
          ?????? Lucene是一套全文索引接口,可以通過它將數據進行倒排文件處理加入索引文件,它的索引速度和查詢速度是相當快的,查詢百萬級數據毫秒級出結果,現在最火的Apache開源項目,版本更新速度很快現在已經到了2.0,每個版本更新的都比較大,目前用的最多的版本應該是1.4.3,但它有個不太方面的地方單個索引文件有2G文件限制,現在2.0版本沒有這個限制,我研究的比較多,它的擴展性比較好,可以很方面的擴充其分詞接口和查詢接口.
          ?????? 基于它的開發的系統很多,比如最常用的Eclipse的搜索功能,還有一些開源的軟件比如Compass,Nutch,Lius,還有我最近做的InSearch(企業級FTP文件網頁搜索)
          6:公共Util類
          ?????? 主要是Jakarta-Commons類庫,其中最常用得是以下幾個類庫
          1) Jakarta-Commons-Language
          ?????? 最常用得類是StringUtils類,提供了使用的字符串處理的常用方法效率比較高
          2) Jakarta-Commons-Beantuils
          ?????? 主要用Beantuils能夠獲得反射函數封裝及對嵌套屬性,map,array型屬性的讀取。
          3) Jakarta-Commons-Collections
          ?????? 里面有很多Utils方法
          ?
          7 日志管理
          ?????? Log4J
          ?????? 任務是日志記錄,分為Info,Warn,error幾個層次可以更好的調試程序
          ?
          8 開源的J2EE框架
          ?????? 1) Appfuse
          ????????????? Appfuse是Matt Raible 開發的一個指導性的入門級J2EE框架, 它對如何集成流行的Spring、Hibernate、iBatis、Struts、Xdcolet、JUnit等基礎框架給出了示范. 在持久層,AppFuse采用了Hibernate O/R映射工具;在容器方面,它采用了Spring,用戶可以自由選擇Struts、Spring/MVC,Webwork,JSF這幾個Web框架。
          ??????
          ?????? 2) SpringSide
          ?????? .SpringSide較完整的演示了企業應用的各個方面,是一個電子商務網站的應用 SpringSide也大量參考了Appfuse中的優秀經驗。最重要的是它是國內的一個開源項目,可以了解到國內現在的一些實際技術動態和方向很有指導意義…
          ?
          9:模版 Template
          主要有Veloctiy和Freemarker
          模板用Servlet提供的數據動態地生成 HTML。編譯器速度快,輸出接近靜態HTML???????????? 頁面的速度。
          ?
          10:工作流
          ?????? 我所知道比較出名的主要有JBpm Shark Osworkflow,由于對它沒有過多的研究所以還不是很清楚之間有什么區別.
          ?
          項目管理軟件
          dotProject:是一個基于LAMP的開源項目管理軟件。最出名的項目管理軟件
          JIRA: 項目計劃,任務安排,錯誤管理
          Bugzilla:提交和管理bug,和eclipse集成,可以通過安裝MyEclipse配置一下即可使用
          BugFree借鑒微軟公司軟件研發理念、免費開放源代碼、基于Web的精簡版Bug管理
          CVS:這個就不介紹了都在用.
          SVN: SubVersion已逐漸超越CVS,更適應于JavaEE的項目。Apache用了它很久后,Sourceforge剛剛推出SVN的支持。
          測試用例:主要JUnit單元測試,編寫TestCase,Spring也對Junit做了很好的支持
          ?
          后記:
          ?????? 以Spring為主的應用開發可選用的組件中間件真是眼花繚亂,所以針對不同的項目需求可以利用不同的開源產品解決,比如用Spring+Hibernate/ iBATIS或Spring+WebWork+Hibernate/ iBATIS或Spring+Struts+Hibernate/ iBATIS,合理的框架設計和代碼復用設計對項目開發效率和程序性能有很大的提高,也有利于后期的維護.

          posted @ 2006-12-28 17:36 劉璐 閱讀(338) | 評論 (0)編輯 收藏

          《Pro Spring》學習筆記(9)--基礎進階(4)

          ?

          ????? 到目前為止,我們都是使用BeanFactory接口以及它的子接口來使用Spring,盡管使用BeanFactory也是一種不錯的方式,但正如前面看到的,有些時候,我們還是不得不自己編寫代碼來調用諸如preInstantiateSingletons,postProcessBeanFactory等方法。
          ????? 為了使用的方便,Spring提供了BeanFactory的一個擴展:ApplicationContext。使用ApplicationContext,我們可以減少需要編寫的代碼的數量,并且ApplicationContext也增加了一些新的功能。如果在Web工程中使用Spring,我們甚至可以讓Spring自動加載ApplicationContext,而無需自己編寫代碼來創建它。
          ????? ApplicationContext具備一些BeanFactory不具備的功能:國際化(Internationalization),事件發布(Event publication),資源管理和訪問(Resource management and access),更多的生命周期控制接口(Additional lifecycle interfaces)以及底層組件的自動配置(Improved automatic configuration of infrastructure components)。
          ????? Spring為ApplicationContext接口提供了三種實現:FileSystemXmlApplicationContext,ClasspathXmlApplicationContext和XmlWebApplicationContext。其中XmlWebApplicationContext是專為Web工程定制的,并且我們可以使用ContextLoaderListener或ContextLoaderServlet來自動加載ApplicationContext配置。
          ????? 通常國際化是通過使用MessageSource接口來實現的,為了在ApplicationContext中使用MessageSource,我們需要配置一個類型為MessageSource,名稱為messageSource的bean。
          <beans>
          ??? <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
          ??????? <property name="basenames">
          ??????????? <list>
          ??????????????? <value>buttons</value>
          ??????????????? <value>labels</value>
          ??????????? </list>
          ??????? </property>
          ???? </bean>
          </beans>
          ????? 在配置了messageSource后,我們就可以使用ApplicationContext的getMessage方法來獲取資源內容了。
          ????? ApplicationContext的另一個重要特性就是對發布和接收事件的支持,ApplicationContext會在其被配置的時候自動注冊所有的偵聽器(listener),事件的發布是通過ApplicationContext的publishEvent方法來實現的。
          //Event class
          public class MessageEvent extends ApplicationEvent {
          ??? private String msg;
          ??? public MessageEvent(Object source, String msg) {
          ??????? super(source);
          ??????? this.msg = msg;
          ??? }
          ??? public String getMessage() {
          ??????? return msg;
          ??? }
          }
          //Listener class
          public class MessageEventListener implements ApplicationListener {
          ??? public void onApplicationEvent(ApplicationEvent event) {
          ??????? if(event instanceof MessageEvent) {
          ??????????? MessageEvent msgEvt = (MessageEvent)event;
          ??????????? System.out.println("Received: " + msgEvt.getMessage());
          ??????? }
          ??? }
          }
          //Publish class
          public class Publisher implements ApplicationContextAware {
          ??? private ApplicationContext ctx;
          ??? public static void main(String[] args) {
          ??????? ApplicationContext ctx =
          ??????????????? new FileSystemXmlApplicationContext("./ch5/src/conf/events/events.xml");
          ??????? Publisher pub = (Publisher) ctx.getBean("publisher");
          ??????? pub.publish("Hello World!");
          ??????? pub.publish("The quick brown fox jumped over the lazy dog");
          ??? }
          ??? public void setApplicationContext(ApplicationContext applicationContext)
          ??????????? throws BeansException {
          ??????? this.ctx = applicationContext;
          ??? }
          ??? public void publish(String message) {
          ??????? ctx.publishEvent(new MessageEvent(this, message));
          ??? }
          }
          <beans>
          ??? <bean id="publisher" class="com.apress.prospring.ch5.event.Publisher"/>
          ??? <bean id="messageEventListener" class="com.apress.prospring.ch5.event.MessageEventListener"/>
          </beans>
          ????? 資源訪問是我們經常碰到的,這些資源有可能存在于一個文件中,類路徑中的一個jar包中,抑或是在遠程服務器上。Spring為我們提供了統一的,協議無關的方式來訪問各種各樣的資源,這給我們訪問各種資源提供了極大的方便。
          public class ResourceDemo {
          ??? public static void main(String[] args) throws Exception {
          ??????? ApplicationContext ctx =
          ??????????????? new FileSystemXmlApplicationContext("./ch5/src/conf/events/events.xml");
          ??????? Resource res1 = ctx.getResource("
          file:///d:/tmp/test.txt ");
          ??????? displayInfo(res1);
          ??????? Resource res2 = ctx.getResource("classpath:lib/commons-logging.jar");
          ??????? displayInfo(res2);
          ??????? Resource res3 = ctx.getResource("
          http://www.google.co.uk ");
          ??????? displayInfo(res3);
          ??? }
          ??? private static void displayInfo(Resource res) throws Exception {
          ??????? System.out.println(res.getClass());
          ??????? System.out.println(res.getURL().getContent());
          ??????? System.out.println("");
          ??? }
          }

          posted @ 2006-12-21 10:25 劉璐 閱讀(297) | 評論 (0)編輯 收藏

          《Pro Spring》學習筆記(8)--基礎進階(3)

          ?

          ????? 如果bean無法簡單地通過new關鍵字來創建怎么辦,通常碰到這樣的情況時,我們都會使用工廠模式來處理,Spring也提供了對FactoryBean的支持,當我們配置了一個bean為FactoryBean時,隨后我們獲取的則并不是該FactoryBean,Spring會通過調用FactoryBean.getObject()方法,返回真正的目標bean。FactoryBean在Spring中的最著名應用就是對聲明式事務的處理。
          ????? 在Spring中使用FactoryBean,我們需要編寫一個實現了FactoryBean接口的類,以一個信息摘要FactoryBean為例,它主要實現根據不同的參數,創建不同的MessageDigest的實例。
          public class MessageDigestFactoryBean implements FactoryBean, InitializingBean {
          ??? private String algorithmName = "MD5";
          ??? private MessageDigest messageDigest = null;
          ??? public Object getObject() throws Exception {
          ??????? return messageDigest.clone();
          ??? }
          ??? public Class getObjectType() {
          ??????? return MessageDigest.class;
          ??? }
          ??? public boolean isSingleton() {
          ??????? return true;
          ??? }
          ??? public void afterPropertiesSet() throws Exception {
          ??????? messageDigest = MessageDigest.getInstance(algorithmName);
          ??? }
          ??? public void setAlgorithmName(String algorithmName) {
          ??????? this.algorithmName = algorithmName;
          ??? }
          }
          ????? getObject方法是供Spring調用,用來返回真正的bean給其它bean的(而不是FactoryBean本身),getObjectType方法可以返回null,但如果指定了類型,就可以使用Spring的自動裝載功能了。isSingleton方法是指定bean是否是單例的,注意不能通過FactoryBean的配置文件來指定bean是否為單例,因為那樣指定的是FactoryBean本身,而不是真正的目標bean。
          ????? FactoryBean的配置和普通bean并沒有什么區別。
          ????? 由于Bean配置文件中,各個屬性都是以String的形式配置的(除了使用ref引用其它bean外),因此,Spring在組裝bean的時候,需要把String類型的值轉化成合適的類型,這就需要用到JavaBean中的概念:PropertyEditor
          ????? Spring內置了7種預先注冊的PropertyEditor:ByteArrayPropertyEditor,ClassEditor,FileEditor,LocaleEditor,PropertiesEditor,StringArrayPropertyEditor,URLEditor。通過名字,我們就能清楚地知道它們對應的類型了。
          ????? 盡管內置的PropertyEditor可以處理大部分常見的類型,我們仍然會碰到需要創建自己的PropertyEditor的情況。為了簡化自定義PropertyEditor的創建,Spring提供了PropertyEditorSupport類,我們只需要擴展該類,并實現其中的setAsText方法即可。
          public class PatternPropertyEditor extends PropertyEditorSupport {
          ??? public void setAsText(String text) throws IllegalArgumentException {
          ??????? Pattern pattern = Pattern.compile(text);
          ??????? setValue(pattern);
          ??? }
          }
          ????? 可以看到,實現一個自定義的PropertyEditor是很容易的,但怎么才能讓它起作用呢,也就是通常所說的注冊PropertyEditor。Spring提供了兩種注冊的方式:1.通過ConfigurableBeanFactory的registerCustomEditor方法;2.在BeanFactory的配置文件中定義CustomEditorConfigurer。
          <bean name="customEditorConfigurer"
          class="org.springframework.beans.factory.config.CustomEditorConfigurer">
          ??? <property name="customEditors">
          ??????? <map>
          ??????????? <entry key="java.util.regex.Pattern">
          ??????????????? <bean class="com.apress.prospring.ch5.pe.PatternPropertyEditor"/>
          ??????????? </entry>
          ??????? </map>
          ??? </property>
          </bean>
          ????? 自定義的PropertyEditor是通過CustomEditorConfigurer的一個類型為Map的屬性添加的,key值是自定義PropertyEditor對應的類型的全類名。
          ??????在使用時需要先調用:
          CustomEditorConfigurer config =
          ??? (CustomEditorConfigurer) factory.getBean("customEditorConfigurer");
          config.postProcessBeanFactory(factory);
          ????? 來將所有自定義的ProperyEditor注冊到BeanFactory中。

          posted @ 2006-12-21 10:24 劉璐 閱讀(345) | 評論 (0)編輯 收藏

          《Pro Spring》學習筆記(7)--基礎進階(2)

          ?

          ????? Spring1.1中引入了一個很有用的IOC新特性--方法注入(Method Injection)。這能讓我們在組裝bean時獲得極大的靈活性。Spring的方法注入可以分為兩種形式:查詢方法注入(Lookup Method Injection)和方法替換(Method Replacement)。查詢方法注入提供了另一種機制來讓bean獲取它依賴的其它bean,方法替換則可以在不修改源代碼的基礎上,修改任意bean的任何方法的實現。為了提供這兩個功能,Spring借助了CGLIB包。
          ??????先來看看查詢方法注入的使用。想象這樣的情形:我們有一個singleton類型的bean A,它需要使用另一個非singleton類型的bean B來執行一些操作。由于兩個bean的生命周期是不同的,因此我們不能簡單的在bean A的配置中使用ref標簽來要求Spring注入bean B,因為那樣會讓我們每次取得bean A時都使用同一個bean B的實例。回想前面介紹過的BeanFactoryAware接口,我們可以讓bean A實現該接口,這樣就可以在bean A內部使用beanFactory的genBean方法來獲取bean B了。只要我們將bean B配置為非singleton類型,每次使用getBean方法就會得到一個新的bean B的實例。
          ??????使用查詢方法注入,我可以不必實現任何的Spring的接口,也不需要在bean A中顯示的使用getBean方法來獲得bean B。我們只需要在bean A中申明一個查詢方法,然后在bean A的配置文件中指明該查詢方法,那么Spring就會自動的將bean B注入到bean A中去了。由于查詢方法注入的概念相對比較復雜,因此我們還是通過具體的例子來直觀的感受它是如何工作的。
          ??????在這個例子中,我們創建一個非singleton的bean和兩個實現了同一個接口的singleton的bean,一個通過傳統的設值方法注入獲得非singleton的bean,另一個則通過查詢方法注入。
          //The MyHelper Bean
          public class MyHelper {
          ??? public void doSomethingHelpful() {
          ??????? // do something!
          ??? }
          }
          //The DemoBean Interface
          public interface DemoBean {
          ??? public MyHelper getMyHelper();
          ??? public void someOperation();
          }
          //The StandardLookupDemoBean
          public class StandardLookupDemoBean implements DemoBean {
          ??? private MyHelper helper;
          ??? public void setMyHelper(MyHelper helper) {
          ??????? this.helper = helper;
          ??? }
          ??? public MyHelper getMyHelper() {
          ??????? return this.helper;
          ??? }
          ??? public void someOperation() {
          ??????? helper.doSomethingHelpful();
          ??? }
          }
          //The AbstractLookupDemoBean
          public abstract class AbstractLookupDemoBean implements DemoBean {
          ??? public abstract MyHelper getMyHelper();
          ??? public void someOperation() {
          ??????? getMyHelper().doSomethingHelpful();
          ??? }
          }
          <beans>
          ??? <bean id="helper" class="com.apress.prospring.ch5.mi.MyHelper" singleton="false"/>
          ??? <bean id="abstractLookupBean"?
          class="com.apress.prospring.ch5.mi.AbstractLookupDemoBean">
          ??????? <lookup-method name="getMyHelper" bean="helper"/>
          ??? </bean>
          ??? <bean id="standardLookupBean"
          ??? class="com.apress.prospring.ch5.mi.StandardLookupDemoBean">
          ??????? <property name="myHelper">
          ??????????? <ref local="helper"/>
          ??????? </property>
          ??? </bean>
          </beans>
          ????? 可以看到,我們使用了lookup-method來對查詢方法注入進行配置,name屬性告訴Spring需要覆寫bean中的哪個方法,該方法必須是沒有參數的,并且返回類型是我們需要獲得的bean的類型,bean屬性告訴Spring查詢方法需要返回哪個bean。
          ????? 通過DemoBean standardBean = (DemoBean)factory.getBean("standardLookupBean");獲得standardBean,然后比較standardBean.getMyHelper() == standardBean.getMyHelper(),可以發現,直接使用設置方法注入,每次獲得的非singleton的bean實際上是同一個實例。而使用查詢方法注入,則會每次得到一個新的實例,這實際上是因為我們使用factory.getBean("abstractLookupBean")獲得abstractBean時,Spring根據lookup-method的配置,覆寫了查詢方法,從而返回一個新的bean實例,正如前面提到的,這是通過CGLIB包來實現的。
          ????? 值得注意的是,我們將查詢方法定義為抽象的,這不是必須的,但這么做能防止我們忘記了配置lookup-method,從而使用了空的(當然不是我們期望的)查詢方法。
          ????? 好了,讓我們再來看看方法替換,雖然它被劃分為方法注入的一種,但它和我們以前接觸到的注入方式有著很大的差異,以前我們都是注入一個bean,而方法替換則是替換bean中的方法實現。同查詢方法注入一樣,我們還是通過一個例子來理解方法替換的使用。
          //The ReplacementTarget Class
          public class ReplacementTarget {
          ??? public String formatMessage(String msg) {
          ??????? return "<h1>" + msg + "</h1>";
          ??? }
          ??? public String formatMessage(Object msg) {
          ??????? return "<h1>" + msg + "</h1>";
          ??? }
          }
          ???? 現在由于某些原因,我們需要修改以String為參數的方法的實現方式,并且不能修改ReplacementTarget類的源代碼,借助于Spring的方法替換,我們可以輕松地實現。
          ???? 首先,創建一個實現了MethodReplacer接口的類。
          public class FormatMessageReplacer implements MethodReplacer {
          ??? public Object reimplement(Object target, Method method, Object[] args)
          throws Throwable {
          ??????? ...
          ??????? String msg = (String) args[0];
          ??????? return "<h2>" + msg + "</h2>";
          ??????? ...
          ??? }
          }
          <beans>
          ??? <bean id="methodReplacer"
          ????class="com.apress.prospring.ch5.mi.FormatMessageReplacer"/>
          ????<bean id="replacementTarget"
          ??? class="com.apress.prospring.ch5.mi.ReplacementTarget">
          ??????? <replaced-method name="formatMessage" replacer="methodReplacer">
          ??????????? <arg-type>String</arg-type>
          ??????? </replaced-method>
          ??? </bean>
          ??? <bean id="standardTarget"
          ??? class="com.apress.prospring.ch5.mi.ReplacementTarget"/>
          </beans>
          ????? 通過replaced-method標簽來配置需要替換的方法,name屬性指明了需要替換的方法名,replacer屬性指明了用哪個bean來實現替換操作。arg-type是用來指明需要替換的方法的參數類型的,在bean中有重載方法時(像ReplacementTarget類一樣),指明參數類型可以讓Spring明確知道需要替換的是哪個方法。值得注意的是,arg-type是模式匹配的,因此,String將匹配String和StringBuffer。
          ????? 方法替換在很多場合都是有用的,比如我們只想為一個特殊的bean改變它所依賴的另一個bean的實現方法,而不影響其它bean的引用。最好是為每個需要替換的方法,或者是一組重載的方法定義一個替換類,而不要為眾多毫不相關的方法使用同一個替換類。這可以減少很多沒必要的比較,從而提高代碼的執行效率。

          posted @ 2006-12-21 10:23 劉璐 閱讀(432) | 評論 (0)編輯 收藏

          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
          主站蜘蛛池模板: 罗江县| 镇巴县| 波密县| 平南县| 青河县| 黄梅县| 会东县| 甘孜| 马关县| 宕昌县| 梨树县| 江口县| 克什克腾旗| 乐清市| 桐乡市| 甘谷县| 通海县| 永州市| 郸城县| 罗江县| 崇礼县| 通辽市| 台东县| 呼玛县| 乃东县| 方正县| 大邑县| 山东省| 平利县| 北票市| 浏阳市| 广州市| 黔西县| 榆社县| 建宁县| 中阳县| 万全县| 玛曲县| 安仁县| 天门市| 河曲县|