不同樊响
请访问主站:http://heyday.blogcn.com
[导入][AppFuse] AppFuse使用手记--DAO(七) [原]
AppFuse生成的Action的提供了几个基本的CRUD方法。先看一下这几个方法的实现。
Actioni通过Spring注入GenericManager,而GenericManager的实现GenericManagerImpl则调用GenericDao完成DAO操作。Appfuse默认为Hibernate进行DAO操作,GenericManagerImpl的实现类为GenericDaoHibernate,而GenericDaoHibernate里面还是调用的Spring的HibernateTemplate实现DAO操作。
UML图如下(点击显示大图):
通常AppFuse提供的几个操作是远远不够的,如果我们需要完成自定义的功能则需要自己实现相应的DAO操作。可以参考Appfuse的实现(参考
Using Hibernate
)。增加一个DAO类继承GenericDao,增加一个DAO实现类继承GenericDaoHibernate实现DAO类。
UML图如下(点击显示大图):
在applicationContext.xml里声明DAO。然后在Action通过注入DAO,完成相应的Action操作。
相关试例代码的主要部分如下:
CompanyDao
:
1
package
com.reda.app.dao;
2
3
import
com.reda.app.model.Company;
4
import
org.appfuse.dao.GenericDao;
5
6
import
java.util.List;
7
8
public
interface
CompanyDao
extends
GenericDao
<
Company, Long
>
{
9
public
List find(Company company);
10
}
11
CompanyDaoHibernate:
1
package
com.reda.app.dao.hibernate;
2
3
import
com.reda.app.model.Company;
4
import
com.reda.app.dao.CompanyDao;
5
import
org.appfuse.dao.hibernate.GenericDaoHibernate;
6
7
import
java.util.List;
8
9
public
class
CompanyDaoHibernate
extends
GenericDaoHibernate
<
Company, Long
>
implements
CompanyDao
{
10
11
public
CompanyDaoHibernate()
{
12
super
(Company.
class
);
13
}
14
15
public
List find(Company company)
{
16
return
super
.getHibernateTemplate().find(
"
from Company where companyType=?
"
, company.getCompanyType());
17
}
18
19
}
applicationContext.xml:
1
<!--
Add new DAOs here
-->
2
<
bean
id
="companyDao"
class
="com.reda.app.dao.hibernate.CompanyDaoHibernate"
>
3
<
property
name
="sessionFactory"
ref
="sessionFactory"
/>
4
</
bean
>
struts.xml:
1
<!--
CompanyAction-START
-->
2
<
action
name
="companies"
class
="com.reda.app.webapp.action.CompanyAction"
method
="list"
>
3
<
result
>
/WEB-INF/pages/companyList.jsp
</
result
>
4
</
action
>
5
6
<
action
name
="editCompany"
class
="com.reda.app.webapp.action.CompanyAction"
method
="edit"
>
7
<
result
>
/WEB-INF/pages/companyForm.jsp
</
result
>
8
<
result
name
="error"
>
/WEB-INF/pages/companyList.jsp
</
result
>
9
</
action
>
10
11
<
action
name
="saveCompany"
class
="com.reda.app.webapp.action.CompanyAction"
method
="save"
>
12
<
result
name
="input"
>
/WEB-INF/pages/companyForm.jsp
</
result
>
13
<
result
name
="cancel"
type
="redirect"
>
companies.html
</
result
>
14
<
result
name
="delete"
type
="redirect"
>
companies.html
</
result
>
15
<
result
name
="success"
type
="redirect"
>
companies.html
</
result
>
16
</
action
>
17
18
19
<
action
name
="searchCompany"
class
="com.reda.app.webapp.action.CompanyAction"
method
="search"
>
20
<
result
name
="input"
>
/WEB-INF/pages/companyList.jsp
</
result
>
21
<
result
>
/WEB-INF/pages/companyList.jsp
</
result
>
22
</
action
>
23
24
<!--
CompanyAction-END
-->
CompanyAction:
1
package
com.reda.app.webapp.action;
2
3
import
com.opensymphony.xwork2.Preparable;
4
import
com.reda.app.model.Company;
5
import
com.reda.app.model.CompanyType;
6
import
com.reda.app.dao.hibernate.CompanyDaoHibernate;
7
import
org.appfuse.service.GenericManager;
8
import
org.appfuse.webapp.action.BaseAction;
9
10
import
java.util.List;
11
12
public
class
CompanyAction
extends
BaseAction
implements
Preparable
{
13
private
GenericManager
<
Company, Long
>
companyManager;
14
private
GenericManager
<
CompanyType, Long
>
companyTypeManager;
15
private
List companies;
16
private
Company company;
17
private
Long companyId;
18
19
private
CompanyDaoHibernate companyDao;
20
21
public
void
setCompanyManager(GenericManager
<
Company, Long
>
companyManager)
{
22
this
.companyManager
=
companyManager;
23
}
24
25
public
void
setCompanyTypeManager(GenericManager
<
CompanyType, Long
>
companyTypeManager)
{
26
this
.companyTypeManager
=
companyTypeManager;
27
}
28
29
public
List getCompanies()
{
30
return
companies;
31
}
32
33
public
void
setCompanyDao(CompanyDaoHibernate companyDao)
{
34
this
.companyDao
=
companyDao;
35
}
36
37
public
String search()
{
38
companies
=
companyDao.find(company);
39
return
SUCCESS;
40
}
41
42
public
List getCompanyTypeList()
{
43
return
companyTypeManager.getAll();
44
}
45
46
/** */
/**
47
* Grab the entity from the database before populating with request parameters
48
*/
49
public
void
prepare()
{
50
if
(getRequest().getMethod().equalsIgnoreCase(
"
post
"
))
{
51
//
prevent failures on new
52
String companyId
=
getRequest().getParameter(
"
company.companyId
"
);
53
//
if (companyId != null && !companyId.equals("")) {
54
//
company = companyManager.get(new Long(companyId));
55
//
}
56
}
57
}
58
59
public
String list()
{
60
companies
=
companyManager.getAll();
61
return
SUCCESS;
62
}
63
64
public
void
setCompanyId(Long companyId)
{
65
this
.companyId
=
companyId;
66
}
67
68
public
Company getCompany()
{
69
return
company;
70
}
71
72
public
void
setCompany(Company company)
{
73
this
.company
=
company;
74
}
75
76
public
String delete()
{
77
companyManager.remove(company.getCompanyId());
78
saveMessage(getText(
"
company.deleted
"
));
79
80
return
SUCCESS;
81
}
82
83
public
String edit()
{
84
if
(companyId
!=
null
)
{
85
company
=
companyManager.get(companyId);
86
}
else
{
87
company
=
new
Company();
88
}
89
90
return
SUCCESS;
91
}
92
93
public
String save()
throws
Exception
{
94
if
(cancel
!=
null
)
{
95
return
"
cancel
"
;
96
}
97
98
if
(delete
!=
null
)
{
99
return
delete();
100
}
101
102
boolean
isNew
=
(company.getCompanyId()
==
null
);
103
104
companyManager.save(company);
105
106
String key
=
(isNew)
?
"
company.added
"
:
"
company.updated
"
;
107
saveMessage(getText(key));
108
109
if
(
!
isNew)
{
110
return
INPUT;
111
}
else
{
112
return
SUCCESS;
113
}
114
}
115
}
companyList.jsp
1
<%
@ include file
=
"
/common/taglibs.jsp
"
%>
2
3
<
head
>
4
<
title
><
fmt:message
key
="companyList.title"
/></
title
>
5
<
meta
name
="heading"
content
="<fmt:message key='companyList.heading'/>"
/>
6
<
meta
name
="menu"
content
="CompanyMenu"
/>
7
</
head
>
8
9
<
s:form
id
="companyForm"
action
="searchCompany"
method
="post"
validate
="true"
>
10
11
<
li
>
12
<
s:checkbox
key
="company.status"
cssClass
="checkbox"
theme
="simple"
/>
13
<
s:label
for
="companyForm_company_status"
value
="%{getText('company.status')}"
cssClass
="choice desc"
theme
="simple"
/>
14
<
s:label
for
="companyForm_company_companyType"
value
="%{getText('company.companyType.typeName')}"
cssClass
="desc"
/>
15
<
s:select
name
="company.companyType.typeId"
list
="companyTypeList"
listKey
="typeId"
listValue
="typeName"
></
s:select
>
16
<
s:textfield
key
="company.companyName"
required
="true"
maxlength
="200"
cssClass
="text medium"
/>
17
</
li
>
18
<
li
class
="buttonBar bottom"
>
19
<
s:submit
cssClass
="button"
method
="search"
key
="button.search"
theme
="simple"
/>
20
</
li
>
21
</
s:form
>
22
23
24
<
c:set
var
="buttons"
>
25
<
input
type
="button"
style
="margin-right: 5px"
class
="button"
26
onclick
="location.href='<c:url value="
/editCompany.html"
/>
'"
27
value="
<
fmt:message
key
="button.add"
/>
"/>
28
29
<
input
type
="button"
class
="button"
onclick
="location.href='<c:url value="
/mainMenu.html"
/>
'"
30
value="
<
fmt:message
key
="button.done"
/>
"/>
31
</
c:set
>
32
33
<
c:out
value
="${buttons}"
escapeXml
="false"
/>
34
35
36
<
display:table
name
="companies"
class
="table"
requestURI
=""
id
="companyList"
export
="true"
pagesize
="25"
>
37
<
display:column
property
="companyId"
sortable
="true"
href
="editCompany.html"
media
="html"
38
paramId
="companyId"
paramProperty
="companyId"
titleKey
="company.companyId"
/>
39
<
display:column
property
="companyId"
media
="csv excel xml pdf"
titleKey
="company.companyId"
/>
40
<
display:column
sortProperty
="status"
sortable
="true"
titleKey
="company.status"
>
41
<
input
type
="checkbox"
disabled
="disabled"
<c:if test
="${companyList.status}"
>
checked="checked"
</
c:if
>
/>
42
</
display:column
>
43
44
<
display:column
property
="companyType.typeName"
sortable
="true"
titleKey
="companyType.typeName"
/>
45
<
display:column
property
="companyName"
sortable
="true"
titleKey
="company.companyName"
/>
46
47
<
display:setProperty
name
="paging.banner.item_name"
><
fmt:message
key
="companyList.company"
/></
display:setProperty
>
48
<
display:setProperty
name
="paging.banner.items_name"
><
fmt:message
49
key
="companyList.companies"
/></
display:setProperty
>
50
51
<
display:setProperty
name
="export.excel.filename"
><
fmt:message
key
="companyList.title"
/>
.xls
</
display:setProperty
>
52
<
display:setProperty
name
="export.csv.filename"
><
fmt:message
key
="companyList.title"
/>
.csv
</
display:setProperty
>
53
<
display:setProperty
name
="export.pdf.filename"
><
fmt:message
key
="companyList.title"
/>
.pdf
</
display:setProperty
>
54
</
display:table
>
55
56
<
c:out
value
="${buttons}"
escapeXml
="false"
/>
57
58
<
script
type
="text/javascript"
>
59
highlightTableRows(
"
companyList
"
);
60
</
script
>
61
文章来源:
http://heyday.blogcn.com/diary,15384409.shtml
posted on 2008-05-04 20:57
不同樊响
阅读(675)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2008年5月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 23
文章 - 0
评论 - 1
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔档案
(23)
2008年5月 (10)
2005年12月 (2)
2005年11月 (1)
2005年10月 (1)
2005年9月 (1)
2005年8月 (1)
2005年7月 (1)
2005年6月 (5)
2005年4月 (1)
搜索
最新评论
1. re: [导入][AppFuse] AppFuse使用手记--试例(二) [原]
最近研究appfuse,出了点问题,看到你的博客,很有帮助,谢谢~
--tony chan
阅读排行榜
1. [导入][AppFuse] AppFuse使用手记--Display Tag 分页(九) [原](1153)
2. [导入][AppFuse] AppFuse使用手记--试例(二) [原](865)
3. [导入][AppFuse] AppFuse使用手记--一对多(六) [原](718)
4. [导入][AppFuse] AppFuse使用手记--目录结构(三) [原](708)
5. [导入][AppFuse] AppFuse使用手记--DWR(十) [原](694)
评论排行榜
1. [导入][AppFuse] AppFuse使用手记--试例(二) [原](1)
2. [导入][AppFuse] AppFuse使用手记--目录结构(三) [原](0)
3. [导入][AppFuse] AppFuse使用手记--数据库中文问题(四) [原](0)
4. [导入][AppFuse] AppFuse使用手记--资源文件中文问题(五) [原](0)
5. [导入][AppFuse] AppFuse使用手记--一对多(六) [原](0)