JPetStore项目分析——分析一个典型J2EE应用web层的实现

类别:Java 点击:0 评论:0 推荐:

关于JpetStore(http://www.jfox.cn/jpetstore/  http://www.ibatis.com/jpetstore/jpetstore.html)

JPetStore是Sun公司开发的,在大众化的宠物商店程序基础上完全重写的,最早的基于J2EE平台的宠物商店网络应用服务程序。与其它的PetStore最本质的不同是JPetStore使用了类似Microsoft网络宠物商店的设计,但是在骨子确是完全不一样的网络服务构架,可以说这种构架完全体现了Java程序在网络应用方面的优势,故在此以它为例,从Java的底层实现方面来分析 J2EE在Web层的应用。

系统架构概览

JPetStore以一个小型宠物商店电子商务平台为原型向大家展示了一个带有简单数据库连接的J2EE Web层的应用,它集成了Web层应用领域所必须具备的要素,如:用户ID认证、商品信息查询、商品信息列表等等。总之,JPetStore是一个集客户购物,下订单,管理为一体的简单且典型的电子商务的例子。

当然,现实中的系统不会如此简单,大多数的系统要和多个数据源和其他的EIS(企业信息系统)相连通的,有着比较复杂的数据库系统的设计与连接。比如说,订单的提交可能是一个公司,信用卡服务可能另外的公司,运送又是一个公司,这样的话,数据系统的设计就很复杂(一般来说这就需要专门的DBA进行数据库的设计)。然而作为窥探J2EE的一个窗口,了解J2EE的运作,JPetStore足以胜任。

JPetStore划分成了多个模块,采取了松耦合的设计架构,允许存在多个数据源及EIS进行信息交互。它的结构相对简单,总共包括4个部分:

·         购物站点

·         管理。如:销售统计,手工接受/拒绝订单

·         订单处理

通过JMS接受/处理订单消息

用java mail来通知客户

通过JMS发订单给供应商

并修改订单数据库的相应信息

·         供应商

通过JMS接受订单

派送货物给用户

提供一个基于web的库存管理

维护库存数据库

系统架构解析

宠物商店的网站服务采用自上而下的构架,其最上层是由WAF(Web Application Framework)控制应用屏幕的跳转,进而产生视图,然后再调用商业组件来实现流程的处理(整体结构如图1所示)。

                   图1  JPet Store 总体框架结构

WAF提供众多Web应用所需的服务,其中包括请求过滤和分发、产生模板视图、可重用的Taglib,以及屏幕流程控制等等。应用组件封装了处理的逻辑,它们代表了商业的数据,并且可以对这些商业数据进行必要的操作;实体EJB代表了商业应用的实体,包括客户、地址、账目等;会话EJB提供了一些方法,如用户登陆、输出用户信息、管理购物车等;其它会话EJB提供了一些通用的方法,如产生唯一标示符等。传统的JavaBean组件演变成了值对象,在EJB组件和应用间进行传递数据,成功地处理了各个对象的封装,有效地降低了程序设计的难度。而XML文档类则用来处理订单信息。

这个例子的WAF是对J2EE蓝图Web层规范的一个有效实现。一个通用的Web层处理一般可以划分为四个步骤(如图2所示):

◆     解释一个请求

  ◆ 执行一个商业逻辑处理

  ◆ 选择下一个视图

  ◆ 产生这个视图

 

                图2   WAF的Web层处理

 下面将分析宠物商店各个模块的设计 ,宠物商店主要的一些独立组成模块(如图3所示):

  ◆ 控制模块 用来分发请求到各个业务处理逻辑、控制屏幕跳转、处理对应的组件及用户

  ◆ 登录和注册 控制模块由WAF实现和扩展

  ◆ 购物车模块 购物车跟踪用户购物的过程

  ◆ 登录模块 确定用户登陆的页面

◆ 消息模块 从宠物商店到定单处理中心用来异步传输订单

 ◆ 类别模块 根据用户查询需求提供一个类别视图

 ◆ 客户模块 表示客户信息,如地址、信用卡、联系方式等

  图3   JPet Store 模块设计

在图3中,控制模块将控制所有的交互信息和执行信息,每个用户会话都有一个购物车与之相对应。

宠物商店的组件主要有以下几个部分:

  ◆  EJB       代表了商业数据和商业逻辑的处理

  ◆  JSP页面   定义了整个应用视图的框架模板(template.jsp),由模板组成的各个JSP页面文件,以及各种被引用的图形文件

  ◆  XML文件  用来定义屏幕、屏幕跳转控制、绑定URL到某个HTML Action、定制signOn以及J2EE的部署

  ◆ Servlet过滤器  用来校验用户安全登陆和输出的编码

  ◆ 异步信息发送组件  传输使用XML封装的订单到订单处理中心

◆ 安装程序  用来产生例子数据库。

JpetStore系统的实现

前面介绍的是JpetStore所涉及的J2EE Web构架方面的常识以及JpetStore系统构架的一些信息,接下来,让我们进一步来了解一下JpetStore系统的实现。

首先,来认识一下JpetStore实现代码整体文件框架(图4):

                图4   JpetStore代码的架构及实现功能

下面让我们对其中的一些实现的技术进行更深入的探讨。JPetStore 程序包括基于Spring规范的数据源,DAO层和交互式页面。你可以在XML文件内看到一序列的Bean,其标识如:<form-beans> </form-beans>或<bean>      </bean>, 例如struts-config.xml中:

  <form-beans>

     <form-bean name="accountBean"           type="com.ibatis.jpetstore.presentation.AccountBean"/>

    <form-bean name="catalogBean" type="com.ibatis.jpetstore.presentation.CatalogBean"/>

    <form-bean name="cartBean" type="com.ibatis.jpetstore.presentation.CartBean"/>

    <form-bean name="orderBean" type="com.ibatis.jpetstore.presentation.OrderBean"/>

  </form-beans>

下面是jPetStore的Spring层的三个结构文件及所实现的功能, 如图5所示:

Presentation Layer

界面交互

Business Layer

Domain Model 实现

Data Layer

      Dao 实现

web.xml

struts-config.xml

 

Dao.xml

                   图5    JPetStore Spring的结构

JpetStroeDomain 的结构(如图6):

                      

                   图6     JpetStrore业务类

其内部都是对一些涉及到的实体的属性进行定义,并实现数据封装。如:Account.java

 

public class Account implements Serializable {

 

  /* Private Fields */

 

  private String username;

  private String password;

        ……

   /* JavaBeans Properties */

  public String getUsername() {

    return username;

  }

  public void setUsername(String username) {

    this.username = username;

  }

}

JpetStroe Persistence是对Domain业务的操作的实现。包括接口(iface)和实现(sqlmapdao)。如AccountDao.java和AccountSqlMapDao.java

public interface AccountDao {

 

  public Account getAccount(String username);

   ……

}

 

 

 

public class AccountSqlMapDao extends BaseSqlMapDao implements AccountDao {

          ……

  public Account getAccount(String username) {

    return (Account) queryForObject("getAccountByUsername", username);

  }

          ……

}

 

JpetStroe Presentation定义了Formbean,例如AccountBean.java就为Account.java实现了Formbean。在进行构架分析之前,先来了解一下MVC构架(如图6):MVC(Model/View/Controller,MVC)构架允许一个开发者将一个可视化接口连接到一个面向对象的设计中,而同时还可以避免我们上面讨论的几个问题。MVC通过创建下面三个层将面向对象的设计与可视化接口分开: 

模型(Model):模型包含完成任务所需要的所有的行为和数据。模型一般由许多类组成并且使用面向对象的技术来创建满足五个设计目标的程序。 

界面(View):一个界面就是一个程序的可视化元素,如对话框、选单、工具条等。界面显示从模型中提供的数据,它并不控制数据或提供除显示外的其它行为。一个单一的程序或模型一般有两种界面行为。界面从模型内的对象中显示数据。这些对象的改变可以通过也可以不通过用户的交互操作来完成。如:在一个Web浏览器中负责接收页面的对象收集和装配栈中的信息,必须有某种方式来让这些对象通知界面数据已经被改变了。在模型变化时有两种方法来对界面进行更新。 

控制器(Controller):控制器将模型映射到界面中。控制器处理用户的输入,每个界面有一个控制器。它是一个集接收用户输入、创建或修改适当的模型对象并将修改在界面中体现出来的一种状态控制的集合体。控制器在需要时还负责创建其它的界面和控制器。控制器一直决定哪些界面和模型组件应该在某个给定的时刻是活动的,它一直负责接收和处理用户的输入,来自用户输入的任何变化都被从控制器送到模型。 

      图6     MVC的基础构架

通过以上的介绍,现在让我们来分析JpetStore是如何实现MVC,并进行流程处理的。首先是整个系统的配置,它是由一些xml文件来实现的。如:

    <form-beans>

       <form-bean name="accountBean" type="com.ibatis.jpetstore.presentation.AccountBean"/>

       <form-bean name="catalogBean" type="com.ibatis.jpetstore.presentation.CatalogBean"/>

       <form-bean name="cartBean" type="com.ibatis.jpetstore.presentation.CartBean"/>

       <form-bean name="orderBean" type="com.ibatis.jpetstore.presentation.OrderBean"/>

   </form-beans>

其次来看一看Controller层(在struts文件夹中),如:basebean.java

   public abstract class BaseBean extends ActionForm {

             ……

         public void reset(ActionMapping mapping, ServletRequest request) {

             stMap.put("errors",errorList);

             validate();

             errorList = (List) requestMap.get("errors");

             ActionErrors actionErrors = null;

             if (errorList != null && !errorList.isEmpty()) {

              actionErrors = new ActionErrors();

              actionErrors.add(ActionErrors.GLOBAL_ERROR,new

ActionError("global.error"));

              }

              return actionErrors;

          }

              ……

  }

 再来接触一下Formbean(在Presentation文件夹中),如AccountBean.java

  public class AccountBean extends BaseBean {

 

    /* Constants */

    private static final AccountService accountService = AccountService.getInstance();

       ……

  /* Private Fields */

   

     private Account account;

       ……

 

     /* Static Initializer */

 

  static {

    List langList = new ArrayList();

     ……

  }

 

  /* Constructors */

 

  public AccountBean() {

    account = new Account();

  }

 

  /* JavaBeans Properties */

 

  public String getUsername() {

    return account.getUsername();

  }

       ……

     public void validate() {//错误信息反馈

      ……

  }

}

JpetStore便是通过以上的基本技术来实现MVC的基础构架的。

 

小结

从Java应用于Internet开发的发展历程来看,可将其开发方法划分为三个阶段:第一阶段是将业务逻辑和表现逻辑完全集成在一起,采用HTML、JSP和Servlets技术开发;第二阶段是将业务逻辑和表现逻辑分开,采用HTML、JSP、Servlets、JavaBeans Compoments和Custom Tags技术开发;第三个阶段是MVC设计模式(J2EE的开发方法)。透过JpetStore这个比较简单项目,我们就已经能够充分体验到了J2EE开发方法所带来的便利性,难怪,在网络技术高速发展的今天,新技术层出不穷,可J2EE开发技术始终占据着主流的霸主地位。

 

 

(枯木   邮箱:[email protected]  QQ:99676527  Msn:[email protected])

本文地址:http://com.8s8s.com/it/it11891.htm