Java资源网

| JAVA基础 | 环境配置 | JDBC | 线程技术 | Socket编程 | JavaMail | JAVA与XML | 设计模式 | 技术新闻 | Java认证 | 程序人生 软件下载
| JSP&Servlet | Spring | Struts | Hibernate | JBuilder | Eclipse | WebService | EJB技术 | J2ME开发 | 应用服务器 | JXTA | Ajax
Articles search文章搜索
   关键字:
   类 别:
       
New download 最新下载
· [组件]HTML Parser 1.5
· [教程]WebSphere Studio应用教程
· [组件]JDom 1.0
· [工具]Junit3.8.1
· [教程]EJB编程及J2EE系统架构和设计
· [教程]EJB教程
· [教程]J2EE Tutorial中文版
· [教程]Java编程思想2(英文)
· [教程]java编程思想(完整版)
· [教程]Java网络编程
New articles 最新文章
· 设计移动 Web 服务
· 解析XML的时候完全忽略DTD
· 理解XML Schema XML Schema 初步
· 标签库的深入研究
· 提升JSP应用程序的七大绝招
· 如何使用JDOM对XML文件进行操作
· 处理XML字符串中特殊字符
· 利用Digester把XML转换成为Java对象
· 使用WebService 和RMI远程协作
· 使用Axis开发Web Service程序
Articles top 热门文章
· Eclipse基础--plugin插件安装(6644)
· eclipse+tomcat+lomboz的安装配置说明(4774)
· Java程序员就业前景(4584)
· Windows下JAVA环境变量的设置祥解(3788)
· Tomcat下JSP、Servlet和JavaBean环境的配置(3716)
· 使用links方式安装Eclipse插件(3698)
· 一个老程序员的心理话(3533)
· linux下jdk的安装与配置(3459)
· 初学者入门:Structs中基本配置入门(3334)
· Eclipse 运行命令行参数大全(3084)
您的位置:首页>>Spring>>Jpetstore阅读心得之分层结构
Jpetstore阅读心得之分层结构
2007-04-17   来源:Java资源网  作者:Java资源网

虽然对Spring不熟悉,又不懂iBatis,而且对模式的概念还没有弄清楚,但也硬着头皮去读Spring包自带的Jpetstore经典J2EE例子。

可以肯定,Jpetstore是按照MVC模式设计的。持久化层用iBatis(这个我不懂,我希望是用Hibernate),web层控制器的servlet有两个选择,一个是用Struts,另一个是SpringMVC

以下是自己的阅读体会,也许分析不当或描述不清,但也算初步尝试,所以记下来了。

一,分层结构

Jpetstore使用了门面模式、单例模式,DAO模式。

 

1.门面模式

门面接口的实现类: PetStoreImpl

public class PetStoreImpl implements PetStoreFacade, OrderService

{

    private AccountDao accountDao;

    private CategoryDao categoryDao;

    private ProductDao productDao;

    private ItemDao itemDao;

    private OrderDao orderDao;

 

    // ----------------------------------------------------------------

    // Setter methods for dependency injection

    // ----------------------------------------------------------------

 

    public void setAccountDao(AccountDao accountDao)

    {

        this.accountDao = accountDao;

    }

    //省略余下的四个setter

    // -------------------------------------------------------------------------

    // Operation methods, implementing the PetStoreFacade interface

    // -------------------------------------------------------------------------

 

    public Account getAccount(String username)

    {

        return this.accountDao.getAccount(username);

    }

    public Account getAccount(String username, String password)

    {

        return this.accountDao.getAccount(username, password);

    }

    public void insertAccount(Account account)

    {

        this.accountDao.insertAccount(account);

    }

    public void updateAccount(Account account)

    {

        this.accountDao.updateAccount(account);

    }

    //省略其它的crud方法

}

 

暂时先不管 OrderService 这个接口。

PetStoreImpl的那些setter方法正是spring的注入方法。

在配置文件中:

<bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">

    <property name="accountDao" ref="accountDao" />

    <property name="categoryDao" ref="categoryDao" />

    <property name="productDao" ref="productDao" />

    <property name="itemDao" ref="itemDao" />

    <property name="orderDao" ref="orderDao" />

</bean>

 

2. 单例模式

单例模式中,我们一般把类的构造方法设置为private,提供静态工厂方法给外界返回唯一的实例,但在这里,它不是这样做的,因为有了Spring。有了SpringBeanFactory管理,可以轻易配置实现单例。看看作者的注释。

 

There is one instance of this class in the JPetStore application. In Spring terminology, it is a "singleton". This means a per-Application Context singleton. The factory creates a single instance; there is no need for a private constructor, static factory method etc as in the traditional implementation of the Singleton Design Pattern.

 

单例的PetStoreImpl

Struts当控制器时,它这样做:为整个应用程序编写一个继承自ActionBaseAction基础类。

 

public abstract class BaseAction extends Action

{

    private PetStoreFacade petStore;

 

    public void setServlet(ActionServlet actionServlet)

    {

        super.setServlet(actionServlet);

        if (actionServlet != null)

        {

            ServletContext servletContext = actionServlet.getServletContext();

            WebApplicationContext wac = WebApplicationContextUtils

                .getRequiredWebApplicationContext(servletContext);

            this.petStore = (PetStoreFacade) wac.getBean("petStore");

        }

    }

 

    protected PetStoreFacade getPetStore()

    {

        return petStore;

    }

}

 

3.DAO模式

ORM工具用iBatis,在领域模式层使用了粗粒度对象。下面是AccountDao 的配置。

 

<select id="getAccountByUsername" resultMap="result">

    select

          signon.username as userid,

          account.email,

          account.firstname,

          account.lastname,

          account.status,

          account.addr1,

          account.addr2,

          account.city,

          account.state,

          account.zip,

          account.country,

          account.phone,

          profile.langpref,

          profile.favcategory,

          profile.mylistopt,

          profile.banneropt,

          bannerdata.bannername

    from account, profile, signon, bannerdata

    where account.userid = #value#

      and signon.username = account.userid

      and profile.userid = account.userid

      and profile.favcategory = bannerdata.favcategory

  </select>

  --相关文章--
· 用代码学习Spring:IoC、AOP (2007-04-17)
· 用Spring更好地处理Struts动作三种整合 (2007-04-17)
· 玩玩Spring之IOC (2007-04-17)
· 新手入门之Spring BeanDoc使用 (2007-04-17)
· 彻底理解spring的定制任务(scheduling) (2007-04-17)
· 对非String类型进行校验时的出错处理 (2007-04-17)

版权所有©2005-2006 JAVA资源网 渝ICP备05007591号 虚拟主机 | 关于我们 | 联系方式 | 广告业务 | 网站地图 | 友情链接