`
高成锋
  • 浏览: 51262 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

三层架构,MVC浅谈【三】

阅读更多

1. SSH三层架构

为了实现web层(struts)和持久层(Hibernate)之间的松散耦合,我们采用业务代表(Business Delegate)和DAOData Access Object)两种模式。DAO模式为了减少业务逻辑和数据访问逻辑之间的耦合,当一个持久框架被应用时,该模式将会减少业务对象和该框架之间的耦合,这样我们可以不修改业务对象而选择不同的持久层框架的实现。实际上在DAO模式中包含两种结构模式:桥(Bridge)模式和适配器(Adaptor)模式。

对表现层,我们使用 Struts ;业务层使用 Spring ;对于持久层我们使用的是 Hibernate 。你尽可以取代这里的某个框架而使用你喜欢的框架已达到同样的效果。下图显示了框架被整合起来时,从最高层次看到的视图。

应用层

许多设计良好的web应用,可以被按职责分为四层。这些层次是表现层、持久层、业务层、和领域模型层。每一个层次都有其独特的职责,不能把各自的功能与其它层次相混合。每一个应用层都应该和其它层隔离开来,但允许使用接口在层间进行通信。我们开始来看看每个层,并讨论一下它们各自都应该提供什么和不应该提供什么。

表现层

    一个典型的web 应用的末端是表现层。许多Java 开发者都知道Struts提供了什么东西。然而,太多时候,耦合代码比如业务逻辑被放进org.apache.struts.Action中。所以,我们先总结一下Struts之类的框架应该提供什么。下面就是Struts 的职责所在:

管理用户的请求和响应 提供一个控制起来将调用委托到业务逻辑和其他上游处理 将来自于抛出例外的其他层的例外处理到Struts Action 中 组装可以在视图中表现的模型对象 执行UI 校验 下面是一些经常可以使用Struts进行编码但是不应该和表现层关联的事情:

直接和数据库交互,比如JDBC 调用 与应用相关的业务逻辑和校验 事务管理 在表现层中引入这些类型的代码将导致类型耦合和维护负担。

持久层

    一个典型Web应用的另一端是持久层。这也是应用中最容易很快失控的地方。开发者通常低估了自己构建自己的持久层框架的挑战。一个定制的,内部开发的持久层不仅需要大量的开发时间,并且通常缺乏功能和难以管理。目前有许多解决这些问题的开源对象关系映射 (ORM) 框架。特别地,Hibernate 框架就允许Java中的对象-关系的持久性和查询服务。Hibernate 对已经熟悉了SQL JDBC APIJava开发者来或具有中度的学习曲线。Hibernate 的持久对象基于POJOJava群集(collections)。此外,使用Hibernate 不和你的IDE接口。下面列出了你需要在持久性框架中编写的代码类型:

查询关系信息到对象中。Hibernate是通过称为HQLOO查询语言,或者使用更有表现能力的规则API,来完成这个工作的。除了使用对象而不是表,使用字段而不是列的方式,HQL非常类似于 SQL。也有一些新的特定的HQL 语言特征需要学习;但是,它们是很容易理解和良好编写的。HQL是一种用于查询对象的自然语言,而对象,只需要很少的学习曲线吧。存储、更新和删除存储在数据库中的信息 高级的对象关系映射框架比如Hibernate支持大部分主流SQL数据库,它们支持父/子关系,事务,继承和多态。 下面是应该在持久层避免的一些事情:

业务逻辑应该置于应用的更高层中。这里只允许数据访问方法。 不应该使持久逻辑和表现逻辑耦合。避免表现组件如JSP或者基于servlet的类中的逻辑直接和数据访问进行通信。通过将持久性逻辑隔离在其自己的层中,应用将具有更加灵活的修改性而不影响到其他层的代码。例如, Hibernate可以使用其他持久框架和API代替,而不需要修改其它层中的代码。 业务层应该负责下面的问题:

处理应用的业务逻辑和业务校验 管理事务 允许与其他层进行交互的接口 管理业务级对象之间的依赖性 加入了表现和持久层之间的灵活性,以便它们不需要彼此进行直接通信 从表现层暴露上下文给业务层以获得业务服务 管理从业务层到表现层的实现

2. struts如何实现MVC

struts是java web目前最常用的实现框架。他采用mvc结构,将页面展现,流程控制和业务处理强有力的分开,结构清晰,思路明确,是进行java web的最好选择。
java web组件间的关系基本有三类:

页面跳转(javax.servlet.RequestDispatcher.forward()方法)

页面重定向(javax.servlet.response.sendRedirect()方法)

页面包含(javax.servlet.RequestDispatcher.include()方法).

其中,页面跳转只是在同一个web应用中进行的,传递的是request和response对象;重定向和包含则可以是不同的url内容。
      java web组件间的数据共享有四类:page,request,session和application,共享范围有单个页面到整个web应用,依次变大。
     struts的页面展示用jsp技术实现,按严格的mvc讲,jsp只是负责显示,不负责流程控制和数据处理;流程控制用action实现,在action的execute()里面通过return actionMapping.findForward()进行跳转,具体的业务处理是有各种java bean或者ejb来实现的。actionForm也是struts里面的一部分,目的是存储jsp页面提交的内容,供对应的action使用。

struts1.2 的工作流程

Web应用启动时加载并初始化ActionServletActionServletstruts-config.xml中读取配置信息,把它们存放到各种配置对象中。当ActionServlet接收到一个请求时,流程如下:

1.检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效的信 息。

2.如果ActionForm实例不存在,就创建一个ActionForm对象,把提交的表单数据保存到 ActionForm中。

3.根据配置,决定是否需表单验证,若需要,则调用ActionFormvalidate方法。

4.如果ActionFormvalidate方法返回null或返回不包含ActionMessageActionErrors 对象,则表示验证成功。

5.ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action 如果Action不存在则先创建这个实例,然后调用Actionexecute方法。

6.Actionexecute方法返回一个ActionForward对象,ActionServlet再把请求转发给 ActionForward对象指向的JSP组件。

7.ActionForward指向的JSP组件生成动态网页,返回给用户。


Struts2的工作流程

1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是 否需要调用某个Action

4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给 ActionProxy

5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action

6 ActionProxy创建一个ActionInvocation的实例。

7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦 截器(Intercepter)的调用。

8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返 回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

在上述过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。

3. Spring MVC的实现原理

<!--EndFragment-->
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics