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 刘璐 阅读(269) | 评论 (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 刘璐 阅读(322) | 评论 (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 刘璐 阅读(285) | 评论 (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 刘璐 阅读(335) | 评论 (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 刘璐 阅读(420) | 评论 (0)编辑 收藏

仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页