??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲码欧美码一区二区三区,亚洲免费网站在线观看,久久99国产亚洲精品观看http://www.tkk7.com/happydavy/qz?爱javazh-cnSun, 11 May 2025 23:13:15 GMTSun, 11 May 2025 23:13:15 GMT60tapestry中的各种linklghttp://www.tkk7.com/happydavy/archive/2005/12/27/25613.html 我的java天地 我的java天地Tue, 27 Dec 2005 09:51:00 GMThttp://www.tkk7.com/happydavy/archive/2005/12/27/25613.htmlhttp://www.tkk7.com/happydavy/comments/25613.htmlhttp://www.tkk7.com/happydavy/archive/2005/12/27/25613.html#Feedback0http://www.tkk7.com/happydavy/comments/commentRss/25613.htmlhttp://www.tkk7.com/happydavy/services/trackbacks/25613.html一?contrib:PopupLink lgQ?

Html 模板代码Q?

<h1> PopopLinklgQ?</h1><p>

作用Q弹Z个自定义的窗口,相当于一?Script语名Q?

<br> window.open(URL, windowName, windowFeatures) <br>

1.必须在Bodylg内用?<br>

2.注意href参数它会产生一个地址?context/href参数值?

<p> <span jwcid = "@contrib:PopupLink" href = "/WEB-INF/Home.html" features = 'ognl:"resizable,scrollbars,top=100,left=100,height=400,width=300"' > PopupLinkC?</span>

 

 

二?GenericLinkLink lg

Html 模板代码Q?

1.GenericLinkQ一般作用是用来链接跌{到应用程序范围以外的链接。注意OGNL用法Q?<br>

<a jwcid = "@GenericLink" href = "ognl:'http://'+url" >

<span jwcid = "@Image" image = "ognl:assets.ms" /> 163主页 </a><p>

url参数Q?

private String url="http://www.tkk7.com/happydavy/";

ms参数Q?

<context-asset name="ms" path="http://MS.JPG"/>

作用Q点d׃?163面?

三?.ExternalLink lg

Html 模板代码Q?

<span jwcid = "@ExternalLink" page = "LinkResult" parameters = 'ognl:new java.lang.Object[]{new java.lang.Integer("5"),new java.lang.String("rjzjh")}' >

ExternalLink使用 </span><p>

ExternalLink Q这lg?GenericLink lg复杂Q?Tapestry ?9 U?Service ?“external service?Q它的用法关?LinkResult c?

链接传递参?parameters Q多个参数用逗号隔开。链接的面 “LinkResult?必须实现 IExternalPage 接口Q必重?activateExternalPage Ҏ(gu)
在这个方法中我们可以把传递过来的参数取出来实现我们的逻辑。参数因为单引号内有双引P所以不能用双引P也可以调回来用了Q链接页的地址为: http://localhost:8080/context/app?service=external/LinkResult&sp=5&sp=Srjzjh

接收参数的页面要Q?

?  实现 IexternalPage 接口?

?  覆盖 public void activateExternalPage(Object[] parameters, IRequestCycle cycle) Ҏ(gu)?

如下 Java 文g为:

public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {

this.setPar1((Integer)parameters[0]);

if(parameters.length==2){

this.setPar2((String)parameters[1]);

}

}

三?DirectLink lg

Html 模板为:

<p><span jwcid = "@DirectLink" listener = "ognl:listeners.directlistener" parameters = 'ognl:new java.lang.Object[]{new java.lang.Integer("8"),new java.lang.String("zjh")}' >

q是一个DirectLink链接

</span><br>

<span jwcid = "@DirectLink" listener = "ognl:listeners.DirectResult" parameters = 'ognl:new java.lang.Object[]{new java.lang.Integer("8"),new java.lang.String("zjh")}' >

W二个DirectLinkQ蟩转到LinkResult面

</span>

<br> DirectLink要传的参数是Q?

<span jwcid = "@Insert" value = "ognl:Directpar1" /> ?<span jwcid = "@Insert" value = "ognl:Directpar2" /><p>

W一个组件接收参数方法(监听事gQ:

public void directlistener(IRequestCycle cycle){

Object[] par=cycle.getServiceParameters();

this.setDirectpar1((Integer)par[0]);

this.setDirectpar2((String)par[1]);

}

W二个组件接收参数方法(在蟩转的面中写监听事gQ:

1 Q先跌{到另一个页面:

public void DirectResult(IRequestCycle cycle){

IPage result=cycle.getPage("LinkResult");

cycle.activate(result);

}

2 Q这时参C会随 Session 传到 LinkResult 面Q在 LinkResult 面中写监听事g?

public void getpar(IRequestCycle cycle) {

Object[] par=cycle.getServiceParameters();

this.setDirectpar2((String)par[1]);

this.setDirectpar1((Integer)par[0]);

}



我的java天地 2005-12-27 17:51 发表评论
]]>
tappestry|站的翻?原创) (?http://www.tkk7.com/happydavy/archive/2005/12/19/24562.html 我的java天地 我的java天地Mon, 19 Dec 2005 01:39:00 GMThttp://www.tkk7.com/happydavy/archive/2005/12/19/24562.htmlhttp://www.tkk7.com/happydavy/comments/24562.htmlhttp://www.tkk7.com/happydavy/archive/2005/12/19/24562.html#Feedback0http://www.tkk7.com/happydavy/comments/commentRss/24562.htmlhttp://www.tkk7.com/happydavy/services/trackbacks/24562.html注意
Tapestry中的ListenerҎ(gu)和CQ中的delegate十分相象。一个特D对象的实例中的Ҏ(gu)被当作一个对象。调用这个listener或者listenerҎ(gu)有点命名的؜淆。它应该被叫做delegate和delegateҎ(gu)Q但是已l存在的命名方式已经被广泛接受,在短旉内不Ҏ(gu)被改变?/P>

你只需要构造这listrnerҎ(gu)Q而不是整个servlet。Tapestry会在正确的时候和正确的条件下调用listener的方法。你不需要考虑如何构造URLQ以及通过URL传递什么数据,或者如何结合到你的应用E序中去。这些工作框枉替你做好了?/P>

面和组?/P>

Tapestry把一个应用程序分成一pd的页面。每一个页面由Tapestry的组件组成。组件本w也许是q件构成。这里没有h为的深度?BR>tapestry面本n是lgQ只是有些特D用处的lg?BR>所有的tapestry的组件可以成为其他组件的容器。Tapestry面Q和许多用户定义的组件一P有一个模板,׃个特D的html定义了一些静态的和动态的lg位置Q同时有标签表明那些内嵌的组件是z跃的。组件不需要有标签。Tapestrylg参数也许是双向的Q一个组件可以读取一个参数来获得一个|或者写一个参数来讄一个倹{?/P>

其他的组件。如form和form控制lgQTextField, PropertySelection, Checkbox{等Q得html中的form的实现变得容易。当q样的组件被昄的时候,他们从程序对象中d属性值来提供默认倹{当form被提交的时候,form中的lgdhttp的查询参敎ͼ转换数gؓ合适的cdq且更新E序对象的属性?/P>

引擎Q服务和
随着旉的过去,Tapestry已经发展了它自己的方a?BR>Tapestry的引擎是一个一对象Z心的Q它的作用和Httpsession在Servlet API的作用?引擎的最l职责是存储应用E序的持久状态(从一个请求到下一个请求时存在的属性)Q这个Q务已l通过把引擎存贮在httpsession的方式被完成了。本文档主要讨论默认的实现Q同时标注如何在适当的时候扩展,重写q些实现?/P>

我的java天地 2005-12-19 09:39 发表评论
]]>
tappestry|站的翻?原创)http://www.tkk7.com/happydavy/archive/2005/12/16/24233.html 我的java天地 我的java天地Fri, 16 Dec 2005 08:02:00 GMThttp://www.tkk7.com/happydavy/archive/2005/12/16/24233.htmlhttp://www.tkk7.com/happydavy/comments/24233.htmlhttp://www.tkk7.com/happydavy/archive/2005/12/16/24233.html#Feedback2http://www.tkk7.com/happydavy/comments/commentRss/24233.htmlhttp://www.tkk7.com/happydavy/services/trackbacks/24233.htmlTapestry 是一个用java写成的,Zlg的网l程序框架。Tapestry不仅仅是一个简单的模板化的pȝ。Tapestry在Java Servlet基础上的建立的一个^収ͼ在^C可以建立一个动态的Q交互的|站。它不仅仅是一个模板语aQ而且是一个真正的框架Q利用一些简单的Q可以重用的lg来徏立复杂的应用E序。Tapestry在徏立网l程序的时候简化了很多易错的工作,例如接受各种dQ比如分发接受到的请求,建立和解释URL,处理本地化和国际化的问题以及更多?/P>

对Tapestry的高度评h"对象Q方法和属?Q也是_不仅仅开发者关注Servlet的APIQrequests, responses, sessions, attributes, parameters, URLs{等QTapestry使得开发者更x于对象(包括Tapestry的页面和lgQ而且包括E序的对象)Q对象的Ҏ(gu)以及那些对象的javaBean的属性。也是_在一个tapestry的程序中Q用L动作Q点击链接,提交表单Q会D对象的属性的变化Q这些属性和用户支持的方法(包括E序逻辑Q组合在一赗?/P>

在Tapestry中,你不需要写servletQ你只要写一些ListenerҎ(gu)Q你同样不需要ؓservlet建立URLQ你可以利用一个存在的lgQ例如DirectLinkQƈ配置他的listener的参数来调用Ҏ(gu)。那么Listener的方法到底做了什么呢Q它和后台系l进行交互(通常是无状态的session EJBQ或者是做一些其他的和request相关的记录,同时提供l用户一个新的页面。基本上是这个servlet的核心代码。在tapestry中,你不需要写那些重复的,机械的代码(例如建立urlQ分发请求,理服务器段的状态等{)Q因为那些都被tapestryq个框架完成了?/P>

但是qƈ不表CServlet API是不可访问的Q它仅仅是不跟一个典型的tapestry用户相关?/P>

本文档描qC很多tapestry的一些内在的情况。本文不是教E(教程是另外一个单独的文档Q。事实上Q本文档是给一些tapestry的用L指南Q目的是l那些想使用tapestry的开发者?/P>

tapestry目前的版本是 4.0Q在q去的十几年里已l过了长的发展。Tapestry始终x于生成动态的html代码Q尽有大量的Y件支持XHTML XML ?WML?/P>

几乎所有的Tapestry的API都是一接口的Ş式出玎ͼ同时有默认的实现。只要用新的对象取代现有的接口,框架的行为可以被很容易的取代。最q_的例子就是重载一个存贮的面和它的组Ӟ也许存贮在数据库中)?/P>

最后,Tapestry有值得自豪的完整的JavaDoc的文档。本文档是用来支持那份文档的Q来填补那分文档的一些不明显的不뀂当然JavaDoc是最好的文档?/P>

也许理解Tapestry最隄部分是它是一个以Zlg的,而不是以Z操作的。大多数的技术(StrutsQservlets, PHP{等Q都是基于操作的。当你徏立一个servlet以后Q当用户点击一个链接或者提交一个form的时候机会调用它。你必须选定一个适当的链接,和要传递参数的名字和类型,q样你才能在URL中传递你所需要的信息?/P>

对于那些操作Q点击链接或提交表单Q,你同样必负责去q接你的外部面Q不他们是JSPQservlets, PHP,或者其他Ş式的模板技术)。这需要你建立URLq且把他们放C?lt;a>的标{中Q或者是攑֜一?lt;form>标签的action属性中?/P>

tapestry中所有的东西都是不同的。TapestryE序由页面组成,面是由的lg构成Q组件本w也有可能由其他lg构成。每一个页面都׃个唯一的名字,面中的每个lg都有它唯一的ID...q就是组件模型。同Ӟ每一个组仉有一个地址Q可以快速的和URLq行l定?/P>

事实上,在“向购物车添加物品”的操作中,你不需要写servletQ甚至也不用写组件。你只需要拿一个已有的lgQ例如(DirectLinkQ?然后配置它。当q个lg被显C的时候,它会建立一个回调的链接Q当你点击这个链接的时候,q个回调链接Q包括了面名称和页面内的组件的IDQ将会调用组件上的方法,然后q个Ҏ(gu)׃调用你的E序制定的ListenerҎ(gu)



我的java天地 2005-12-16 16:02 发表评论
]]>
什么是Tapestry?http://www.tkk7.com/happydavy/archive/2005/12/15/24051.html 我的java天地 我的java天地Thu, 15 Dec 2005 07:12:00 GMThttp://www.tkk7.com/happydavy/archive/2005/12/15/24051.htmlhttp://www.tkk7.com/happydavy/comments/24051.htmlhttp://www.tkk7.com/happydavy/archive/2005/12/15/24051.html#Feedback0http://www.tkk7.com/happydavy/comments/commentRss/24051.htmlhttp://www.tkk7.com/happydavy/services/trackbacks/24051.html 

Tapestry是一个用Java语言~写的开源框Ӟ用于创徏动态的、健壮的、高灉|性的web应用E序。Tapestry框架构筑在标准的Java Servlet API之上Q因此它能够很好地兼容Q何servlet容器或者应用服务?/P>

Tapestry一个web应用E序分离Zl页面,而每个页面又由多个组件组成。这提供了一个协调一致的l构Q得Tapestry框架能够专注于Q何一个关键细节,例如QURL解析和派遣、持久化状态储存在客户端还是储存在服务器端、用戯入效验、本地化或国际化、和异常报告。对 Tapestry应用E序的开发包括:使用普通的HTML标签创徏HTML模板Q然后用XML描述文gQ可选)这些模板与量的java代码l合在一赗在Tapestry中,创徏你的应用E序是通过使用对象、方法以及对象的属性-Q-而ƈ非由URLs和查询参数。Tapestry带来了真正的 Java Web应用E序OOP~程?/P>

Tapestry能够非常Ҏ(gu)地创建新lgQ就如同以常规的步骤来构建应用程序一栗而官Ҏ(gu)供了过五十U组Ӟq些lg包括各种各样单的输出lgQ以及非常复杂的表格lg和树型目录组件?/P>

Tapestry能够构徏Q从型的应用程序到各种大型团队开发的几百个独立页面的大型应用E序。Tapestry能够非常Ҏ(gu)C各种底层框架l合Q包括J2EE、Hivemind和Spring?/P>

Tapestry发布于Apache Software Licence 2.0?/P>

Tapestry的哲?/H2>

Tapestry׃下四U关键原则组成:

  • ?Q?应用E序q像火科学那么复杂?/LI>
  • 一致?Q?怎样操作面Q怎样操作lg。在应用程序中怎样操作Q那么在大型应用E序中就怎样操作。不同的开发者会在相识问题上扑ֈ怼的解x案?/LI>
  • 效率 Q?应用E序是可以被升的?/LI>
  • 良好的反馈信?Q?当发生错误或者异常的时候,Tapestry框架本n的运作ƈ不会发生异常Q实际上QTapestry框架会提供非常有用的错误诊断信息?/LI>

q四U原则共同组成了一个宗旨:最单的选择Q就是最正确的选择。越早选择Tapestry框架Q那么就早避免许多ȝ?/P>

我们发现面向lg式web开发是实现q些原则的最好途径。围l着lg来组l框架和你的应用E序Q让框架来替你实现那些o人厌烦的底层代码。你只需要写量的代码,写一些简单的代码Q有时候你甚至不需要写代码。Tapestry让你L?/P>

Tapestry 4.0

Tapestry4.0增加了许多新Ҏ(gu)以便提高你的工作效率:

  •  4.0中新的DTDs配置更加化?/LI>
  • 在HTML中与在XML配置文g中绑定参数的方式被协调一_都用相同的l定前缀?/LI>
  • "Friendly"URLsQ就是说QURLs中携带更多\径信息和更少的查询参C息)已经被集成。这使得你可以将应用E序分别攑֜多个文g夹中而减؜乱,q且可以通过q种方式提高J2EE目发布的安全性?/LI>
  • 监听Ҏ(gu)更加单和灉|QURL中的监听参数会自动映到监听Ҏ(gu)的参敎ͼq且监听Ҏ(gu)可以q回面名称或者页面实例来Ȁz页面?/LI>
  • lg参数不必在担?direction"讄?/LI>
  • 除了每个面和每个组件的消息{略之外Q应用程序现在拥有一个全局的消息策略。消息不再从lg消息{略中寻找,而是从应用程序策略中查询?/LI>
  • 完全支持对JSR-168 Portlets的开发?/LI>
  • Tapestry 4.0比Tapestry3.0减少了对反射和OGNL的用;一部分原因是用了许多新绑定前~Q大部分原因是改变了参数的实现方式?/LI>
  • Hivemind的services和Spring的beans能够直接被页面和lgcL入?/LI>
  • Tapestry 4.0提供了对JDK 1.5 annotation的支持(但是Tapestry本n是运作于JDK 1.3Q?/LI>
  • Tapestry 4.0引进了一个全新的更健壮的用户输入效验子系l。感谢PaulQ?/LI>
  • 现在能够在错误报告里面,用横U精地标明文g中发生错误的代码行?/LI>
  • Forms现在能够被取消,避过客户端效验逻辑Qƈ触发指定的服务器端监听方法?/LI>
  • 你不再局限于Global对象和Visit对象Q只要你愿意Q可以用Q意多的application状态对象?/LI>
  • ׃Hivemind构筑与Tapestry底层Q意味着你可以容易地按照自己的需要修改Tapestry的实现?/LI>
  • 面属性现在能够被持久化于客户端中Q就如同在session中一栗?/LI>
  • lg和组件参数现在可以被标识?deprecated"。组件参数可以拥有别名(当重新命名一个参数时使用Q?/LI>

可以列D出无数Tapestry 4.0的变化。MQ所有的变化都是令h震撼的,减少了开发者的java代码Q减了模板的复杂性,化(或者除去)了XML文g?/P>

现状

Tapestry 4.0的开发工作仍在全力进行中。文档从以前旧的DocBook形式转变到新的Forrest形式Q剔除了许多临时性间隔。指南中新的Quick Start章节已经被撰写?/P>

Tapestry 4.0已经接近最l的beta周期Q新Ҏ(gu)将会被延箋到Tapestry 4.1Qƈ会l逐步完善文档和修正bug。最l版本的Tapestry 4.0预计Q不保证Q会?005q十月推出?/P>

?.0-beta-12升

作ؓTAPESTRY-620修正的一部分Q将当前的IRquestCycle作ؓ可注入的serviceQ简化Tapestry中的一些接口,取消IRequestCycle参数。这可能要求对一些地方的代码实现作适当调整?/P>

?.0-beta-10升

在beta-10和之后的版本中,对于asset serviceQfriendly URLs的配|改变了。在你的hivemind.xml中,?lt;asset-encoder id="asset" path="/assets/"/> 改ؓ<asset-encoder id="asset" path="/assets"/>Q注意斜杠已l被LQ?/P>

从Tapestry 3.0升

Tapestry 4.0h很多新特性,考虑到向后兼Ҏ(gu),有些地方做了限制。具体细节以后会发布Q但是至:

  • Tapestry3.0 面和组件规范仍然保留?/LI>
  • 面和组件的模板没有改变?/LI>

升的时候,你将遇到下列问题Q?/P>

  • 引擎service的定义已l完全改变,可以参看IEngineService API?/LI>
  • BaseEngine的子c通过override来操作异常的方式已经改变。现在可以通过新的Hivemind services来重构默认的配置?/LI>
  • direction参数?custom"已经不再使用。定义一个参数L会生成对应的property?/LI>
  • 参数都不会再通过parameterNamel定propertyQ取而代之的是你必须使用getBinding()Ҏ(gu)?/LI>
  • page loader和specification delegate的关pdl改变,现在delegate提供的specifications会被loader~存Q在3.0中,由delegate来负责缓存)?/LI>
  • Tapestry不再需要Jakarta commons-lang library支持Q这意味着不能再用EnumPropertySelectionModelc(然而,你可以很Ҏ(gu)CTapestry 3.0中拷贝到源代码)?/LI>


我的java天地 2005-12-15 15:12 发表评论
]]>
Spring?http://www.tkk7.com/happydavy/archive/2005/10/28/17282.html 我的java天地 我的java天地Fri, 28 Oct 2005 14:23:00 GMThttp://www.tkk7.com/happydavy/archive/2005/10/28/17282.htmlhttp://www.tkk7.com/happydavy/comments/17282.htmlhttp://www.tkk7.com/happydavy/archive/2005/10/28/17282.html#Feedback0http://www.tkk7.com/happydavy/comments/commentRss/17282.htmlhttp://www.tkk7.com/happydavy/services/trackbacks/17282.htmlSpring?/STRONG> 
关于Spring FrameworkQ今q夏天你可能已经听见很多的议论。在本文?我将试图解释Spring能完成什么,和我怎么会认为它能帮助你开发J2EE应用E序?nbsp;

另一frameworkQ?nbsp;
你可能正在想“不q是另外一个的framework”。当已经有许多开放源代码(和专? J2EE frameworkӞZ么你应该费心读这文?或下载Spring FrameworkQ?nbsp;

我相信Spring是独特的,因ؓ若干个原? 
. 它定位的领域是许多其他流行的framework没有的。Springx提供一U方法管理你的业务对象?nbsp;
. Spring是全面的和模块化的。Spring有分层的体系l构,q意味着你能选择使用它孤立的M部分,它的架构仍然是内在稳定的。因此从你的学习中,你可得到最大的价倹{例?你可能选择仅仅使用Spring来简单化JDBC的?或用来管理所有的业务对象?nbsp;
. 它的设计从底部帮助你~写易于试的代码。Spring是用于测试驱动工E的理想的framework?nbsp;

Spring对你的工E来_它不需要一个以上的framework?STRONG>Spring是潜在地一站式解决Ҏ(gu),定位于与典型应用相关的大部分基础l构
。它也涉及到其他framework没有考虑到的内容?nbsp;

它仅仅是一个从2003q?月才开始的开源工E,但Spring有较长的历史根基。这个开源工E是h自我?002q后期出版的《Expert One-on-One J2EE设计与开发?/STRONG>书中的基代码。这本书展示了Spring背后的基架构。然?q个基础架构的概念要q溯?000q的早些时?q且反映了我Zpd成功的商业工E开发基l构的经验?nbsp;

?003q?月,Spring已经落户于SourceForge上。现在有10个开发h?其中6是高度投入的U极分子?nbsp;

Spring的架构性的好处 

在我们进入细节以前,让我们看一下Spring可以l一个工E带来的一些好? 

. Spring能有效地l织你的中间层对?无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EEҎ(gu)APIs的frameworkQ你会发现Springx了遗留下的问题,?nbsp;

Spring能消除在许多工程上对Singleton的过多?/U>。根据我的经验,q是一个主要的问题Q它减少了系l的可测试性和面向对象Ҏ(gu)?nbsp;

. Spring能消除用各U各h式的属性定制文件的需?在整个应用和工程中,可通过一U一致的Ҏ(gu)来进行配|。曾l感到迷惑,一个特定类要查找迷q般的属性关键字或系l属?为此不得不读Javadoc乃至源编码吗Q有了SpringQ你可很单地看到cȝJavaBean属性。倒置控制的?在下面讨?帮助完成q种化?nbsp;

. Spring能通过接口而不是类促进好的~程习惯Q减编E代价到几乎为零?nbsp;
. Spring被设计ؓ让用它创徏的应用尽可能的依赖于他的APIs。在Spring应用中的大多C务对象没有依赖于Spring?nbsp;
使用Spring构徏的应用程序易于单元测?/U>?nbsp;
Spring能EJB的用成Z个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实C务接口,却不会媄响调用代码?nbsp;
Spring帮助你解册多问题而无需使用EJB。Spring能提供一UEJB的替换物Q它们适于许多web应用。例?Spring能用AOP提供声明性事务而不通过使用EJB容器Q如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现?nbsp;
. Spring为数据存取提供了一致的框架,不论是用JDBC或O/R mapping产品Q如HibernateQ?nbsp;
Spring实使你能通过最单可行的解决办法解决你的问题。这些特性是有很大h(hun)值的?nbsp;

Spring能做什么? 

Spring提供许多功能,在此我将快速地依次展示其各个主要方面?nbsp;

d描述Q?nbsp;
首先,让我们明Spring范围。尽Spring覆盖了许多方面,但我们已l有清楚的概念,它什么应该涉及和什么不应该涉及?nbsp;

Spring的主要目的是使J2EE易用和促q好~程习惯?nbsp;
Spring不重新开发已有的东西。因此,在Spring中你发现没有日志记录的?没有q接?没有分布事务调度。这些均有开源项目提?例如Commons Logging 用来做所有的日志输出Q或Commons DBCP用来作数据连接池),或由你的应用E序服务器提供。因为同L的原因,我们没有提供O/R mapping层,Ҏ(gu)Q已有有好的解决办法如Hibernate和JDO?nbsp;

Spring的目标是使已存在的技术更加易?/U>。例?管我们没有底层事务协调处理Q但我们提供了一个抽象层覆盖了JTA或Q何其他的事务{略?nbsp;

Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东ѝ?/U>例如Q象许多开发h员,我们从来没有为Struts高兴q,q且感到在MVC web framework中还有改q的余地。在某些领域Q例如轻量的IoC容器和AOP框架QSpring有直接的竞争Q但是在q些领域q没有已l较为流行的解决Ҏ(gu)?Spring在这些区域是开路先锋? 

Spring也得益于内在的一致?/U>?nbsp;
所有的开发者都在唱同样的的赞歌,基础x依然是Expert One-on-One J2EE设计与开发的那些?nbsp;
q且我们已经能够使用一些主要的概念,例如倒置控制Q来处理多个领域?nbsp;

Spring在应用服务器之间是可UL?/U>?nbsp;
当然保证可移植性L一ơ挑战,但是我们避免M特定q_或非标准?q且支持在WebLogicQTomcatQResinQJBossQWebSphere和其他的应用服务器上的用戗?nbsp;

倒置控制容器 
Spring的设计核心是 org.springframework.beans ? ZJavaBeans一起工作而设计?nbsp;q个包一般不直接被用户? 但作为基为更多的其他功能服务. 下一个较高层面的抽象?Bean Factory"?nbsp;Spring bean factory 是一个普通的FactoryQ它使对象能够按名称获取Qƈ且能理对象之间的关pR?nbsp;

Bean factories 支持两种对象模式: 
. SingletonQ在此模式中Q有一个具有特定名U的׃n对象实例Q它在查找时被获取。这是默认的Q而且是最为经怋用的。它对于无状态对象是一U理想的模式?nbsp;
.PrototypeQ在此模式中Q每ơ获取将创徏一个独立的对象。例如,q可以被用于允许用户拥有他们自己的对象?nbsp;

׃ org.springframwork.beans.factory.BeanFactory是一个简单的接口Q它能被Z底层存储Ҏ(gu)而实现。你能够方便地实C自己的BeanFactoryQ尽很用户需要。最为常用的定义是: 
.XmlBeanFactoryQ?nbsp;可解析简单直观的定义cd命名对象属性的XMLl构?nbsp;我们提供了一个DTD来ɾ~写更容易?nbsp;
.ListableBeanFactoryImplQ可提供解析存放在属性文件中的bean定义Q和可通过~程创徏BeanFactories?nbsp;

每个bean定义可能是一个POJO(通过cd和JavaBean初始属性定?Q或是一个FactoryBean。FactoryBean接口d了一个间接层。通常Q这用于使用AOP或其他方法来创徏代理对象Q例如,d了声明性事务管理的代理?q在概念上和EJB侦听怼Q但在实践中实现更简单? 

BeanFactories能在一个层ơ结构中可选择性的参与Q根据来自祖先的l承定义。这使在整个应用中公共配|的׃n成ؓ可能Q虽然个别资源,如controller servletsQ也拥有他们自己的独立的对象集合?nbsp;

q种使用JavaBeans的动机在<Expert One-on-One J2EE Design and Development>的第四章中有描述Q在TheServerSide|站上的有免费的PDF(::URL::http://www.theserverside.com/resources/article.jsp?l=RodJohnsonInterview).  

通过BeanFactory概念QSpring成ؓ一个倒置控制的容器?我非怸喜欢containerq个术语Q因为它使h联想到重量容器Q如EJB容器。Spring的BeanFactory是一个可通过一行代码创建的容器Qƈ且不需要特D的部v步骤? 

位于倒置控制背后的概忉|?FONT color=#ff0000>Hollywood原则中经常表qͼ"Don’t call me, I’ll call you." IoC控制职责搬q了框架中,q脱d用代码。涉及到配置的地方,意思是说在传统的容器体pȝ构中Q如EJBQ一个组件可以调用容器ƈ问“我需要它l我做工作的对象X在哪?”;使用IoC容器则只需指出lg需要X对象Q在q行时容器会提供l它。容器基于方法名作出q种说明Q或可能Ҏ(gu)配置数据如XML?nbsp;

倒置控制的几个重要好?/STRONG>。如Q?nbsp;
. 因ؓlg不需要在q行旉L合作者,所以他们可以更单的~写和维护。在Spring的IoC版本里,lg通过暴露JavaBean的setterҎ(gu)表达他们依赖的其他组件。这相当于EJB通过JNDI来查找,EJB查找需要开发h员编写代码?nbsp;
. 同样原因Q应用代码更Ҏ(gu)试。JavaBean属性是单的QJava核心的,q且Ҏ(gu)试Q仅~写一个包含自w的Junit试Ҏ(gu)用来创徏对象和设|相兛_性即可?nbsp;
. 一个好的IoC实现隐藏了强cd。如果你使用一个普通的factory来寻扑֐作者,你必通过cd转换返回结果{变ؓ惌的类型。这不是一个主要问题,但是不雅观。用IoCQ你在你的代码中表达强类型依赖,框架负责类型{换。这意味着在框枉|应用时Q类型不匚w导致错误;在你的代码中Q你无需担心cd转换异常?nbsp;
. 大部分业务对象不依赖于IoC容器的APIs。这使得很容易用遗留下来的代码Q且很容易的使用对象无论在容器内或不在容器内。例如,Spring用户l常配置Jakarta Commons DBCP数据源ؓ一个Spring beanQ不需要些M定制代码dqg事。我们说一个IoC容器不是侵入性的Q用它q不会你的代码依赖于它的APIs。Q何JavaBena在Spring bean factory中都能成Z个组件?nbsp;

最后应该强调的是,IoC 不同于传l的容器的体pȝ? 如EJB), 应用代码最程度的依靠于容器。这意味着你的业务对象可以潜在的被q行在不同的IoC 框架?或者在M框架之外-不需要Q何代码改?nbsp;

以我的经验和作ؓSpring用户Q过分强调IoCl应用代码带来的好处是不Ҏ(gu)的?nbsp;

IoC不是一个新概念Q但是它在J2EE团体里面刚刚到达黄金旉?nbsp;有一些可供选择的IoC 容器: notably, Apache Avalon, PicoContainer ?nbsp;HiveMind. Avalon 不会成ؓ特别行的,管它很强大而且有很长的历史?U>Avalon是相当的重量U和复杂的,q且看v来比新的IoC解决Ҏ(gu)更具侵入?/U>?nbsp;PicoContainer是一个轻量而且更强调通过构造器表达依赖性而不是JavaBean 属性?nbsp;与Spring不同Q它的设计允许每个类型一个对象的定义(可能局限性结果来自它对Java代码外的元数据的拒绝)。作为和Spring and PicoContainer and other IoC frameworks的比较,可参看文?IMG alt=::URL:: hspace=2 src="http://www.blogcn.com/images/aurl.gif" align=absBottom border=0>http://www.springframework.org/docs/lightweight_container.html.  q个业面包含了PicoContainer站点链接 ?nbsp;

Spring BeanFactories 是非常轻量的。用户已l成功地他们应用在applets中和单独的Swing应用中?它们也很好地工作在EJB容器中? 没有Ҏ(gu)的部|步骤和可察觉的启动旉。这个能力表明一个容器在应用的Q何层面差不多立即可以发挥非常大的价倹{?nbsp;

Spring BeanFactory 概念应用贯穿于Spring整体Q?nbsp;而且是Spring如此内在一致的关键原因。在IoC容器中,Spring也是唯一的,它用IoC作ؓ基础概念贯穿于整个框架?nbsp;

对应用开发h员,最重要的是Q一个或多个BeanFactory提供一个定义明的业务对象层。这是类似的Q但比local session bean层更单。与EJBs不同Q在q个层中的对象可能是相关的,q且他们的关p被自己的factory理。有一个定义明的业务对象层对于一个成功的体系l构是非帔R要的?nbsp;

Spring ApplicationContext 是BeanFactory的子接口,Z列提供支? 
.消息LQ国际化支持 
.事g机制Q允许应用对象发布和随意地注册ؓ事g监听 
.便携文g和资源访?/U> 

XmlBeanFactoryCZ 
Spring用户通常在XML“bean定义”文件中配置他们的应用。Spring的XML bean定义文档的根是一?lt;beans> 元素。该元素包含一个或多个 <bean>定义。我们一般指定一个bean定义的类和属性。我们也必须指定ID作ؓ标识Q我们将在代码中使用该标志?nbsp;
让我们来看一个简单的例子Q在J2EE应用中常看到用来配置三个应用对象Q?nbsp;
. J2EE DataSource 
. 使用DataSource的DAO 
. 在处理过E中使用DAO的业务对?nbsp;

在下面的例子中,我们使用一个来自Jakarta Commons DBCP目的BasicDataSource。这个class(和其他存在的class一?可以单地被应用在Spring bean factory中,因ؓ它提供了JavaBean格式的配|。需要在shutdown时被调用的CloseҎ(gu)可通过Spring?destroy-method"属性被注册Q来避免BasicDataSource需要实CQ何Spring 接口?nbsp;

代码: <textarea>
<beans> 
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> 
        <property name="url"><value>jdbc:mysql://localhost:3306/mydb</value></property> 
        <property name="username"><value>root</value></property> 
    </bean> </textarea>


我们感兴的BasicDataSource的所有属性都是String型的Q因此,我们?lt;value>元素来指定他们的倹{如果必要的话,Spring使用标准?nbsp;JavaBean属性编辑器机制来{换String以表C其他的cd?nbsp;

现在Q我们定义了DAOQ它有一个对DataSource的bean引用。Bean间关p通过<ref>元素来指? 
代码: <textarea>
<bean id="exampleDataAccessObject" class="example.ExampleDataAccessObject"> 
        <property name="dataSource"> 
            <ref bean="myDataSource"/> 
        </property> 
    </bean> </textarea>

业务对象有一个DAO的引用和一个int型属?exampleParam): 
代码: 
<textarea><bean id="exampleBusinessObject" class="example.ExampleBusinessObject"> 
        <property name="dataAccessObject"><ref bean="exampleDataAccessObject"/></property> 
        <property name="exampleParam"><value>10</value></property> 
    </bean></beans> </textarea> 


对象间的关系一般在配置中明地讄Q象此例子一栗我们认样做是g好事情。无论如何,Spring也提供了我们叫做"autowire"的支持, 一个la PicoContainerQ在那里Q它可以指出bean间的依赖关系。这样做的局限性-如用PicoContainerQ是如果有一个特D类型的多个BeanQ要作出一个类型应该与哪个实例相关的判断将是不可能的。好的方面,在factory初始化后Q不理想的依赖可能会被捕获到?Spring 也ؓ清楚的配|提供一U可选的依赖查,它可以完成这个目? 

如果我们不想明确的编写他们的关系Q在上面的例子中Q我们可如下使用autowireҎ(gu): 
<textarea> 
<bean id="exampleBusinessObject" class="example.ExampleBusinessObject" autowire="byType"> 
<property name="exampleParam"><value>10</value></property> 
</bean> </textarea> 

使用q用用法QSpring找出exampleBusinessObject的dataSource属性应该被讄为在当前BeanFactory中找到的DataSource实现。在当前的BeanFactory中,如果所需要类型的bean不存在或多于一个,生一个错误。我们依然要讄exampleParam属性,因ؓ它不是一个引用?nbsp;

Autowire支持和依赖检查刚刚加入CVSq将在Spring 1.0 M2(?0/20,2003)中提供。本文中所讨论的所有其他特性都包含在当?.0 M1版本中?nbsp;

来自Java代码的外在关pL编码有极大的好处,因ؓ改变XML文g而无需改变一行Java代码是可能的?/U>例如Q我们可以简单地改变myDataSource的bean定义来提供不同的bean class以用一个可供选择的连接池Q或者一个测试数据源?nbsp;在一个单独可选的XML片断中,我们可以用Spring的JNDI 定位FactoryBean来从application server获取一个数据源?nbsp;

现在让我们来看例子中业务对象的java 代码。注意下面列出的代码中没有对Spring的依赖。不像EJB容器QSpring BeanFactory不是侵入性的Q在应用对象里面你通常不需要对他们~码?nbsp;
代码: 
public class ExampleBusinessObject implements MyBusinessObject { 

   private ExampleDataAccessObject dao; 
   private int exampleParam; 

   public void setDataAccessObject(ExampleDataAccessObject dao) { 
      this.dao = dao; 
   } 

   public void setExampleParam(int exampleParam) { 
      this.exampleParam = exampleParam; 
   } 

   public void myBusinessMethod() { 
      // do stuff using dao 
   } 



注意属性设|器Q在bean定义文档中,它对应与XML引用。这些将在对象用之前被Spring调用. 

q些应用bean不需要依赖于Spring。他们不需要实CQ何Spring接口或者承Spring的类Q他们只需要遵守JavaBeans命名习惯。在Spring 应用环境之外重用它们是非常简单的Q例如,一个测试环境。只是例C它有默认的构造器Qƈ且通过setDataSource()和setExampleParam()的调用来手工讄它的属性?U>只要你有一个没有参数的构造器Q如果你惛_单行代码支持E序化的创徏Q你可以自由定义其他的带有多个属性构建的器?/U> 

注意Q在业务接口中没有声明的JavaBean属性将会一起工作?nbsp;他们是一个实现细节。我们可以插入带有不同bean属性的不同的实现类而不影响q接对象或者调用代码?nbsp;

当然QSpring XML bean factories 有更多的功能没有在这里描qͼ但是Q这给你一U基本用的感觉。同Ӟ单的属性和有JavaBean属性编辑器的属性,Spring可以自动处理lists,maps和java.util.Properties.



]]>
String q个Ҏ(gu)的对?/title><link>http://www.tkk7.com/happydavy/archive/2005/09/16/13138.html</link><dc:creator> 我的java天地</dc:creator><author> 我的java天地</author><pubDate>Fri, 16 Sep 2005 02:44:00 GMT</pubDate><guid>http://www.tkk7.com/happydavy/archive/2005/09/16/13138.html</guid><wfw:comment>http://www.tkk7.com/happydavy/comments/13138.html</wfw:comment><comments>http://www.tkk7.com/happydavy/archive/2005/09/16/13138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/happydavy/comments/commentRss/13138.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/happydavy/services/trackbacks/13138.html</trackback:ping><description><![CDATA[     摘要: 大家先来看看一D奇怪的E序Q? public class TestString { public static void main(String[] args) { String s1 = "Monday"; String s2 = "Monday"; } } q个E序真是单啊Q可是有什么问题呢Q? 1. 来自 String 的忧? 上面q段E序中,到底有几?..  <a href='http://www.tkk7.com/happydavy/archive/2005/09/16/13138.html'>阅读全文</a><img src ="http://www.tkk7.com/happydavy/aggbug/13138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/happydavy/" target="_blank"> 我的java天地</a> 2005-09-16 10:44 <a href="http://www.tkk7.com/happydavy/archive/2005/09/16/13138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>上v面试的ȝhttp://www.tkk7.com/happydavy/archive/2005/08/25/11046.html 我的java天地 我的java天地Thu, 25 Aug 2005 06:00:00 GMThttp://www.tkk7.com/happydavy/archive/2005/08/25/11046.htmlhttp://www.tkk7.com/happydavy/comments/11046.htmlhttp://www.tkk7.com/happydavy/archive/2005/08/25/11046.html#Feedback4http://www.tkk7.com/happydavy/comments/commentRss/11046.htmlhttp://www.tkk7.com/happydavy/services/trackbacks/11046.html单位有事把我召回来了Q真郁闷Q已l收C家公司的录用函了Q最可惜的是一家做外包的公司已l准备发录用函了Q在IBM上班Q上下班都有班RQ面试用p聊了一个多时Q终于通过了,薪水肯定不会低,太可惜了555555
回来好几天了Qؓ了ȝq次Mh功应聘两家的l验Q特面试的试题ȝ如下Q以备下ơ找到更好的公司而努力,也请hotmanx指点一?BR>1  HashMap和HashTable有什么区?/P>

2  数据库中有以下数?BR> ID(pri)(Auto) name pass
 1  aaa 111
 2  bbb 222
 3  ccc 333
L一条SQL语句现有的三条记录复制一下,辑ֈ以下的效?BR> ID(pri) (Auto) name pass
 1  aaa 111
 2  bbb 222
 3  ccc 333
 4  aaa 111
 5  bbb 222
 6  ccc 333
再用一条sql删除重复记录
q个要hotman_xq个sqlA来回{了Q呵?/P>

3  在服务器端,从一个jsp面中蟩到另外一个jsp面中有几种Ҏ(gu)Q?/P>

4  数据库中表结构如下,
 IDQPriQ?nbsp; int
 no    int
 name    varchar
 birthDay   Date
 用java写一个函?q回所有符合条?no = int a  & name = str $ birthdavy = date 的结果集?/P>

5 jsp和Servlet的区别和联系

6  设计一个权限管理模型,分ؓaQb两组 al的一般用户只能读取a的tableQal中的管理员可以对a的tableq行CRUD
同样Qbl的一般用户只能读取b的tableQbl中的管理员可以对b的tableq行CRUD
񔽎理员可以对aQb的tableq行CRUD
写出部分实现代码

7 居然q有一家公司让我用30分钟的时间作?0道脑{急{弯,我得?6分,呵呵

上面的题目除了那个sql的题目我没做出来Q别的题目还是让公司比较满意?呵呵



]]>
Learn Spring in springQ{载)http://www.tkk7.com/happydavy/archive/2005/08/25/11043.html 我的java天地 我的java天地Thu, 25 Aug 2005 05:52:00 GMThttp://www.tkk7.com/happydavy/archive/2005/08/25/11043.htmlhttp://www.tkk7.com/happydavy/comments/11043.htmlhttp://www.tkk7.com/happydavy/archive/2005/08/25/11043.html#Feedback0http://www.tkk7.com/happydavy/comments/commentRss/11043.htmlhttp://www.tkk7.com/happydavy/services/trackbacks/11043.html
当前的Ş势是Q非常多的JavaE序员言必称SpringQ如此大面积的程序员集体叫”春”,体现了Spring框架的威力?
 Spring的设计目的是化J2EE开发,所以如果我们学习、用它的时候还需要抓破头皮口吐白沫的话,岂不是个W话Q就我的l验来说QSpring在这斚w做得很好Q的是一个很牛叉易用的框架?BR> 一、IoC与DI
 首先惌说IoCQInversion of ControlQ控制倒{Q。这是spring的核心,贯穿始终。所谓IoCQ对于spring框架来说Q就是由spring来负责控制对象的生命周期和对象间的关pR这是什么意思呢QD个简单的例子Q我们是如何扑֥朋友的?常见的情冉|Q我们到处去看哪里有长得漂亮w材又好的mmQ然后打听她们的兴趣爱好、qq受电(sh)话号、ip受iq号………,惛_法认识她们,投其所好送其所要,然后嘿嘿……这个过E是复杂深奥的,我们必须自己设计和面Ҏ(gu)个环节。传l的E序开发也是如此,在一个对象中Q如果要使用另外的对象,必d到它Q自己new一个,或者从JNDI中查询一个)Q用完之后q要对象销毁(比如Connection{)Q对象始l会和其他的接口或类藕合h?BR> 那么IoC是如何做的呢Q有点像通过婚介扑֥朋友Q在我和x友之间引入了一个第三者:婚姻介绍所。婚介管理了很多L奛_的资料,我可以向婚介提出一个列表,告诉它我x个什么样的女朋友Q比如长得像李嘉ƣ,w材像林熙雷Q唱歌像周杰伦,速度像卡z斯Q技术像齐达内之cȝQ然后婚介就会按照我们的要求Q提供一个mmQ我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介l我们的人选不W合要求Q我们就会抛出异常。整个过E不再由我自己控Ӟ而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的c都会在spring容器中登讎ͼ告诉spring你是个什么东西,你需要什么东西,然后spring会在pȝq行到适当的时候,把你要的东西dl你Q同时也把你交给其他需要你的东ѝ所有的cȝ创徏、销毁都由spring来控Ӟ也就是说控制对象生存周期的不再是引用它的对象Q而是spring。对于某个具体的对象而言Q以前是它控制其他对象,现在是所有对象都被spring控制Q所以这叫控制反转。如果你q不明白的话Q我军_攑ּ?BR> IoC的一个重Ҏ(gu)在系l运行中Q动态的向某个对象提供它所需要的其他对象。这一Ҏ(gu)通过DIQDependency InjectionQ依赖注入)来实现的。比如对象A需要操作数据库Q以前我们L要在A中自q写代码来获得一个Connection对象Q有了spring我们只需要告诉springQA中需要一个ConnectionQ至于这个Connection怎么构造,何时构造,A不需要知道。在pȝq行Ӟspring会在适当的时候制造一个ConnectionQ然后像打针一P注射到A当中Q这样就完成了对各个对象之间关系的控制。A需要依赖Connection才能正常q行Q而这个Connection是由spring注入到A中的Q依赖注入的名字p么来的。那么DI是如何实现的呢?Java 1.3之后一个重要特征是反射QreflectionQ,它允许程序在q行的时候动态的生成对象、执行对象的Ҏ(gu)、改变对象的属性,spring是通过反射来实现注入的。关于反的相关资料h阅java doc?BR> 理解了IoC和DI的概念后Q一切都变得简单明了,剩下的工作只是在spring的框架中堆积木而已?BR>二、spring理对象的简单例?
 M需要交lspring理的对象,都必d配置文g中注册,q个q程被称为wiringQ下面做一个最单的Hello world演示Q我们将要注册的cd下:
/*
* 创徏日期 2005-3-22
*/
package org.bromon.spring.test;
/**
* @author Bromon
*/
public class HelloTalker
{
public String greeting()
{
return "hello world";
}
}
 然后我们来编写一个spring配置文gQ文件名LQ在我这里它是springConfig.xmlQ需要注意的是这个文件应该存攑֜classpath所包含的\径中Q?BR><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<beans>
 <bean id=”helloTalker?class=?org.bromon.spring.test.HelloTalker?gt;
 </bean>
</beans>
 通过使用bean标签Q注册了一个HelloTalker对象Q它的名字叫做helloTalker。然后我们编写一个测试类Q它的工作是利用spring框架提供的接口,加蝲配置文gQ通过指定对象的idQ获得一个对象。它的代码如下:
/*
* 创徏日期 2005-3-17
*/
package org.bromon.spring.test.junit;
import java.io.FileInputStream;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.bromon.spring.test;
/**
* @author Bromon
*/
public class TestStudentManager extends TestCase {
public void testHelloTalker()
{
try
{
ApplicationContext context =new ClassPathXmlApplicationContext("springConfig.xml");

HelloTalker ht=(HelloTalker)context.getBean(“helloTalker?;
System.out.println(ht.greeting());
}catch(Exception e)
{
e.printStackTrace();
}
}
}
 q个E序完成了Q因为只有一个对象HelloTalker被注册到了spring中,所以不存在对象间的依赖Q当然也׃涉及依赖注入。下面演CZ个简单的依赖注入Q?BR> W一步是修改HelloTalkerQ增加一个String name属性:
public String name;

 属性编写setҎ(gu)Q该Ҏ(gu)必须严格遵守javabean的命名规则:
public void setName(String name)
{
  this.name=name;
}
  修改greetingҎ(gu)Q?/P>

public String greeting()
{
  return "hello "+name;
}
 如你所见,name属性没有初试化Q因为它的值将在运行过E中被spring动态注入?BR> W二步,修改springConfig.xml中唯一的这个bean配置Q?/P>

<bean id=”helloTalker?class=?org.bromon.spring.test.HelloTalker?gt;
 <property name=”name?gt;
  <value>bromon</value>
 </property>
</bean>

 修改完成。我们将一个名字”bromon”写dspringConfig.xml中,它会被动态的注入到HelloTalker的name属性中QgreetingҎ(gu)会把它打印出来。重新运行刚才的junitc,可以看到l果?BR> 我们只演CZ如何注入一个最单的StringQ实际上我们可以注入M值类型,也可以注入Q何类的实例,也可以注入List、Map、Properties。配|文件管理了所有的对象和对象间的关p,而对象则只负责执行自q功能Q他们的职责少Q藕合度低Q系l就容易测试,理l护也更Ҏ(gu)?BR> <bean>标签q有很多属性,用于指定对象如何被实例化Q它也有很多子标{于配|对象的属性,请大家参考相关的DTD和文档,能够很快的掌握。本pd文章不是spring手册Qspring的基知识请参考spring in actionQ够详l准。后面的章节更多的讨论系l设计、开发的一些细节和高Ҏ(gu)?BR>三、spring中的hibernate开?
 spring中对hibernate的支持是非常强大的,从一个简单的例子q得出来,从这个例子中我们q将Ҏ(gu)谓的轻量U容器做一些讨论?BR> 首先需要配|数据源Q通常我们有两U方式获得ConnectionQ一是自q写代码获得连接,二是从JNDI环境中得到DataSourceQ然后生一个Connection。无论怎样Q既然是spring下面的对象,应该注册到配置文g中。假设我们需要一个连接mysql下面一个叫做examer的数据库Q手动方式的配置是:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
    <value>jdbc:mysql://localhost/examer</value>
  </property>
  <property name="username">
    <value>root</value>
  </property>
  <property name="password">
    <value></value>
  </property>
</bean>

 很好L不是Q假如我们用JNDI数据源,那么dataSource的声明就应该是:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName">
    <value>java:compenvjdbcspringExamer</value>
  </property>
</bean>
 你需要在JNDI环境中绑定一个名为jdbc/springExamer的东西,q段代码才有实际意义。另外需要提醒的是,所有的bean声明Q它的id必须是唯一的?BR> 在本pȝ中,数据库操作是被hibernate装h的,所以dataSource是不需要注入到具体的逻辑cMQ它只会被注lhibernate的sessionFactory?BR> 按照常规思\Q我们需要在spring中注册hibernate的sessionFactoryQ它应该是我们自q写的一个类Q获得dataSourceQ返回sessionFactoryQ其他的逻辑c通过q个sessionFactory获得sessionq行数据库操作?BR> 但是我们有另外一U选择Qspring直接提供了对sessionFactory的封装,你只需要注册一个spring自己的类Q给它提供必ȝ属性,它会q回一个org.springframework.orm.hibernate.HibernateTemplateQ这个类装了add、del{操作,它的装E度相当高,通过它来~写hibernate应用非常单。但是问题出来了Q我们该如何选择Q?BR> 表面上看Q用spring自己的库无疑更加单,但是h意,spring是一个轻量的框Ӟ所谓轻量Q一个重要特征就是无侵入性,也就是你使用q套框架Q不会被它绑定,被spring理的类Q应该不需要用它的接口和抽象c,q样你的pȝ不会对spring产生依赖。但是如果你使用了spring装的方式去操作hibernateQ就必须l承org.springframework.orm.hibernate.support.HibernateDaoSupportc,q导致了l定。所以做q样的选择是有点痛苦的Q如果有一天spring框架不存在了Q你的代码怎么升l护Q具体问题只能具体分析,在我们的应用中,完全使用了spring装的HibernateTemplateQ它太好用了Q所以容易上瘾?BR> 假设我们有一张student表,l构很简单:
  
id      自动增长
  name     varchar(40)
  password   varchar(32)
  grade     int(4)      q
  sex     Boolean      性别(true为男Qfalse为女)
 设计一个StudentcL映射q张表:

/*
* 创徏日期 2005-3-17
*/
package net.bromon.spring.examer.pojo;
/**
* @author Bromon
*/
public class Student
{
private int id;
private String name;
private String password;
private int grade;//q
private boolean sex;

getsetҎ(gu)……?
}
 ~写Student.hbm.xmlQ让hibernate知道如何d联student表和Studentc,该文件和Student.java在同一目录Q?/P>

<hibernate-mapping>
  <class name="net.bromon.spring.examer.pojo.Student" table="student">
    <id name="id" column="id">
      <generator class="identity"/>
    </id>

    <property name="name" column="name" />
    <property name="password" column="password" />
    <property name="grade" column="grade" />
    <property name="sex" column="sex" />
  </class>
</hibernate-mapping>
 然后我们可以在spring中配|sessionFactoryQ?/P>

<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource">
    <ref bean="dataSource"/>
  </property>

  <property name="hibernateProperties">
    <props>
      <prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
    </props>
  </property>

  <property name="mappingDirectoryLocations">
    <list>
      <value>classpath:/netbromonspringexamerpojo</value>
    </list>
  </property>
</bean>
 其中引用了我们之前注册过的dataSourceQmappingDirectoryLocations属性指明了.hbm.xml文g在哪里\径,该文件夹下面?hbm.xml文g会被全部加蝲?BR> 一切都准备qAQ现在我们要加入一个StudentManagerc,来进行增删查改的操作Q?BR>/*
* 创徏日期 2005-3-17
*/
package net.bromon.spring.examer.student;
import net.bromon.spring.examer.pojo.Student;
import org.springframework.orm.hibernate.HibernateTemplate;
import org.springframework.orm.hibernate.LocalSessionFactoryBean;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
/**
* @author Bromon
*/
public class StudentManager extends HibernateDaoSupport
{
private LocalSessionFactoryBean sessionFactory;
private HibernateTemplate ht;
public StudentManager()
{
this.ht=super.getHibernateTemplate();
}

public void add(Student s)
{
ht.save(s);//插入一条数据只需要这一行代?
}
}
 该类只演CZ如何增加一个StudentQHibernateTemplateq封装了很多有用的方法,h阅spring文档。StudentManager中的sessionFactory是由spring注入的,但是StudentManagerq没有对sessionFactory做Q何的处理Q这是因为所有的处理都被HibernateDaoSupport.getHibernateTemplate()装。整个StudentManager中也看不CQ何的异常处理Q他们也都被基类装了?BR> 最后一个步骤就是在spring中注册StudentMangerQ然后向它注入sessionFactoryQ?/P>

<bean id="studentManager" class="net.bromon.spring.examer.student.StudentManager">
  <property name="sessionFactory">
    <ref bean="sessionFactory"/>
  </property>
</bean>

 所有的配置都完成了Q下面做单元试Q?/P>

/*
* 创徏日期 2005-3-17
*/
package net.bromon.spring.examer.student.test;
import java.io.FileInputStream;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import net.bromon.spring.examer.pojo.Student;
import net.bromon.spring.examer.student.StudentManager;
import junit.framework.TestCase;
/**
* @author Bromon
*/
public class TestStudentManager extends TestCase {
public void testAdd()
{
try
{
ApplicationContext context =new ClassPathXmlApplicationContext("springConfig.xml");

Student s=new Student();
s.setName("bromon");
s.setPassword("123");
s.setGrade(3);
s.setSex(true);

((StudentManager)context.getBean("studentManager")).add(s);
}catch(Exception e)
{
e.printStackTrace();
}
}
}
 Spring已经hibernate的操作简化到了非帔R的程度,最关键的是整个开发可以由设计来驱动,如果一个团队对spring有够的熟?zhn)Q那么完全可以由设计师规划所有的c,整理清楚cM间的关系Q写成配|文Ӟ然后~写hibernate映射文gQ将数据表与pojo兌Q成员就可以完全在设计方案内工作Q利用spring装好的hibernate模版Q开发v来速度非常快,调试也很Ҏ(gu)。它能够解决如何在团队内贯彻设计Ҏ(gu)的问题?BR> ׃本文不讲解hibernate的用,所以相兛_容请查阅hibernate文档?BR>四、Spring中的事务控制
 Spring和EJB一P提供了两U事务管理方式:~程式和声明式。在考试pȝ中我们将使用声明式的事务理Q这是spring推荐的做法。用这U方式可以体验到spring的强大便P而且我们无须在DaocM~写MҎ(gu)的代码,只需要通过配置文g可以让普通的javacd载到事务理中,q个意义是很重大的?BR> Spring中进行事务管理的通常方式是利用AOPQ面向切片编E)的方式,为普通javacd装事务控Ӟ它是通过动态代理实现的Q由于接口是延迟实例化的Qspring在这D|间内通过拦截器,加蝲事务切片。原理就是这P具体l节请参考jdk中有兛_态代理的文档。本文主要讲解如何在spring中进行事务控制?BR> 动态代理的一个重要特征是Q它是针Ҏ(gu)口的Q所以我们的dao要通过动态代理来让spring接管事务Q就必须在dao前面抽象Z个接口,当然如果没有q样的接口,那么spring会用CGLIB来解决问题,但这不是spring推荐的方式,我们也不做讨论?BR> 参照前面的例子,我们为StudentManager.java定义一个接口,它的内容如下Q?/P>

/*
* 创徏日期 2005-3-25
*/
package org.bromon.spring.examer.student;
import java.util.List;
import org.bromon.spring.examer.pojo.Student;
/**
* @author Bromon
*/
public interface StudentManagerInterface
{
public void add(Student s);
public void del(Student s);
public void update(Student s);

public List loadAll();
public Student loadById(int id);
}

 StudentManager也应该做Z改,实现该接口:

public class StudentManager extends HibernateDaoSupport implements StudentManagerInterface
 现在需要修攚w|文Ӟ用于定义Hibrenate适用的事务管理器Qƈ且把sessionFactory注入q去Q同时还需要通过注册一个DefaultTransactionAttribute对象Q来指出事务{略。其中sessionFactory的定义已l在本文的第三章中说明?BR> 首先定义一个Hibernate的事务管理器Q让它来理sessionFactoryQ?BR><bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
 <property name="sessionFactory">
  <ref bean="sessionFactory"/>
 </property>
</bean>

 下面定义事务理{略Q我们希望把{略定义在方法这个别上Q提供最大的灉|性,本例中将addҎ(gu)定义为:PROPAGATION_REQUIRES_NEWQ这可以保证它将始终q行在一个事务中?/P>

<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
 <property name="properties">
  <props>
   <prop key="add">
    PROPAGATION_REQUIRES_NEW
   </prop>
  </props>
 </property>
</bean>

 我们不仅可以为addҎ(gu)定义事务{略,q可以定义事务隔ȝ度和回滚{略,他们以逗号隔开,比如我们的add事务可以定义?

<prop key="add">
PROPAGATION_REQUIRES_NEW,-ExamerException
</prop>

 q个事务{略表示addҎ(gu)会独占一个事务,当事务过E中产生ExamerException异常Q事务会回滚?BR> Add/update/del都是写入Ҏ(gu)Q对于selectQ读取)Ҏ(gu)Q我们可以指定较为复杂的事务{略Q比如对于loadAll()Ҏ(gu)Q?BR> 
<prop key=”loadAll?gt;
 PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITED,readOnly
 </prop>

 该事务的含义为,loadAllҎ(gu)支持事务Q不会读取未提交的数据,它的数据为只读(可提高执行速度Q?BR> 如你所见,我们的StudentManagerInterface接口中还有一个loadById(int id)Ҏ(gu)Q也许我们将来还会有很多的loadByXXXX的方法,N要一一Z们指定事务策略?太烦ZQ他们应该和loadAll()一P所以我们可以用通配W,定义所有的loadXXXXҎ(gu)Q?/P>

<prop key=”load*?gt;
PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITED,readOnly
</prop>

 现在可以定义事务理器:
<bean id="studentManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
 <property name="target">
  <ref bean="studentManager"/>
 </property>
 <property name="transactionManager">
  <ref bean="transactionManager"/>
 </property>
 <property name="transactionAttributeSource">
  <ref bean="transactionAttributeSource"/>
 </property>
</bean>
 q个bean的外观是一个接?StudentManagerInterface)Q我们指Z它的具体实现(studentManager)Q而且为它l定了事务策略。在客户端用的时候,获得对象是StudentManagerInterfaceQ所有的操作都是针对q个接口的。测试代码ƈ没有改变Q我们虽然修改了很多地方Q加入了事务控制Q但是客Lq没有受到媄响,q也体现了spring的一些优ѝ测试代码如下:
  
public void testAdd()
{
ApplicationContext ctx=new ClassPathXmlApplicationContext("springConfig.xml");
StudentManager sm=(StudentManager)ctx.getBean("studentManager");

Student s=new Student();
s.setId(1);
s.setName("bromon");
s.setPassword("123");
s.setGrade(1);
s.setSex(0);

sm.add(s);
}
通过以上的代码可以看出,spring可以单的把普通的java classU_事务理Q声明性的事务操作h也很Ҏ(gu)。有了spring之后Q声明性事务不再是EJB独有Q我们不必ؓ了获得声明性事务的功能而去忍受EJB带来的种U不ѝ?BR>我所使用的mysql是不支持事务的,你可以更换用PostgreSQLQ有了spring+hibernateQ更换dbq不像以前那h怖了Q步骤很单:
1?dPostgreSQL的jdbc驱动
2?修改dataSource配置Q包括驱动名U、url、帐受密?BR>3?修改sessionFactory的数据库dailet为net.sf.hibernate.dialect.PostgreSQLDialect
4?修改hbm.xml中的主键生成{略为increment
所有的修改都在配置文g中完成,业务代码不需要Q何修改,我很满意QHow about u?
附A  pring中的所有事务策?BR>    PROPAGATION_MANDATORY
    PROPAGATION_NESTED
    PROPAGATION_NEVER
    PROPAGATION_NOT_SUPPORTED
    PROPAGATION_REQUIRED
    PROPAGATION_REQUIRED_NEW
    PROPAGATION_SUPPORTS
附B  Spring中所有的隔离{略Q?BR>    ISOLATION_DEFAULT
   ISOLATION_READ_UNCOMMITED
    ISOLATION_COMMITED
    ISOLATION_REPEATABLE_READ
    ISOLATION_SERIALIZABLE



]]>
վ֩ģ壺 avƷɫ߿ | ޾ƷŮþþþ| ޶Ʒav| һһƬѲ| ߹ۿƵ| ǵӰȫ| aۺaav| Ƶѹۿ| þþƷҹɫav| ޾Ʒ91רֻ| ߲˳Ƶ߹ۿ| 99þþƷѾƷ| sssձ߹ۿ| լоƷһ߹ۿ| ޾Ʒ˽Ĺ| ۺϾþҹAV | ԲľƷƵѿ| ŷߴSUV| »ɫվ| Ѳһ| 99պƷ| ˬˬƬA| ɫĻ߹ۿ| һëƬۿ| ձ߹ۿ| ¼ۺͼƬ| ޸Ʒһ| Ʒһ߹ۿ| Ļ߹ۿ| ձһһѿ| Ļwww˳| ѿŮˬ| ձһ| լ666ѹۿ| պëƬѿ| ѿŮˬƵ| ձվۿ| ˳Ƭ߹ۿ| ѹСƵ߹ۿ| ޹VA߹ۿ| ޾ƷձƷ|