虽然对
Spring
不熟悉,又不懂
iBatis
,而且对模式的概念还没有弄清楚,但也硬着头皮去读
Spring
包自带的
Jpetstore
经典
J2EE
例子。
可以肯定,
Jpetstore
是按照
MVC
模式设计的。持久化层用
iBatis
(这个我不懂,我希望是用
Hibernate
),
web
层控制器的
servlet
有两个选择,一个是用
Struts
,另一个是
Spring
的
MVC
。
以下是自己的阅读体会,也许分析不当或描述不清,但也算初步尝试,所以记下来了。
一,分层结构
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
。有了
Spring
的
BeanFactory
管理,可以轻易配置实现单例。看看作者的注释。
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
当控制器时,它这样做:为整个应用程序编写一个继承自
Action
的
BaseAction
基础类。
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
>
posted on 2006-11-02 09:41
xzc 阅读(305)
评论(0) 编辑 收藏 所属分类:
Design