关于作者

笔名:neitbe
地区: 陕西-西安
作者相册

日历 

快速登录

+ 用户名:
+ 密 码:

在线留言

友情Blog

我的资源

访问统计:8063


言舞叁金的日记

 

网名: 言舞叁金
E-mial:neitbe@126.com

日志

搬家了

这里好像比较慢,最主要觉得UU的功能比较好,呵呵,决定搬家

新的Blog地址为:http://neitbe.uublog.com

- 作者: neitbe 2005年09月23日, 星期五 09:51  回复(1) |  引用(12)

今天来不及看明白了,先记下来再说
摘要:网页上的下拉输入框 查看全文

- 作者: neitbe 2005年09月12日, 星期一 16:51  回复(0) |  引用(0)

hibatanate+spring1.5
域模块层(The Domain Model Layer )
既然我们致力于的是一个不是很复杂的Web的应用, 我们需要一个对象集合,让它在不同层之间移动的。 域模块层由实际需求中的业务对象组成 比如, OrderLineItem , Product等等。 开发者在这层 不用管那些DTOs,仅关注domain object即可。 例如,Hibernate允许你将数据库中的信息存放入对象(domain objects),这样你可以在连接断开的情况下把这些数据显示到UI层。 而那些对象也可以返回给持续层,从而在数据库里更新。 而且,你不必把对象转化成DTOs(这可能似的它在不同层之间的在传输过程中丢失),这个模型使得Java开发者能很自然运用OO,而不需要附加的编码。

一个简单例子

既然我们已经从全局上理解这些组件。 现在就让我们开始实践吧。 我们还是用 StrutsSpring Hibernate。这三个框架已经被描述够多了,这里就不重复介绍了。 这篇文章举例指导你如何使用这三个框架整合开发, 并向你揭示 一个请求是如何贯穿于各个层的。(从用户的加入一个Order到数据库,显示;进而更新、删除)。
从这里可以下载到程序程序原代码(download

既然每个层是互相作用的,我们就先来创建domain objects。首先,我们要在这些Object中要确定那些是需要持久化的,哪些是提供给business logic,那些是显示接口的设计。 下一步,我们将配置我们的持久层并且定义好HibernateOR mappings。然后定义好Business Objects。有了这些组成部分之后,我们将 使用Spring把这些连接起来。 最后,我们提供给Spring一个持久层,从这个持久层里我们可以知道它是如何与业务逻辑层(business service layer)通信的,以及它是怎样处理其他层抛出的异常的。。

域对象层(Domain Object Layer


这层是编码的着手点,我们的编码就从这层开始。 例子中Order OrderItem 是一个One?To?Many的关系。 下面就是Domain Object Layer的两个对象:



? com.meagle.bo.Order.java:
包含了一个Order的概要信息

? com.meagle.bo.OrderLineItem.java:
包含了Order的详细信息

好好考虑怎你的package命名,这反应出了你是怎样分层的。 例如 domain objects在程序中可能打包在com.meagle.bo内。 更详细一点将打包在com. meagle.bo的子目录下面。business logic应该从com.meagle.serice开始打包,而DAO 对象应该位于com.meagle.service.dao.hibernate。反应FormsActions 持久对象(presentation classes 应该分别放在 com.meagle.actioncom.meagle.forms包。 准确的给包命名使得你的classes很好分割并且易于维护,并且在你添加新的classes时,能使得程序结构上保持上下一致。

持久层的配置(Persistence Layer Configuration

建立Hibernate的持久层 需要好几个步骤。 第一步让我们把BO持久化。 既然Hibernate是通过POJO工作的, 因此Order OrderLineItem对象需要给所有的fileds 加上getter,setter方法。 Hibernate通过XML文件来映射(OR)对象,以下两个xml文件分别映射了Order OrderItem对象。(这里有个叫XDoclet工具可以自动生成你的XML影射文件)

- Order.hbm.xml
- OrderLineItem.hbm.xml

你可以在WebContent/WEB-INF/classes/com/meagle/bo目录下找到这些xml文件。Hibernate [urlhttp://www.hibernate.org/hib_docs/api/net/sf/hibernate/SessionFactory.html]SessionFactory [/url]是用来告诉程序 应该与哪个数据库通信,该使用哪个连接池或使用了DataSource 应该加载哪些持久对象。而Session接口是用来完成SelectingSavingDeleteUpdating这些操作。 后面的我们将讲述SessionFactorySession是怎样设置的。

业务层的配置(Business Layer Configuration

既然我们已经有了domain objects,接下来我们就要business service objects了,用他们来执行程序的logic,调用持久层,得到UI层的requests,处理transactions,并且控制exceptions 为了将这些连接起来并且易于管理,我们将使用面向方面的 SpringFramework Spring 提供了 控制倒置(inversion of control 0==IoC)和注射依赖设置(setter dependency injection)这些方式(可供选择),用XML文件将对象连接起来。 IoC是一个简单概念(它允许一个对象在上层接受其他对象的创建),用IoC这种方式让你的对象从创建中释放了出来,降低了偶合度。

这里是一个没有使用IoC的对象创建的例子,它有很高偶合度。

2.没有使用 IoC. A 创建了 B C

而这里是一个使用IoC的例子,这种方式允许对象在高层可以创建并进入另外一个对象,所以这样可以直接被执行。


3. 对象使用了 IoC A 包含了接受B,C setter方法 , 这同样达到了 A创建B,C的目的。

建立我们的业务服务对象(Building Our Business Service Objects


Business Object
中的Setter方法接受的是接口,这样我们可以很松散的定义对象实现,然后注入。 在我们的案例中,我们将用一个business service object接收一个DAO,用它来控制domain objects的持久化。 由于在这个例子中使用了Hibernate,我们可以很方便的用其他持久框架实现 同时通知Spring 有新的DAO可以使用了。

在面向接口的编程中,你会明白 "注射依赖"模式是怎样松散耦合你的业务逻辑和持久机制的:)。

下面是一个接口business service objectDAO代码片段:

代码:


public interface IOrderService {

  public abstract Order saveNewOrder(Order order)

    throws OrderException,

           OrderMinimumAmountException;

 

  public abstract List findOrderByUser(

                                     String user)

                           throws OrderException;

 

  public abstract Order findOrderById(int id)

                           throws OrderException;

 

  public abstract void setOrderDAO(

                             IOrderDAO orderDAO);


注意到这段代码里有一个 setOrderDao(),它就是一个DAO Object设置方法(注射器)。 但这里并没有一个getOrderDao的方法,这不必要,因为你并不会在外部访问这个orderDao。这个DAO Objecte将被调用,和我们的persistence layer 通信。我们将用SpringDAO Object business service object搭配起来的。因为我们是面向接口编程的,所以并不需要将实现类紧密的耦合在一起。

- 作者: neitbe 2005年04月23日, 星期六 01:07  回复(0) |  引用(0)

spring+hibatenate1

其实,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情。 在构架的一开始就有很多事情要考虑。 从高处看,摆在开发者面前有很多问题:要考虑是怎样建立用户接口?在哪里处理业务逻辑? 怎样持久化的数据。 而这三层构架中,每一层都有他们要仔细考虑的。 各个层该使用什么技术? 怎样的设计能松散耦合还能灵活改变? 怎样替换某个层而不影响整体构架?应用程序如何做各种级别的业务处理(比如事务处理)?

     
构架一个Web应用需要弄明白好多问题。 幸运的是,已经有不少开发者已经遇到过这类问题,并且建立了处理这类问题的框架。 一个好框架具备以下几点: 减轻开发者处理复杂的问题的负担("不重复发明轮子"); 内部有良好的扩展; 并且有一个支持它的强大的用户团体。 好的构架一般有针对性的处理某一类问题,并且能将它做好(Do One Thing well)。 然而,你的程序中有几个层可能需要使用特定的框架,已经完成的UI(用户接口) 并不代表你也可以把你的业务逻辑和持久逻辑偶合到你的UI部分。 举个例子, 你不该在一个Controller(控制器)里面写JDBC代码作为你的业务逻辑, 这不是控制器应该提供的。 一个UI 控制器应该委派给其它给在UI范围之外的轻量级组件。 好的框架应该能指导代码如何分布。 更重要的是,框架能把开发者从编码中解放出来,使他们能专心于应用程序的逻辑(这对客户来说很重要)。

     
这篇文章将讨论怎样结合几种著名的框架来使得你的应用程序做到松弛耦合。
如何建立你的架构,并且怎样让你的各个应用层保持一致。?如何整合框架以便让每个层在以一种松散偶合的方式彼此作用而不用管低层的技术细节?这对我们来说真是一种挑战。 这里讨论一个整合框架的策略( 使用3 种受欢迎的开源框架) :表示层我们用Struts 业务层我们用Spring;而持久层则用Hibernate 你也可以用其他FrameWork替换只要能得到同样的效果。 见图1 (框架组合示意图)

应用程序的分层

大部分的Web应用在职责上至少能被分成4层。 这四层是:presentation(描述),persistence(持久),business(业务)和domain model(域模块)。每个层在处理程序上都应该有一项明确的责任, 而不应该在功能上与其它层混合,并且每个层要与其它层分开的,但要给他们之间放一个通信接口。 我们就从介绍各个层开始,讨论一下这些层应该提供什么,不应该提供什么。



表示层(The Presentation Layer)

一般来讲,一个典型的Web应用的的末端应该是表示层。 很多Java发者也理解Struts所提供的。 象业务逻辑之类的被打包到org.apache.struts.Action. 因此,我们很赞成使用Struts这样的框架。



下面是Struts所负责的:

*
管理用户的请求,做出相应的响应。

*
提供一个Controller ,委派调用业务逻辑和其它上层处理。

*
处理异常,抛给Struts Action

*
为显示提供一个模型

* UI
验证。



以下条款,不该在Struts显示层的编码中经常出现。 它们与显示层无关的。

*
直接的与数据库通信,例如JDBC调用。

*
与你应用程序相关联的业务逻辑以及校验。

*
事物管理。

在表示层引入这些代码,则会带来高偶合和麻烦的维护。





持久层(The Persistence Layer)

典型的Web应用的另一个末端是持久层。这里通常是程序最容易失控的地方。开发者总是低估构建他们自己的持久框架的挑战性。系统内部的持续层不但需要大量调试时间,而且还经常缺少功能使之变得难以控制,这是持久层的通病。 还好有几个ORM开源框架很好的解决了这类问题。尤其是Hibernate Hibernatejava提供了OR持久化机制和查询服务, 它还给已经熟悉SQLJDBC API Java开发者一个学习桥梁,他们学习起来很方便。 Hibernate的持久对象是基于POJOJava collections。此外,使用Hibernate并不妨碍你正在使用的IDE