??xml version="1.0" encoding="utf-8" standalone="yes"?> 说说遗憾Q?br />1、OSGi在B/S架构中还不好应用。虽然例子是B/S的,可是居然是Servlet模型Q里面解释了目前Equinox目也在扩展应用服务器支持和JSP支持{,可是L(fng)目前q不成熟?br />2、模块的_度很成问题。目前OSGi的契U机制与java interface机制Ҏ(gu)一下。OSGi不可能完全取代本地的interface式的解藕Q当然h家也没这么说。只使我担心q渡设计后,q细的Bundle肯定?x)得不偿失,所以需要有?计划q个_度。这个可能与ZWeb services的SOA架构面(f)cM的问题,需要好的架构师?br />3、文档不友好么?说实话,很感谢BlueDavy和OSGi观察者那些大牛的贡献。但是感觉production的样例工E还是很难搞刎ͼ其实Eclipse plugins的例子满多哈Q可惜没啥文档,需要硬着头皮看)Q对应的指导文档q没出现。BlueDavy提供的servlet实现我们不可能跟上,毕竟单也是一U需求。(那谁说过度设计比设计不更可怕,那个我不是唱反调Q我希望我们都能扑ֈ那个sweet pointQ有个好的参照那最好不q了Q?br />4、由于思想先进Q在某些人看来是x白雪。估计不hq是埋头下里巴h。观望态度?/p>
l束Q又是流水̎Q大家拍砖?/p>
下面的部分,我会(x)l箋分析:D
]]>
springside的一个特点就是managerl承自DAOQ其实这是个名字上的问题?br />Java EE一直强调分层架构,在Web部分比较典型的就是前端MVC、中间Business、后面持久化。而Manager对应businessQ持久化׃实现替换的需求一般用DAO模式?br />先分析一下在轻量化的Java EE下面他们存在的意义:(x)
1、有的h说过在Web目中Manager和DAO是同意的Q尤其是在透明ORM存在下,DAO׃往往是CRUD的实现场所Q而Manager却往往是薄薄的一层门面,很多人就在质疑两者的合ƈ问题?strong>可是robbin曄q行q一个精辟的分析Q虽然两者做的看h差不多,可是两者的事务属性却不一PManager应该有清晰的事务界限Q而DAO不应兛_于此?/strong>也就是说Manager可能?x)将几个DAOҎ(gu)l合调用Q然后封装在一个事物中。这栯明确了两者的一个重要区别,我们也能体会(x)在用声明事务的时候有一个分明的事务界限是很有意义的Q否则就有可能把Manager中的一个事物拆分,q样实际上就错误了?br />2、有些h质疑透明ORM存在的情况下DAO存在的意义,因ؓ(f)透明ORM基本已经隔离了不同数据库的方a区别。这个也很简单,Rod大叔分析q?strong>透明ORM存在的情况下DAO起到了隔透明ORM与EJB或者JDBC实现的作?/strong>Q这几种实现实际上是应该考虑到的?br />3、还有一个问题,是DAO是否应该隐藏透明ORM的API。因为前面说CDAO起到隔离实现的作用,g应该隐藏特定API。可是某大叔也说q,完全隔离不可能,修改底层实现而不修改上层API也不划算Q应该说往往费力不讨好)Q其实就是Rod大叔的思想Q我们宁可提供各Usupport或者templateQ但是不强求抽象出各U实现。所?strong>DAO的实现即使依赖于部分Hibernate API也不是错?br />上面U属贫嘴Q知道的朋友们不要嫌弃?br />说说Springside的实现?br />其实Q?strong>实际上Springside使用的就是经典的GenericHibernateDAO+无Manager的实?/strong>。这么说在否定前面所_(d)不过其实q都是文字游戏:(x)D
首先Q对于HibernateZ的实CQDAO使用Generic是很方便的。Spring的hibernate template受篏于向JDK1.4兼容Q所以没有用genericQ但是实际上DAO是generic的经典应用。在Hibernate|站上有q讨论。现在Springside使用的GenericHibernateDAO已经q化的非常先q了?br />Springside实际上有ManagerQ我说没有其实是指它的Managerl承自DAO?/strong>看似׃uQ但实际上非常合理?strong>前面说了Manager与DAO的很大区别在于事物范_(d)使用l承后,两者之间就可以分离Q可以通过Spring的AOP事物属性配|在Manager上,也就解决了问题。这应该说也是template模式的标准应用。本来Manager有很多Ҏ(gu)可以通过模板实现Q而DAO和Generic很好地解决了他们之间的模板关系?br />我们先看看具体的设计Q?br />以CustomerManagerZQ我们看看类{Q?br />CustomerManager extends BaseHibernateDao<Customer>
BaseHibernateDao<T> extends AbstractHibernateDao<T>
AbstractHibernateDao<T> extends HibernateDaoSupport
三层l构Q?br />W一?/font>AbstractHibernateDaol承自大安熟?zhn)的Spring的HibernateDaoSupportQ这一层的主要作用是扩展GenericQ这样一斚w减少了强行类型{换的啰嗦Q一斚w使DoaminClass的信息通过Genericl承透明声明。这一层还有一个作用,是说不你是否使用GenericQ你的应用程序最好也在这里增加一层承,作用是在需要的时候你可以在这里扩展DAO模版QD
W二?/font>是BaseHibernateDao。这个其实是springside很自豪的一个地方,可以理解Q因里真的花了很多的代码Q而且相当_֦?/strong>不卖官子Q其?strong>q里主要lDAO扩展了分|?/strong>Q这昄是异帔R要的Q大家google一下就知道分页在Web应用中的重要性了Q?strong>基本上你看一个Java Web Framework都会(x)看到它对自己分页Ҏ(gu)的支持方式介绍Q或者说分页的实现风格已l是Java Web Framework实现优劣的一个标准了?/strong>应该_(d)springsdie的分实现来自javaeye上的一个经典的讨论Qrobbin{牛在里面仔l讨Z用DetachedCriteria实现分页查询Q后面引出bugQ然后解冻I希望没看q的朋友都看看。(应用Hibernate3的DetachedCriteria实现分页查询|http://forum.javaeye.com/viewtopic.php?t=14657&postdays=0&postorder=asc&start=0Q?br />springside的实现是集大成者,考虑CCriteriaQ不仅是DetachedCriteriaQ、HQL、collection.size()几种不同实现Q也考虑C使用Criteria的时候Order造成的问?/strong>Q这个在我的Blog中给DetachedCriteria擦屁股那个里面讨Q?br />W三?/font>是具体的ManagerQ它是用Genericl承传递了DoaminModel的类信息。由于大部分CRUD已经在DAO里面实现了,所以Manager只需要实C些需要特D实现的method的就可以了,单的应用中Manager里面l常是空I如也?br />
其中QBaseHibernateDao的实现相对复杂,主要因ؓ(f)里面包装了分实现。大家可以具体看看CriteriaPage和HqlPage两个c,q是_֦所在?/strong>但是在这一层还有个CriteriaSetup是个比较奇怪的东西Q一开始没太看明白是做什么用的。后来问了百衣,他说q是Z解决search问题提供的,从jsp传递过来的东西在Controller层可以通过utilQ?strong>q里springside很CoCQ它把search_开头的东西自动作ؓ(f)?”的查询条g传给ManagerQ但目前的缺陷在于只能默认处理?”,其它方式需要扩?/strong>Q处理查询条件传lManagerQ但是这个东西设计得有点怪,白衣也对它不满意Q说在Springside 2.0里面要重构掉Q但q没有什么好的想法,大家又徏议可以提l他?br />我认Z递查询信息大概需要这L(fng)设计Q?br />1、在Controller里面不暴露hibernate APIQ但是能够顺利将参数传递到Manager?br />2、Manager直接传递,或者将q些参数转换为Hibernate API后再传递,因ؓ(f)q正是manager需要负责的商业逻辑之一?br />3、DAO里面最好不要做那么多{换,毕竟它是持久层?
当然Q目前符合这个要求,只是限定于Map是二元容器,不能?元的查询条gQkey、value、typeQ。所以可能下一步会(x)补?br />分析到这里,springside的DAO的结构大概就是这L(fng)?br />感觉q和我们Team上个目的结构很象(不好意思,没说有springside那么好)Q有一点区别?br />׃Managerl承自DAOQ我们让DAO多了很多Ҏ(gu)Q主要就是想提供方便。尤其是<T> T loadById(Class<T> persistenceClass, Serializable id);
<T> T loadByProperty(Class<T> persistenceClass, String propertyName, Object value);
<T> List<T>listAll(Class<T> persistenceClass);
<T> List<T>listByProperty(Class<T> persistenceClass, String propertyName, Object value);
<T> List<T>listAllOrderBy(Class<T> persistenceClas, boolean isAsc, String orderByPropertyName);
今天有点别的事,先说到这里,好好xQ看有什么问题过两天在说说?strong>qBlog太流水̎Q太I洞Q大家见谅?/strong>
]]>
但是首先却遇C问题Q?br />在Eclipse里面q行functional-testq个target的时候发现报错(test target叶出错的Q:(x)
Could not create task or type of type: junit.
我就惛_然的把junit-3.8.1.jar拯到我?ANT_HOME%/lib下面了,l果问题依旧?br />然后google了下Q发现是q样的:(x)
“该信息表明 Ant 没有扑ֈd或Q务所依靠的类?Ant 试图加蝲 Junit JAR 文g。当?IDE 外部使用 Ant Ӟ应该?junit.jar 攑֜ %ANT_HOME%/lib 文g夏V?Eclipse 时该d无法工作Q因为它使用自n版本?Ant 。所?junit.jar 必须攑֜ Eclipse ?Ant 文g夹中Q即 %ECLIPSE_HOME%/plugins/org.apache.ant_1.6.2/lib Q很昄Q不同版本的 Eclipse ?x)有不同版本?Ant Q。?br />在Eclipse 3.2里面已经是ant_1.6.5了,拯q去问题q是没有解决?br />然后C不少弯\?br />最后,发现其实是这L(fng)。上面提CZEclipse用的自己的antQ这个时候你拯junit-3.8.1.jarq去q不起作用,因ؓ(f)ant讄不会(x)自动扫描那个目录?lib?br />解决Ҏ(gu)目前看最好的是在Eclipse的Window->Preferences->Ant->Runtime->Classpath里面Ant_Home你指定一下就可以了,可以是你自己的Ant或者Eclipse/plugins里面的antQ这没关p,然后它就?x)自动扫描相?lib目录了(之前你应该已l把junit-3.8.1.jar拯q去了)?br />然后搞定了。注意,只有在Eclipseq行Ant才有可能遇上q个问题:D
呵呵Q问题搞定了Q先review一下TestQ看看有什么能解决的。然后我惛_分析一下SpringSide的DAO、Managerq种l构Q明后天?img src ="http://www.tkk7.com/iamtin/aggbug/66841.html" width = "1" height = "1" />
]]>
今天先看看Springside的bookstore的domain设计Q这不是springside的重点,先看看?br />从hbm看vQ在springside-bookstore/src/org.springside.bookstore.commons.domain.hbm下面攄q些hbm?br />在Order.hbm.xml里面可以看到一个list映射。list映射可以按照序持久化one-to-many关系。用了<composite-element>映射后OrderItem没有单独的class声明了,完全以一U组件的形式被映到Order里面?br />有序的List映射是很方便的,q样可以通过List的set(int, Object)来改变OrderItem的顺序,q个需求是l常被提L(fng)?br />Order.java里面可以看到在h(hun)D上使用了RuleQRule是用StringU录的rule idQ我记得springside团队试验性的使用了DroolsQ具体在q步研究后分析?br />Order实现了AclDomainAware接口Q可见是用ACLq行了访问控制。没有承自l一的DomainObject基类Q这个不知从何考虑Q感觉Domainl承自统一基类在框架很多地斚w可以得到便利。实现接口在q里应该作ؓ(f)一U签名标C,作ؓ(f)某些环节或者拦截器使用。SpringSideq里应该是用的是AcegiQ可以看到这个是差沙同学实现的?br />Orderq部分就没有什么其它特别之处了Q是比较典型的pojoQ血模型:D。在q里没有看到全功能DomainModel的媄(jing)子。此时修改Order里面的orderItems需要手动替换,addProduct的功能都不在q里Q的有点不爽?br />BTWQ在Order.hbm.xml的配|里面可以看C面有一?lt;import class="org.springside.bookstore.commons.domain.OrderItem"/>Q不知道起什么作用,希望了解的朋友指炏V?br />在Product.hbm.xml里面有一个承映:(x)“每个类分层l构一张表QTable per class hierarchyQ”的形式?br />再进到Product.java里面Q它实现了HistorizableEntity接口Q而前者又l承自AuditableEntity?br />从里面的注释上看HistorizableEntity作ؓ(f)Hibernate Event Listener的记PҎ(gu)接口的领域对象自动保存修改纪录,q个我找C码在org.springside.core.commons.support.audit.HistoryEventListener里面。这个东西被配置到session上。从代码上看Q这个东西用来记录这个商品的LifeCycleQ不q代码还没有完成Q不知道calvin同学?x)用什么方法得到user{信息(Hibernate Listener是单例,不能有状态信息)。这U方法在RoR里面有个_at和_on的后~Q可以自动完成修Ҏ(gu)间等信息的持久化Q不知道此处是否是要实现cM的功能?br />Product里面有个@SearchableId、@SearchableProperty、@SearchableComponent的注释,q是compass的注释,q种暴露属性提供搜索的配置方式非常舒服Q是对pojoq行搜烦的好例子。compass对Lucene的包装是不错的,q里好像是hellboys同学写的Q有旉深入看一下?br />限制描述字段的功能放Cpojo里面Q这个方法很不错Q大家也都在用?br />Product的toStringҎ(gu)使用的是ToStringBuilder.reflectionToStringQ这个不知大家是否常用,不过q个东西大家要主要。比如在Domain公用基类中就不要用,否则它会(x)Ҏ(gu)有lazy load的属性有毁灭性打?D。Springside没有使用q种l构Q当然没关系?br />Book是Product的子c,l承是OOҎ(gu),q里昄考虑周到QSpringside也就不是仅能卖书的应用了:D。equals、hashCodeҎ(gu)都出C重复。不q,重构M形式的重复都是邪恶的QRoR的Hansson坚信之,所以有了CoC概念?br />不过q里产生一个问题,我实现的一些应用中发现对于Hibernate的承,cd转换是个令h头疼的问题,相当不舒服,因ؓ(f)descrimitor对于你是不可见的Q你很难在保留id的情况下转换一个子cd另一个子cR这点很不灵z,不知大家有什么好办法Q?br />Custemer、Category是单U的Pojo。Category没有实现层次Q这Ҏ(gu)较失望,感觉应该做一个树(wi)形结构的昄理的demo?/p>
]]>
抽出一下:(x)
1、Java从语a转向q_。如?NetQJVM本n提供了^台的抽象。将?x)扩展动态语a与脚本语a的支持?br />2、企业应用的开发过E将化,如MDD一c,但目的是集中_֊开发商业逻辑Q而不是纯化代码或者什么什么。小型应用可能会(x)转向动态语a或脚本语a所营造的舒适开发框Ӟ如RoRQ或其它Rails?br />3、富领域模型替代贫血模型Q基于JPA?br />4、目前的AOP、IoC工具依然?x)流行,而不一定会(x)限定于EJB3模型中。事实说了算QSpringq种事实性标准媄(jing)响力q是很大的?br />5、分布式的考虑Q可伸羃型问题凸显。如何透明实现分布式是个关键性问题,AOP是技术契机?br />6、Web2.0?x)生巨大?jing)响力Q但Javal不是唯一选择。Java要找好自q位置Q同时在q_上最好能够更多的融合Q如让JVM支持PHP/Ruby/Python?br />7、Web部分竞争Ȁ烈,q会(x)持箋。EJB3的JSF命运难测。看Web2.0的浪潮了?/font>
q是一很有趣的文档,所以摘要一下,其实cM阅读W记Q好像是3/25发布的:(x)
不知怎么译Sweet SpotsQ难道翻译ؓ(f)甜处、甜头、蜜炏V蜜I_(d)
q时Z对以下h的采访:(x)
JSF Jacob Hookom
RIFE Geert Bevin
Seam Gavin King
Spring MVC Rob Harrop
Spring Web Flow Rob Harrop and Keith Donald
Stripes Tim Fennell
Struts Action 1 Don Brown
Tapestry Howard Lewis Ship
Trails Chris Nelson
WebWork Patrick Lightbody
Wicket Eelco Hillenius
原文在此Q?a >http://www.virtuas.com/articles/webframework-sweetspots.html
JSF(Jacob Hookom)
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
当你希望览器程序像桌面E序一样工作的时候,你可以遵循标准ƈ获得大量W三Ҏ(gu)持。它致力于降低复杂度。它允许你不与view和特定的action、参C递、状态传递、渲染打交道可以进行高质量的开发,不管是否使用工具?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
它不适合大规模的、只读(其实指读ZQ的|站。在q种情况推荐StrutsQ因为知识库丰富Q应该指文档和用L(fng)Q?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?br />SeamQ?br />优点Q非常简单直?br />~点Q对于大目q于单;没有模块化开发的好例?br />StrutsQ?br />优点Q巨大的文档和用L(fng)Q跟着它没?br />~点Q状?行ؓ(f)的分过于教条化
WebWorkQ?br />优点Q比Struts易于使用
~点Q复杂的UI难于l护QUI代码q于复杂QJSF作者对action Framework都攻击这一点)
TapestryQ?br />优点Q概忉|颖;可以应付复杂的UI
~点Q对于一个组件化QJSF主要竞争Ҏ(gu)Q,它依然依附于page/action的概?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
他认为JSFq个标准下这些应该有W三Ҏ(gu)供。JSF(2.0)?x)提供“Partial Faces Request”,它是Ajax实现。JSF也会(x)增强annotationl徏~程?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?br />很多JSF书都拿Struts作ؓ(f)Ҏ(gu)。他认ؓ(f)q不能体现JSF的特炏V他认ؓ(f)Struts和W(xu)ebWork能做到的JSF也能做到?br />6、你对Ruby on Rails的看法如何?
它与WebWork一样好用,它的CoCQConvention over ConfigrationQ和脚手枉常好用。他认ؓ(f)CoC可以被应用在MframeworkQ他认ؓ(f)q是RoR最大的优点。他q认为RoR?x)走上其它framework的\Q复杂性等Q,因ؓ(f)Z需要自q扩展?/p>
RIFE(Geert Bevin)
Seam(Gavin King)
Spring MVC(Rob Harrop)和Spring Web Flow(Rob Harrop and Keith Donald)
Stripes(Tim Fennell)
Struts Action 1(Don Brown)
Tapestry(Howard Lewis Ship)
Trails(Chris Nelson)
WebWork(Patrick Lightbody)
Wicket(Eelco Hillenius)
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
你可以付?0%的工作量Q得到其它framework?0%的……,它是一个full-stack frameworkQ如RoRQ。它吸收了成熟的分层框架的架构,q将共同的优Ҏ(gu)集在一赗提供了web continuationQPOJO驱动的CRUD生成Q可扩展的基于组建的架构Q无session的状态控ӞxREST作ؓ(f)APIQ双向无逻辑模版引擎Q集成了内容控制框架QCMSQ)。每个层ơ的l徏提供了可复用性(AOPQsiteQsub-siteQpageQwidgetQportlet{)。适合于团队快速开发公共Web目Q适合喜欢开发可复用lg的h?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
团队中的每个人都有其它framework的知识,难于培训他们。开发状态相关的服务器端WeblgQ而不是用RIA或Ajaxd现。第三方支持很重要的情况下(可怜RIFE用户还不大Q。他推荐q种情况下用JSF。或者在XMLZ要发布Ş式的情况下,推荐Cocoon?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
他试验过WebWorkQJSFQW(xu)icket。他喜欢WebWork的简单,但是不喜Ƣ它的模版方式(tag的templateQ应该)Q它也不提供lg装。他认ؓ(f)JSF的工h持非常吸引h。Wicket的纯Java实现很不错,可惜XML配置很不爽?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
关于AjaxQRIFE刚刚集成了DWRQ而且选定以后也用这个。集成DojoQScriptaculousQPrototype都很Ҏ(gu)集成q来?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
q些错误理念Q?、RIFE的XML配置J琐 2、RIFE是continuations server 3、RIFE重新造轮子没有提供新鲜东?4、RIFE的模版语法很y脚q于单和业余 5、RIFE是基于request的framework 6、RIFE的功能太多,学习(fn)曲线陡峭
6、你对Ruby on Rails的看法如何?
RoR对JavaC的冲击非常棒Q元~成也得C信Q。RoR没什么特D之处,也没有从Ruby语言L(fng)很多?br />我讨厌:(x)它的模版。PartialsQRoR中的lgQ。URL的分散处理。Active Record提供了从数据库schema而来的DSLQ但是却不是从domain model而来。没有l10n和i18n支持。手动状态{换。不能在JVMq行Q……)。实际上脚手架生成了实际代码。Ruby~少工具和IDE?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
拥有丰富用户交互体验的应用。方便实现多H口的操作,回退的支持,单窗口多工作区,无状态浏览。对商务程QBPMQ的集成是独一无二的。Seam方便使用数据驱动的ORM。遵循JSF和EJB3Q多d支持Q多H口/多工作区Q,BPM的领先解x案?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
不适合只是数据从数据库显C到|页的应用,q时应该使用PHP或RoR。不适合需要设计特别的HTMLlg的情况,此时应该选用Tapestry或Wicket。还在用JDK1.4的h们。还有那些喜ƢStruts的hQ嘿嘿,够狠Q?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
JSFQ喜Ƣ他的事?交互模型。喜Ƣ他的EL和模型绑定。不喜欢那么多XMLQؓ(f)什么没有annotationQ。创qcontrols太难了?br />TapestryQ非常好。form验证是它的杀手锏Q模版方式很有创意。不q非ZPOJO的组件模型则让我对它失去兴趣?br />RIFEQ这个东西很怪,但是有创业也有趣。我惌一步学?fn)。如果学?fn)先要自?gu)?D
StrutsQ这个东西的模型viewl定太复杂了。东西已l过时了?br />WebWorkQ比Struts好一点,不过也过时了。XWork曄是个很好的实玎ͼ不过现在也过时了?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
Portal支持。远E框架Seam Remoting FrameworkQAjaxQ。模版消息的工具支持。以后还要集成ESBQ计划引擎和异步支持?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
q些都不是真的:(x)JSF不能处理GET requests。JSF post后无法r(sh)edirect。JSF不能与REST共存?br />6、你对Ruby on Rails的看法如何?
它是PHP的很好替代品。如果它有一个正l一点的持久化层它就可以和Java竞争了?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
Spring MVCQ?br />E_可扩展,支持了i18n、文件上传、异常处理,q些E_的支持给开发者坚实的工作基础。是最?jng)_践,告诉你怎么做是最好的。与Spring集成Q领先的IoCq生支持。支持,SpringCz跃和庞大。Struts开发者可以^滑过渡。适合多种目Q可选的多种resultcd?br />Spring Web FlowQ?br />内置d处理引擎Q支持线性处理过E中的持l状态。抽象,减少开发的x炏V适合多种目cdQ插件支持Spring MVC、Struts、JSF{?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
Spring MVCQ不适合需要组件化开发的场景。它是一个request驱动的MVC。那些场景推荐JSF或Tapestry?br />Spring Web FlowQ处理线性页面流Q不适合一般的“自由浏览”。当然Spring Web Flow可以与request驱动或者组仉动共存?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
Spring框架支持Struts和JSF集成?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
Spring MVCQ简化JSP标签。更多的MVC配置schema。CoC风格的默认控制器、URL影射、viewQ学?fn)Rails和Stripes的优炏V增强数据绑定和验证Q支持范型绑定)。Portlet支持。Spring也要接受AjaxQ用DWR库?br />Spring Web FlowQ一大堆Q关心的可以自己看…?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
Spring MVC难于配置。在Spring 2.0Q将?x)改善,可以使用自己定义的基于schema的配|?br />6、你对Ruby on Rails的看法如何?
Spring MVCQRoR非常有趣。不q现在就拿出来用q有点幼E。这里D了个例子Q关于变量的复数形式的处理,RoR?x)用这L(fng)CoC风格来处理变量listQ而Spring MVC也实验了U种风格Q但是受到的l果却很差。h们认语的复数很古怪,没有一定的规则Q所以会(x)带来混ؕQ如Qperson -> peopleQ。所以Spring MVC设计了变?List的命名,personList更加明确Q虽然这样不P但更好用。就是说Spring MVC要取其精华去其糟_?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
与Spring MVC、WebWork{相同。它提供高质量action驱动的框架的同时Q尽量简化配|,增进开发效率。Stripes适合复杂的数据交互的场合。这U情况下l定验证的强就完全体现出来了,能够很好的处理form和map转换{?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
所有的action驱动的framework都适合用户在非Ajax驱动的情况下在一个页面进行松兌Qloosely relatedQ和无状态交互的情况。适合每次都刷新的面。管理多H口间持l状态的应用?x)比较麻烦,此时应该选择JSF。不q我认ؓ(f)90%以上的WebE序都是前者,JSF只适合剩下的那9%QAJAX对于理无状态UI更加适合。客L(fng)不需要AJAXQ则可以看看WicketQ它更加单?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
用过Struts、WebWork、Spring MVC。其中Struts做过商业目Q不q这个东西带来的ȝq比带来的效率提升要多。它认ؓ(f)q些MVC都有三个~点Q暴露了q多的复杂性给可发者。没有提供够的开发便利性,没有提供_多的错误和提CZ息,也没有date格式化等的便利Q其实有Q。稳当太差?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
1.3要加入InteceptorQ实现AOP功能。验证系l要加强。支持Ajax。我q在L一个好的Ajax/javascript库?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
q些观点Q?、Stripes使用了annotation代替XMLQ只是换汤不换药Q由于元数据更接q代码,所以修攚w认的配置非常方便Q不像XML那样复杂Q这是实质的变化?、Annotation意味着你只能有一套配|:(x)我认?0%的action都有自己的一套配|!Stripes?x)根据承关pd找AnnotationsQ子cȝannotation?x)覆盖父cȝQ因为像validation都是可以l承的,如果特别需要还可以覆盖。这样很合理。在1.3中允许validationsZUI事gq行。它向后兼容Q不需要可以不用?br />6、你对Ruby on Rails的看法如何?
我认为JavaC有很多可以从RoR学习(fn)的地斏VStripes学习(fn)了RoR的前端部分,开发者可以减配|量。但是RoR的RHTML让我惛_了以前的JSP中qscriptlet。而后面的ActiveRecord是一个很好的理念Q实现的也很好。ActiveRecord比Hibernate{复杂的ORM工具要容易理解,因ؓ(f)q样的特点RoR才引起了q么大的波澜?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
文档和用户基Q书c和背后的支持。容易雇ChQ也Ҏ(gu)扑ַ作)。虽然其他项目的理念比这个要先进Q但是这些不什么。实际上QW(xu)eb层是很容易也很直接的?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
如果你需要portlets或者复杂的面Q显C很多东西)Q那么Struts要么无法工作要么太枯燥。这U情况你需要一个基于组件的frameworkQ如JSF、Tapestry/Wicket?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
q些我基本都试验q,他们每个都工作的很不错?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
Struts Action 2ZWebWork2Q很快会(x)开始。现在已l支持Ajax了,我们在寻找更加容易的开发方式,JSF支持QStruts ShaleQ,continuation支持Q还有支持更多的脚本语言QBSF扩展脚本撰写ActionQ?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
Struts太过时了Q而且也不P难于使用。但是你可以自己修改或者扩展它。我认ؓ(f)团队对于你的限制q大于framework对你的限制?br />6、你对Ruby on Rails的看法如何?
不需要D&D工具Q旨在帮助开发h员提高开发效率的好例子。我们在Action 2中将学习(fn)它的先进理念?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
我想Tapestry对于中等规模或者大规模的应用会(x)带来很多好处Q甚至你可以在单面的应用程序中获得好处Q。这里有允许你创建新的组件的良好工具。Tapestry不关心数据从哪里来,很多“项目类型”都Z切面QaspectQ(如CRUD vs. RSS feed vs. etc.Q。我认ؓ(f)Tapestry非常Ҏ(gu)与IoC集成QHiveMind或与SpringQ,方便q行试?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
我在其它Java framework中没有找到到ZTapestry的优炏V但是对于RoRQ我自己没有使用q用,很难说RoR中的目应该是什么样子。我没有仔细Ҏ(gu)qRIFEQ它看v来受了RoR影响Q尤其是cMActiveRecord的数据访问层。但是如果你的应用需要特定的URL格式Q那么在Tapestry中奋战胜不大?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
在这两年来我没怎么试qTapestry以外的东ѝ我没怎么学习(fn)RoRQ因为时间太有限了?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
Tapestry 4.0有很好的Ajax支持Q通过Tacos库。而Tapestry 4.1q要q一步强化这斚w的支持?br />Tapestry 5.0提供了明昄改进Q没有abstractc(Tapestry的怪癖:Q。没有强q的l承关系。对属性进行annotation而不是方法。没有XMLQ只有模版和annotaions。只能类装蝲Q自动寻扄的变化。最化APIQ超annotaion。面向方面(Aspect-orientedQ模块构造,使用mix-ins?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
Tapestry 3.0q不Ҏ(gu)试Q?.0改善了一些。Tapestry只是个hUQ实际上我们有很多活跃的贡献者。Tapestry的学?fn)曲UK场陡峭。它只有漂亮的模版实玎ͼ实际上Tapestry的特点在于状态管理(允许对象存储状态,而不是多U程的单例来理requests之间的游d持久状态)
6、你对Ruby on Rails的看法如何?
很有影响力。但是模版的实现非常丑陋。我听到了很多意见,关于RoR的优~点。基于我的基本理解,q些观念对Tapestry 4产生了媄(jing)响(它对Tapestry 5影响更深Q?br />RoR意味着限制了你的选择Q如果你选择RoR那么p旬它的实践QCoC..Q,看v来你的钱?x)花的恨倹{这些类似Microsoft的哲学。而Java更崇给你更宽松的选择Q不限定你用的工具Q但是暧昧的说这需要你对你的工L(fng)解更深。不仅对TapestryQ还对于JEE、Springq写entire stack的框Ӟ需要从RoR学习(fn)Q不仅提供工Pq需要提供整套的解决Ҏ(gu)?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
Trails的应用程序只需要Web界面和持久化的domain model可以了。Trailsl你的domain model快速的提供一个界面,除了POJO自己不需要附加的代码。Trails允许你修改界面的外观和行为,包括验证、i18n、安全。这些都不需要java代码生成Q不喜欢代码生成的h应该感觉很舒适?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
Trails讲究够用好。它允许你快速交付,问问你的客户Q“这样够好么Q”。这?x)改变你的工作流E,当然q不是可以覆盖所有需求的解决Ҏ(gu)。当UI需求很高,Trails没有优势。我认ؓ(f)Trails适合于合的应用Q对于管理员他们只需要够用就好,那么可以用Trails。其它的部分我们可以订制开发,我们在用Tapestry、Hibernate、Spring来实现这些部分,Trails正是Z它们。对于非交互的应用,Trails也不适合Q如报表应用Q可以考虑Eclipse BIRT?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
我用Struts很多。它曄是伟大的framework。主要的~陷是它不能自动帮定数据到domain model。我也研I过JSFQ它比Struts强,但是自定义组建非帔R。Tapestry非常便于自定义组建,其对于建立高阶lgQ有其它lgl成的)非常方便QTrails正在使用它?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
对于Trails来说我们站在巨h的肩膀上。Tapestry在ajax功能作了很多努力Q所以Trails也不难与其共舞。但是我们需要创建更多的例子来演C些。我们也致力于让TrailsҎ(gu)介入到已l进行的目中。以后Trailsq要加入Z实例的安全(instance-based securityQ(目前正在使用Z角色的role-basedQ,q有method invocation?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
Trails是对RoR的移植。Trails的名字来自Rails。它是基于Rails的理念,但不是对它的UL?br />6、你对Ruby on Rails的看法如何?
我认为我们有很多需要从RoR学习(fn)的地方,那将帮助我们享受开发WebE序的惬意?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
一般来_(d)W(xu)ebWork一般适合的团队Q它们愿意保持一双脏手,学习(fn)开元工具如何用。WebWork不面向“轮椅程序员”,那些人只喜欢拖拽式的开发。WebWorkl花旉学习(fn)它的人回报。例如,直到输入和输出的人(阅读了参考文档,那样很好Q能够容易的创徏ActionMapper和Configuration实现来提供“惯例”代曉K|(CoCQ的方便。我最q的例子中,URL是这样?project/123/suite/456/test/create”媄(jing)到“com.autoriginate.actions.project.suite.test.CreateAction”,然后自动的传递参敎ͼ(x)projectId=123、suiteId=456。而Result是“[action].jsp”或者“[action]-[result].jsp”,也可以通过annotation来配|?br />也就是说QW(xu)ebWork是你的应用程序framework中的最?jng)_工具。在q种情况以外也很好,但是目前不算最佳的“甜点”?br />除去q些一般的QW(xu)ebWork对于正在创徏需要插件和扩展的品的人是必备的。例如JIRA、Confluence、Jive Forums。因为WebWork支持q泛的模版语aQVelociy和FreeMarkerQ,完整的tag支持Q模块写好后非常Ҏ(gu)插入。一个jar包就可以包括所有的action和viewQ得益于ftl的classpath支持Q。最l的效果很好Q在Confluence中你可以通过理界面上传一个jarQ这个plug-in׃(x)自动部v。这是因为AtlassianQConfluence、Jira的小l)非常了解q个frameworkQƈ且作了很多的贡献?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
与其它action framework相同QW(xu)ebWork在控制状态和wizards上比较弱。如果你写了很多长的wizardsQJSF可能是比较好的解x案。我q想_(d)文档q需要改善(参考文档还不错Q但是教E、cookbooks和FAQq比较差Q,如果没有一个WebWork高手作ؓ(f)目领队Q新手可能会(x)敬而远之?br />对于非常单的E序Q我推荐使用单的JSP或者Spring MVCQ如果用h受Spring的话。但是ȝ来说Q我认ؓ(f)在action framework中WebWork是最好的?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?br />我试验过RIFE、Spring MVC、Struts、Spring Web FlowQ还有一点点Tapestry。我发现RIFE的概念很优秀Q但是它的实C怎么栗不难想象Geertq是使用“m_”作为字D늚前缀。它看v来不像Java。模版难住了我,所以就没有l箋看?br />Spring MVCq可以,但是它是一个非常简单的framework实现。WebWork的数据绑定(WebWork世界中称为类型{换)要强多了Q而且是自动的Q而Spring需要自己写property editorsQ。在Spring中的view替换支持泰有限了Q而W(xu)ebWork中的UI tags在Spring中压Ҏ(gu)有提供。Spring中你可以使用JSP 2.0L的写自己的tagQ但是不支持其它的语a?br />Spring Web FlowQXML让我抓狂。太q火了,不管Keith的主张,它“不支持M的Web framework”。这个web framwork回避掉了WebWork、Spring MVC、Struts或者其它framework中的99%。我倒不是说q是个坏LQ但是我应该诚实的说它是一个完整的框架?br />Tapestry很优雅,但是HTML属性(jwcidQ惹人厌。我接受q种理念Q且实践中这?x)带来一些好处(Shale也有怼的地方)。但是实际上Q我发现“HTML/CSS开发者”和“app开发者”一般是同一个hQTapestry架讑֦此。实际上Q由于Ajax的推动,我想来多的“程序逻辑”会(x)被嵌入到UIQ这L(fng)话,Tapestry的模型就不那么适宜了?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
在Struts Action 2.0我们希望Q更好的文档。支持标准(如果可以Q我们希望用JSTL代替OGNLQ但是首先要保证不会(x)有功能损失)。增强AJAX支持Q提供更多的widgetsQ如自动完成。解除配|地狱;提供更多的选择Q如我们开始所说的CoC?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
他需要很多的配置Q我已经演示q,通过CoC风格Q它可以做的比Rails更好QRails的管理部允许内嵌controllersQ?br />6、你对Ruby on Rails的看法如何?
非常重要的一Ҏ(gu)Q我要说RoR不能与大多数的frameworkҎ(gu)Q除了RIFE和Seam。对比RoR和W(xu)ebWorkq当于Ҏ(gu)Hibernate和JDBC。一个是full stackQ另一个只是stack中的一部分?br />另一个重要的问题QDHH是个怪胎Q但是聪明的怪胎。它的高效率无可争辩Q它被称为Rails?br />好的Q我们不说这个,随便说说别的Q?br />我用Rails创徏了一个小的app。我把它扔掉q很快用Java重写了。我认ؓ(f)Rails可以让你的app中的80%快速完成;而剩下的20%比前?0%需要花的时间还多。当然程序开发就是这栗脚手架非常P其是ActiveRecord在运行时改变cR但是后来你需要写UI、自定义的验证规则,自定义安全媄(jing)等{。一个基于CRUD的app能够?0分钟内运行ƈ不意味着你能以这个速度完成它?br />Rails的web framework部分相比于WebWork很可怕。实际上Ҏ(gu)无法比较。它的实现更接近于Spring MVC的简单功能?br />完整的stack非常。他们在q方面做得很好,q里Javaq有差距需要追赶。WebWork是web stackQ但是持久化解决Ҏ(gu)q不定。所以最大的问题在于即WebWork和SiteMesh提供了如配置动态读取和动态类reloadingQSpring、iBatis和Hibernateq不提供。它们至需要提供配|重d后才可以发展出类似Rails那样的功能。类似的QHibernate和iBatis对WebWork{的h提供的支持不够。对于一个类Q我可以不需要再xwork.xml中进行配|,但是持久化引擎ƈ不允许我们这样做。当q些功能能够同时具备Q没准一个complete stack的框架就?x)推出?br />要求??0倍是愚蠢的。可靠的工程师都知道开发品的时候最大的警力都花费在构思代码上Q而不是书写代码。定义需求,获取反馈Q市场定位,定义数据库结构,映射用户接口。不用什么语aQ你需要思考很长时间。没有语a或者框架能够提升思考的速度?br />最后,Rails提供了:(x)用脚本语a良好实现的stack。Python、Perl其是PHP中的其它框架q没有成熟。我认ؓ(f)“PHP猴子”们q有很多事情要做Q他们通常不是很有才干的工E师。(可能我翻译错误了Q希望纠正)。在脚本语言中提供良好的框架Qh们能够实现设计精良的appq的到回报(因ؓ(f)脚本语言的特点)。不只是“管理代曉K|CoC”甚x集成stackQJava需要的是立d出变化的能力。很多Java开源领袖认为“修改web.xml”的重新载入是一U方法。这U智力游戏应该结束了。我们不仅仅需要配|文件和cȝ重新载入Q我们需要社区给Sun_的压力,使其能够在下一代的JVM中提供热插拔QHotSwapQ的能力。或者,更加复杂的程序模型,如OSGiQ需要进一布被C所接受。当然我q不希望走那条\Uѝ?/p>
1、你认ؓ(f)你的framework的“甜点”在哪里Q他最适合哪种cd的项目?
我认为有5点:(x)Wicket是以代码Z心的Q可以在view层进行OO~程。组件是完全自管理的Q容易创建和重用。概늚分离是清晰的也是的。干净的模版。开发~性大-像OO一栗?br />2、它不适合于什么样的场景?在这些场景你推荐什么fremeworkQ它是哪个?
Wicket不适合UI很简单且只读的场合。这旉面脚本更加适合Q比如JSPQ或者JSF。如果你需要无限的可~性,你可能需要状态无关的实现。从1.2版开始,W(xu)icket也有无状态页面的概念Q这样可伸羃性与其它framework差不多了?br />3、在下面提到的framework中,你试验过他们么?如果试验q,你比较喜Ƣ哪个?你不喜欢哪个Q?/strong>
JSFQ?br />优点Q基于组件。工业背景。工h持。一些扩展让他更Ҏ(gu)使用。它允许你从传统JSP升到JSF?br />~点Q它~少其它API的优雅。以JSPZ心。配|很多而且代码很难看。有很多U实现。它让我回忆起EJB1/2Q以厂商Z心等{?br />RIFEQ没用过Q说了一大堆?br />SeamQ不是一个真正的Web framework。类似JSF扩展。如果用EJB/JSF/JBossl合Q这个选择很好。但是不遵@JSR 227/235?br />TapestryQ很好,4.0版本好了很多。我把它推荐l我所工作的公司。Wicket更加以编Eؓ(f)中心。而Tapestry更加pragmatic?br />TrailsQ从来没用过?br />Spring Web FlowQframework本n很好Q但是我不喜Ƣ它的stacking。如果用工作,我希望选择一个如jBMP的方案。我也不喜欢以流Z心的解决Ҏ(gu)Q认样很q程化?br />WebWork、Spring MVC、StrutsQModel 2的frameworkp透了。我用过几年Q也对Maverick贡献q代码,但是我彻底失d了。Model 2 framework太过E化了,q些E序员不知道怎么用OO~程。我宁可雇䄦一个Swing~程的h也不?x)去选择一个用Model 2 framework~程的hQ因为Swing~程的h写的E序一般更漂亮。……如果让我从q些Model 2 framework中挑一个出来,我选择StripesQ它抛弃了model 2中的一些不好的斚w?br />4、你的framework的未来会(x)怎样Q对于用户开发会(x)有什么方便用的变化Q你?x)原生支持Ajax么?你们计划支持它了么?
我们会(x)支持Java5。我们会(x)增强Spring支持Q复杂的权限认证支持Q和Z角色的参考实玎ͼq会(x)提供原生AJAX支持QURL加蝲Qnice URLsQ,无状态页{?br />我们的市场占有率不高Q但是用L(fng)在提高。我正在写“Wicket In Action”(Manning出版Q正在筹划中Q今q夏天会(x)出版?br />5、有对你们的framework的传a需要澄清么Q如果有Q是哪个Q?/strong>
关于伸羃性的问题是第一位的。程序的可~型一般是由数据库性能差或者缓存策略查询优化ƈ发等问题。服务器端可伸羃性ƈ不一定不可扩展,可以通过集群来l。…?br />6、你对Ruby on Rails的看法如何?
我喜Ƣ我看到的RubyQ如果我有时间我q会(x)仔细把玩它。如果不是Wicket的问题,我希望更多的实践RoR。…?/p>
]]>