??xml version="1.0" encoding="utf-8" standalone="yes"?>
Spring 的创立?Rod Johnson 以一U批判的眼光看待 Java™ 企业软g开发,q且提议很多企业N都能够通过战略C?IOC 模式Q也UC依赖注入Q来解决。当 Rod 和一个具有奉献精的开放源码开发者团队将q个理论应用于实跉|Q结果就产生?Spring 框架。简a之,Spring 是一个轻型的容器Q利用它可以使用一个外?XML 配置文g方便地将对象q接在一赗每个对象都可以通过昄一?JavaBean 属性收C个到依赖对象的引用,留给您的单Q务就只是在一?XML 配置文g中把它们q接好?/p>
![]() |
|
依赖注入是一个强大的Ҏ,但是 Spring 框架能够提供更多Ҏ。Spring 支持可插拔的事务理器,可以l您的事务处理提供更q泛的选择范围。它集成了领先的持久性框Ӟq且提供一个一致的异常层次l构。Spring q提供了一U用面向方面代码代替正常的面向对象代码的简单机制?/p>
Spring AOP 允许您?em>拦截?/em> 在一个或多个执行点上拦截应用E序逻辑。加强应用程序在拦截器中的日志记录逻辑会生一个更可读的、实用的代码基础Q所以拦截器q泛用于日志记录。您很快׃看到Qؓ了处理横切关注点QSpring AOP 发布了它自己的拦截器Q您也可以编写您自己的拦截器?/p>
![]() ![]() |
![]()
|
?Struts 怼QSpring 可以作ؓ一?MVC 实现。这两种框架都具有自q优点和缺点,管大部分h同意 Struts ?MVC 斚w仍然是最好的。很多开发团队已l学会在旉紧迫的时候利?Struts 作ؓ构造高品质软g的基。Struts h如此大的推动力,以至于开发团队宁愿整?Spring 框架的特性,而不愿意转换?Spring MVC。没必要q行转换Ҏ来说是一个好消息。Spring 架构允许您将 Struts 作ؓ Web 框架q接到基?Spring 的业务和持久层。最后的l果是现在一切条仉具备了?/p>
在接下来的小H门中,您将会了解到三种?Struts MVC 整合?Spring 框架的方法。我揭C每U方法的~陷q且Ҏ它们的优炏V?一旦您了解到所有三U方法的作用Q我会向您展示一个o人兴奋的应用E序Q这个程序用的是这三种Ҏ中我最喜欢的一U?/p>
![]() ![]() |
![]()
|
接下来的每种整合技术(或者窍门)都有自己的优点和特点。我偏爱其中的一U,但是我知道这三种都能够加深您?Struts ?Spring 的理解。在处理各种不同情况的时候,q将l您提供一个广阔的选择范围。方法如下:
ActionSupport
cL?Structs
DelegatingRequestProcessor
覆盖 Struts ?RequestProcessor
Action
理委托l?Spring 框架 无论您用哪U技术,都需要?Spring ?ContextLoaderPlugin
?Struts ?ActionServlet
装蝲 Spring 应用E序环境。就像添加Q何其他插件一P单地向您?struts-config.xml 文gd该插Ӟ如下所C:
|
前面已经提到q,?下蝲 部分Q您能够扑ֈq三个完全可使用的例子的完整源代码。每个例子都Z个书c搜索应用程序提供一U不同的 Struts ?Spring 的整合方法。您可以在这里看C子的要点Q但是您也可以下载应用程序以查看所有的l节?/p>
![]() ![]() |
![]()
|
H门 1. 使用 Spring ?ActionSupport
手动创徏一?Spring 环境是一U整?Struts ?Spring 的最直观的方式。ؓ了它变得更单,Spring 提供了一些帮助。ؓ了方便地获得 Spring 环境Q?code>org.springframework.web.struts.ActionSupport cL供了一?getWebApplicationContext()
Ҏ。您所做的只是?Spring ?ActionSupport
而不?Struts Action
cL展您的动作,如清?1 所C:
清单 1. 使用 ActionSupport 整合 Struts
|
让我们快速思考一下这里到底发生了什么。在 (1) 处,我通过?Spring ?ActionSupport
c而不?Struts ?Action
c进行扩展,创徏了一个新?Action
。在 (2) 处,我?getWebApplicationContext()
Ҏ获得一?ApplicationContext
。ؓ了获得业务服务,我用在 (2) 处获得的环境?(3) 处查找一?Spring bean?/p>
q种技术很单ƈ且易于理解。不q的是,它将 Struts 动作?Spring 框架耦合在一赗如果您x换掉 SpringQ那么您必须重写代码。ƈ且,׃ Struts 动作不在 Spring 的控制之下,所以它不能获得 Spring AOP 的优ѝ当使用多重独立?Spring 环境Ӟq种技术可能有用,但是在大多数情况下,q种Ҏ不如另外两种Ҏ合适?/p>
![]() ![]() |
![]()
|
?Spring ?Struts 动作中分L一个更巧妙的设计选择。分ȝ一U方法是使用 org.springframework.web.struts.DelegatingRequestProcessor
cL覆盖 Struts ?RequestProcessor
处理E序Q如清单 2 所C:
清单 2. 通过 Spring ?DelegatingRequestProcessor q行整合
|
我利用了 <controller>
标记来用 DelegatingRequestProcessor
覆盖默认?Struts RequestProcessor
。下一步是在我?Spring 配置文g中注册该动作Q如清单 3 所C:
清单 3. ?Spring 配置文g中注册一个动?/strong>
|
注意Q在 (1) 处,我用名U属性注册了一?beanQ以匚w struts-config 动作映射名称?code>SearchSubmit 动作揭示了一?JavaBean 属性,允许 Spring 在运行时填充属性,如清?4 所C:
清单 4. h JavaBean 属性的 Struts 动作
|
在清?4 中,您可以了解到如何创徏 Struts 动作。在 (1) 处,我创Z一?JavaBean 属性?code>DelegatingRequestProcessor自动地配|这U属性。这U设计 Struts 动作q不知道它正?Spring 理Qƈ且您能够利?Sping 的动作管理框架的所有优炏V由于您?Struts 动作注意不到 Spring 的存在,所以您不需要重写您?Struts 代码可以用其他控制反转容器来替换?Spring?/p>
DelegatingRequestProcessor
Ҏ的确比第一U方法好Q但是仍然存在一些问题。如果您使用一个不同的 RequestProcessor
Q则需要手动整?Spring ?DelegatingRequestProcessor
。添加的代码会造成l护的麻烦ƈ且将来会降低您的应用E序的灵zL。此外,q有q一些用一pd命o来代?Struts RequestProcessor
的传闅R?q种改变会对这U解x法的使用寿命造成负面的媄响?/p>
![]() ![]() |
![]()
|
一个更好的解决Ҏ是将 Strut 动作理委托l?Spring。您可以通过?struts-config
动作映射中注册一个代理来实现。代理负责在 Spring 环境中查?Struts 动作。由于动作在 Spring 的控制之下,所以它可以填充动作?JavaBean 属性,qؓ应用诸如 Spring ?AOP 拦截器之cȝҎ带来了可能?
清单 5 中的 Action
cM清单 4 中的相同。但?struts-config 有一些不同:
|
清单 5 是一个典型的 struts-config.xml 文gQ只有一个小的差别。它注册 Spring 代理cȝ名称Q而不是声明动作的cdQ如Q?Q处所C。DelegatingActionProxy cM用动作映名U查?Spring 环境中的动作。这是我们使用 ContextLoaderPlugIn
声明的环境?/p>
一?Struts 动作注册Z?Spring bean 是非常直观的Q如清单 6 所C。我利用动作映射使用 <bean>
标记的名U属性(在这个例子中?"/searchSubmit
"Q简单地创徏了一?bean。这个动作的 JavaBean 属性像M Spring bean 一栯填充Q?
清单 6. ?Spring 环境中注册一?Struts 动作
|
![]() ![]() |
![]()
|
动作委托解决Ҏ是这三种Ҏ中最好的。Struts 动作不了?SpringQ不对代码作M改变可用于?Spring 应用E序中?code>RequestProcessor 的改变不会媄响它Qƈ且它可以利用 Spring AOP Ҏ的优点?
动作委托的优点不止如此。一旦让 Spring 控制您的 Struts 动作Q您可以?Spring l动作补充更强的zd。例如,没有 Spring 的话Q所有的 Struts 动作都必LU程安全的。如果您讄 <bean>
标记?singleton 属性ؓ“false”Q那么不用何种ҎQ您的应用程序都在每一个请求上有一个新生成的动作对象。您可能不需要这U特性,但是把它攑֜您的工具׃也很好。您也可以利?Spring 的生命周期方法。例如,当实例化 Struts 动作Ӟ<bean>
标记?init-method 属性被用于q行一个方法。类似地Q在从容器中删除 bean 之前Qdestroy-method 属性执行一个方法。这些方法是理昂贵对象的好办法Q它们以一U与 Servlet 生命周期相同的方式进行管理?/p>
![]() ![]() |
![]()
|
前面提到q,通过?Struts 动作委托l?Spring 框架而整?Struts ?Spring 的一个主要的优点是:您可以将 Spring ?AOP 拦截器应用于您的 Struts 动作。通过?Spring 拦截器应用于 Struts 动作Q您可以用最的代h处理横切x炏V?/p>
虽然 Spring 提供很多内置拦截器,但是我将向您展示如何创徏自己的拦截器q把它应用于一?Struts 动作。ؓ了用拦截器Q您需要做三g事:
q看h非常单的几句话却非常强大。例如,在清?7 中,我ؓ Struts 动作创徏了一个日志记录拦截器?q个拦截器在每个Ҏ调用之前打印一句话Q?/p>
|
q个拦截器非常简单?code>before() Ҏ在拦截点中每个方法之前运行。在本例中,它打印出一句话Q其实它可以做您惛_的Q何事。下一步就是在 Spring 配置文g中注册这个拦截器Q如清单 8 所C:
|
您可能已l注意到了,清单 8 扩展?清单 6 中所C的应用E序以包含一个拦截器。具体细节如下:
<value>
标记?
是q样。就像这个例子所展示的,您?Struts 动作|于 Spring 框架的控制之下,为处理您?Struts 应用E序提供了一pd全新的选择。在本例中,使用动作委托可以L地利?Spring 拦截器提?Struts 应用E序中的日志记录能力?/p>
Java深入C定程?׃可避免的到设计模式(design pattern)q一概念,了解设计模式,自己对java中的接口或抽象类应用有更q理解.设计模式在java的中型系l中应用q泛,遵@一定的~程模式,才能使自q代码便于理解,易于交流,Observer(观察?模式是比较常用的一个模?其在界面设计中应用q泛,而本站所x的是Java在电子商务系l中应用,因此想从电子商务实例中分析Observer的应?
虽然|上商店形式多样,每个站点有自q特色,但也有其一般的共?单就"商品的变?以便及时通知订户"q一?是很多网上商店共有的模式,q一模式cMObserver patern.
具体的说,如果|上商店中商品在名称 h{方面有变化,如果pȝ能自动通知会员,是|上商店区别传统商店的一大特?q就需要在商品product中加入Observerq样角色,以便productl节发生变化?Observer能自动观察到q种变化,q能q行及时的update或notify动作.
Java的APIqؓ为我们提供现成的Observer接口Java.util.Observer.我们只要直接使用它就可以.
我们必须extends Java.util.Observer才能真正使用?
1.提供Add/Delete observer的方?
2.提供通知(notisfy) 所有observer的方?
import java.util.Observable; public class product extends Observable { private String name; private float price; public String getName() { public void setName(String name) { } public float getPrice() { public void setPrice(float price) { } //以下可以是数据库更新 插入命o. } public static void main(String[] args) { |
我们注意?在productcM 的setXXXҎ?我们讄?notify(通知)Ҏ, 当调用setXXX,实际上就触发了notisfyObserversҎ,q将通知相应观察者应该采取行动了.
下面看看q些观察者的代码,他们I竟采取了什么行?
//观察者NameObserver主要用来对品名U?name)q行观察?br>public class NameObserver implements Observer{ private String name=null; public void update(Observable obj,Object arg){ name=(String)arg; } } } //观察者PriceObserver主要用来对品h?price)q行观察?br>public class PriceObserver implements Observer{ private float price=0; public void update(Observable obj,Object arg){ price=((Float)arg).floatValue(); } } } |
正如上面信息工程的创始hJames MartinZ息工E的概念所做定?a target=_new>c?/font>|模式(patterns)的创始h建筑师ChriSTopher Alexander?lt;模式语言Q?977?979>一书中Ҏ式的概念q行了如下描q?附注Q书名后面的q䆾代表在各个不同时期的作品Q下面Ş式同?Q?br>每一个模式描qC一个在我们周围不断重复发生的问题,以及该问题的解决Ҏ的核心。这P你就能一ơ又一ơ的使用该解x案而不必做重复力_。每个模式是׃部分l成的一个规则,q个规则描述特定环境、问题和解决Ҏ之间的关pR简单的_没有一个模式是独立的实体,每个模式都存在着怺支持Q但支持的程度不同:大的模式可以内嵌的模式Q同{层ơ的模式q列存在Q而小的模式被嵌入到大的模式之中?
--- Christopher Alexander
模式的概念在软g行业被采用以后,得到的广泛的发展Q现在已l存在许多种cd的模式应用,其中比较有名的箸作有Q?a target=_new>GoF(Erich GAmma、Richard Helm、Ralph Johnson和John VlissIDEs四hQ简UͼGang of Four[GoF])?lt;设计模式Q?995>QMartin Fowler?lt;分析模式Q?997>QFrank Buschmann{h?lt;体系l构模式Q?996?000>、Jim O.Coplien、Niel Harrison{h?lt;~程模式Q?995?996?998?999>和Deepak Alur{h?lt;J2EE核心模式Q?001>{,其中最具媄响的是GoF?lt;设计模式>一书,书中详细讨论了三U类型,?3U模式。好的设计源于工作中l验的积累,当设计用标准的模板以模式的方式q行交流Ӟ模式成了交和重用的强大机Ӟq且可以改善设计和开发Y件的方式。模式可以帮助我们在一个特定的环境里整理ƈ记录已知的可重现的问题及解决ҎQƈ且通过模式来与他h交流q些知识Q这些模式可以解军_不同环境中重复出现的问题。模式可以设计重复使用Q重复用已知的解决Ҏ可以~短设计和开发应用的周期Q有效的使用模式Q可以我们q离重复投资的怪圈。模式的关键在于单性和可重现性?br> 举一个模式应用的单示例。例如,在你的便携式电脑上运行一个进E中?a target=_new>对象Qƈ且这些对象需要和q行在另一q程中的别的对象通信Q也许这一q程q不在你的便携式电脑上,而在别的地方。你又不惌pȝ中的对象担心如何扑֯|上的其他对象或者执?a target=_new>q程q程调用。这Ӟ可以使用代理(Proxy模式Q详见GoF?lt;设计模式>一?模式来解册个问题,你能做的事就是ؓq个q程对象在你的本地过E中建立一个代理对象,该代理对象和q程对象h相同的接口。你的本地对象利用通常处理q程中的消息发送来和代理交谈。这时代理对象负责把消息传送给实在对象Q而不实在对象位于何处?br> ׃下面要讲的Java 2q_的企业版(J2EE)应用模式中很多用C设计模式?a target=_new>重构(Refactoring)的概念,所以在此有必要再概要介l一下重构的概念。重构已l被证明可以L软g的腐朽和衰|Q关于重构方面的有名怽当然首推是Martin Fowler所写的<重构Q?999>一书了Q书中详l介l了重构的七大类型,?0余种具体的重构手法,同时也指出测试机制在重构中的重要性。书中Martin Fowler寚w构的概念q行了详l说明:
重构是对软g内部l构的一U调_目地是在不改变[软g之可察行为]的前提下Q提高其可理解性,降低其修Ҏ本。重构是一U有U律的、经q训l的、有条不紊的E序整理ҎQ可以将整理q程中不心引入的错误的机率降到最低,本质上说Q重构就是在代码写好之后改进它的设计。重构之前,首先查自己是否有一套可靠的试机制Q这些测试必L我检验能力?/p>
--- Martin Fowler
建立于Java~程语言和Java技术基之上的J2EEq_是最适用于企业分布式环境的应用l构Q它被设计ؓ面向多层体系的结构。J2EE包含下面关键技术:Java服务器页?Java Service PageQJSP)?a target=_new>Servlet?a target=_new>Enterprise JavaBeans(EJB)lg?a target=_new>Java消息服务(Java Message ServiceQ?a target=_new>JMS)?a target=_new>JDBC和Java命名与目录接?Java Naming and DIrECtory InterfaceQJNDI)。由于J2EEq_?a target=_new>分层pȝQ所以我们将J2EE的层ơ模型化Q这个模型得我们将职责逻辑地分C同的层中Q共分了五个层次Q客户层、表C层、业务层、集成层和资源层。因为客户层和资源层q不是J2EEq_直接x的问题,所以后面介l的15个J2EE应用模式全部属于上面五层中的中间三层Q其中表C层模式包含与Servlet和JSP技术相关的模式、业务层模式包含与EJB技术有关的模式、集成层模式包含与JMS和JDBC有关的模式。具体模式可参看下面表格Q?/p>
表一Q表C层模式
模式?/strong> | 单描q?/strong> |
截取qo?Intercepting Filter) | 促进h的预先处理和后处?/td> |
前端控制?Front Controller) | 提供h处理的集中控制器 |
视图助手(View Helper) | 把与表示层格式化无关的逻辑装到助手组?/td> |
复合视图(CompOSite View) | 从原子的子组件创Z个聚集视?/td> |
工作者服?Service To Worker) | 合ƈ分发者组件、前端控制器和视囑֊手模?/td> |
分发者视?Dispatcher View) | 合ƈ分发者组件、前端控制器和视囑֊手模式,把许多动作推q到视图处理 |
模式?/strong> | 单描q?/strong> |
业务委托(Business Delegate) | 把表C层和服务层分隔开Qƈ且提供服务的外观和代理接?/td> |
值对?Value object) | 通过减少|络对话Q以加速层之间的数据交?/td> |
会话外观(Session Facade) | 隐藏业务对象复性,集中?a target=_new>工作?/font>处理 |
复合实体(Composite Entity) | 通过把参数相关的对象分组q单个实体beanQ表C计粗_度实体bean的最好经?/td> |
值对象组装器(Value Object ASsembler) | 把来自多个数据源的值对象组装成一个复合值对?/td> |
值列表处理器(Value List Handler) | 理查询执行、结果缓册Ӏ以及结果处?/td> |
服务定位?Service Locator) | 装业务服务查找和创建的复杂性,定位业务服务工厂 |
模式?/strong> | 单描q?/strong> |
数据讉K对象(Data Access Object) | 抽象数据源,提供Ҏ据的透明讉K |
服务Ȁ发器(Service Activator) | 加速EJBlg的异步处?/td> |
׃J2EE模式众多Q篇q有限,q里只概要介l其中的一U应用模?- 集成层的数据讉K对象(DAO)模式Q有兴趣的读者可以参看下面参考文献中的资料?br>数据讉K对象模式
数据讉K对象模式
1、问?br> Ҏ数据源不同,数据讉K也不同。根据存储的cd(关系数据?/font>?a target=_new>面向对象数据库等)和供应商不同Q持久性存?比如数据?的访问差别也很大。当业务lg(如会话bean)或表C组?如助手组?需要访问某数据源时Q它们可以用合适的API来获得连接性,以及操作该数据源。但是在q些lg中包含连接性和数据讉K代码会引入这些组件及数据源实C间的紧密耦合。组件中q类代码依赖性应用E序从某U数据源q移到其它种cȝ数据源将变得非常ȝ和困难,当数据源变化Ӟlg也需要改变,以便于能够处理新cd的数据源?/p>
2、解x?br> 使用数据讉K对象(DAO)来抽象和装所有对数据源的讉K。DAO理着与数据源的连接以便于索和存储数据QDAO实现了用来操作数据源的访问机制。依赖于DAO的业务组件ؓ?a target=_new>客户?/font>使用DAO提供了更单的接口QDAO完全向客L隐藏了数据源实现l节。由于当低层数据源实现变化时QDAO向客L提供的接口不会变化,所以该模式允许DAO调整C同的存储模式Q而不会媄响其客户端或业务lg。重要的是,DAO充当lg和数据源之间的适配器?/p>
3、实现策?br> 通过调整抽象工厂(Abstract Factory)模式和工厂方?Factory MethodQ这二个创徏型模式的实现详情可参看GoF?lt;设计模式>一?模式QDAO模式可以辑ֈ很高的灵zd?
当低层存储不会随着实现变化而变化时Q可以用工厂方法模式来实现该策略,以生应用程序需要的大量DAOQ如下面cd1所C?
当低层存储随着实现的变化而变化时Q策略可以通过使用抽象工厂模式而实现。抽象工厂可以基于工厂方法实现而创建,q可使用工厂Ҏ实现Q该{略提供一个DAO的抽象工厂对象,其中该对象可以构造多U类型的具体的DAO工厂Q每个工厂支持一U不同类型的持久性存储实现。一旦你获取某特定实现的具体DAO工厂Q你可以使用它来生成该实C所支持和实现的DAOQ如下面cd2所C?
4、应?br> 当数据访问代码被直接嵌入到有其他不相兌责的某类中时Q就会修改变的十分困难。这时可以采用分L据访问代码的解决ҎQ将数据讉K代码抽取C个新cMQƈ且把该新c逻辑或者物理地Ud到离数据源比较近的位|,q样可以增强模块性和可重用性,如下面图3所C。具体作法可以用提炼类(Extract ClassQ一U重构手法,l节可参看Martin?lt;重构>一?Ҏ创徏一个新c,q将原来cM把数据访问代码移动到q个新的数据讉K对象(DAO)c,使用q个新的DAO对象从控制器cM讉K数据?br> CZQ持久性逻辑被嵌入到一个用新DAO对象理的持久性的某企业新DAO对象中,把持久性代码和该企业新DAO对象代码l合h会创q、紧密耦合的代码。当持久性代码是该企业新DAO对象的一部分Ӟ对该持久性存储的M改动都要求更改该新DAO对象的持久性代码。这U耦合对企业新DAO对象代码l护会带来负面的影响。下面图4用分L据访问对象方法对其进行重构改q后的结果?/p>
?5个J2EE模式中,每个模式都作用于设计模式和构架模式之间的某些斚w。每个模式不是孤立存在的Q需要其它模式的支持才能更加体现其含义和用处Qؓ了最大限度的用好模式Q还需要充分理解模式之间的关系?
参考文?
pȝ分析员教E?--- |晓沛等?
设计模式Q可复用面向对象软g的元?--- 李英军等?
重构-改善既有代码的设?--- 侯捷{译
J2EE核心模式 --- 牛志奇等?
UML_a(W二? --- 徐家译
Qcache usage="read-write"/Q? |
Qcache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /Q? |
Qcache name="net.sf.hibernate.cache.StandardQueryCache" maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true"/Q? Qcache name="net.sf.hibernate.cache.UpdateTimestampsCache" maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/Q? |
query.setCacheable(true);//ȀzL询缓? query.setCacheRegion("myCacheRegion");//指定要用的cacheRegionQ可? |
Qcache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /Q? |
from Cat c where c.name like ? |
select * from cat c where c.name like ? |
select * from cat c where c.name like ? , parameter:tiger% |
Qcache usage="read-write"/Q? |
Qcache name="com.xxx.pojo.Cat.children" maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /Q? |
void evict(Class persistentClass) Evict all entries from the second-level cache. void evict(Class persistentClass, Serializable id) Evict an entry from the second-level cache. void evictCollection(String roleName) Evict all entries from the second-level cache. void evictCollection(String roleName, Serializable id) Evict an entry from the second-level cache. void evictQueries() Evict any query result sets cached in the default query cache region. void evictQueries(String cacheRegion) Evict any query result sets cached in the named query cache region. |
|
|
|
![]() ? ![]() ? |
public RouteaseMappingProject() { addDescriptor(buildAccountDescriptor()); addDescriptor(buildPhoneDescriptor()); …? } |
public void applyLogin() { //配置数据库访问参?br /> DatabaseLogin login = new DatabaseLogin(); login.usePlatform(new oracle.toplink.oraclespecific.Oracle9Platform()); login.setDriverClassName("oracle.jdbc.driver.OracleDriver"); login.setConnectionString(ApplicationConfiguration.get(ConfigurationConstants.DB_CON_STR)); login.setUserName(ApplicationConfiguration.get(ConfigurationConstants.DB_USER)); login.setPassword(ApplicationConfiguration.get(ConfigurationConstants.DB_ENCRYPTED_PASSWORD)); // 讄数据库参?br /> login.setUsesNativeSequencing(true); login.setSequencePreallocationSize(1); login.setShouldBindAllParameters(false); login.setShouldCacheAllStatements(false); login.setUsesByteArrayBinding(true); login.setUsesStringBinding(false); if (login.shouldUseByteArrayBinding()) { // Can only be used with binding. login.setUsesStreamsForBinding(false); } login.setShouldForceFieldNamesToUpperCase(false); login.setShouldOptimizeDataConversion(true); login.setShouldTrimStrings(true); login.setUsesBatchWriting(false); if (login.shouldUseBatchWriting()) { // Can only be used with batch writing. login.setUsesJDBCBatchWriting(true); } login.setUsesExternalConnectionPooling(false); login.setUsesExternalTransactionController(false); setLogin(login); } |
public Descriptor buildAccountDescriptor() { Descriptor descriptor = new Descriptor(); descriptor.descriptorIsAggregate(); descriptor.setJavaClass(com.routease.db.vo.user.Account.class); descriptor.setAlias("Account"); // Mappings. //建立Account 对象的deposit属性与数据库表的DEPOSIT字段的对应关p?br /> DirectToFieldMapping depositMapping = new DirectToFieldMapping(); depositMapping.setAttributeName("deposit"); depositMapping.setFieldName("DEPOSIT"); descriptor.addMapping(depositMapping); ?br /> return descriptor; } |
package com.routease.action.totradeentity; import java.util.Collection; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.StringUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.routease.action.PagingAction; import com.routease.action.helper.UserHelper; import com.routease.db.dao.DataSource; import com.routease.db.dao.totradeentity.SearchingCriteria; import com.routease.db.dao.totradeentity.ToTradeEntityDAO; import com.routease.db.util.Constants; import com.routease.db.util.Page; public class SearchToTradeEntityAction extends PagingAction { public SearchToTradeEntityAction() { super(); } // executeWithDataSourceҎAction默认执行的方?br /> public ActionForward executeWithDataSource(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, DataSource ds) throws Exception { //首先接受用户提交的表单数?br /> String objective = (String) PropertyUtils.getSimpleProperty(actionForm, "objective"); String keyWords = (String) PropertyUtils.getSimpleProperty(actionForm, "keyWords"); String keyWordsRange = (String) PropertyUtils.getSimpleProperty(actionForm, "keyWordsRange"); if (StringUtils.isEmpty(keyWordsRange)) { keyWordsRange = SearchingCriteria.KEY_WORDS_RANGE_NAME; } String industryLevel1 = (String) PropertyUtils.getSimpleProperty(actionForm, "industryLevel1"); String industryLevel2 = (String) PropertyUtils.getSimpleProperty(actionForm, "industryLevel2"); String startingPrice = (String) PropertyUtils.getSimpleProperty(actionForm, "startingPrice"); String endingPrice = (String) PropertyUtils.getSimpleProperty(actionForm, "endingPrice"); String city = (String) PropertyUtils.getSimpleProperty(actionForm, "city"); String province = (String) PropertyUtils.getSimpleProperty(actionForm, "province"); String startNoStr = (String) PropertyUtils.getSimpleProperty(actionForm, "startNumber"); String lengthStr = (String) PropertyUtils.getSimpleProperty(actionForm, "length"); if (StringUtils.isEmpty(startNoStr)) { startNoStr = "1"; } //Ҏ用户提交的数据,创徏查询表达式对象SC int startNumber = Integer.parseInt(startNoStr); int length = UserHelper.getPagingLength(ds, request); ToTradeEntityDAO serviceDAO = new ToTradeEntityDAO(ds); SearchingCriteria sc = new SearchingCriteria(); sc.setCity(city); sc.setProvince(province); sc.setEndingPrice(endingPrice); sc.setIndustryLevel1(industryLevel1); sc.setIndustryLevel2(industryLevel2); sc.setKeyWords(keyWords); sc.setKeyWordsRange(keyWordsRange); sc.setObjective(objective); sc.setStartingPrice(startingPrice); if (Constants.IS_TEST) { System.out.println("start of page:" + startNumber); } //提交查询对象SC,q获得查询结果集Q将其结果集攑օRequest对象中,便于q回 Page result = serviceDAO.searchToTradeEntities(sc, startNumber, length); Collection industries = serviceDAO.findIndustryDistribution(sc); result.setSizePerPage(length); request.setAttribute(Constants.TO_TRADE_ENTITY, result); request.setAttribute("MY_INDUSTRIES",industries); request.setAttribute("MY_PAGE", result); //业务逻辑处理完毕之后Q返回成功页?br /> return actionMapping.findForward("SUCCESS_PAGE"); } } |