常见SSH的架构设计策略一.docx
- 文档编号:10641319
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:22
- 大小:20.63KB
常见SSH的架构设计策略一.docx
《常见SSH的架构设计策略一.docx》由会员分享,可在线阅读,更多相关《常见SSH的架构设计策略一.docx(22页珍藏版)》请在冰豆网上搜索。
常见SSH的架构设计策略一
常见SSH的架构设计策略
(一)
(转载自)轻量级J2EE企业应用实战——Struts+Spring+Hibernate整合开发 李刚
常见的架构设计策略
目前流行的轻量级J2EE应用的架构比较一致,采用的技术也比较一致,通常使用Spring作为核心,向上整合MVC框架,向下整合ORM框架。
使用Spring的IOC容器来管理各组件之间的依赖关系时,Spring的声明事务将负责业务逻辑层对象方法的事务管理。
但在固定的技术组合上,依然可能存在小的变化。
下面依次讨论可能存在的架构策略。
8.4.1 贫血模式
贫血模式是最常用的设计架构,也是最容易理解的架构。
为了让读者通过本书顺利进入轻量级J2EE企业应用开发,本书的第9章及第10章的范例都将采用这种简单的架构模式。
所谓贫血,指DomainObject只是单纯的数据类,不包含业务逻辑方法,即每个DomainObject类只包含基本的setter和getter方法。
所有的业务逻辑都由业务逻辑组件实现,这种DomainObject就是所谓的贫血的DomainObject,采用这种DomainObject的架构即所谓的贫血模式。
下面以第9章的消息发布系统的部分代码为例,介绍贫血模式。
在贫血模式里,所有的DomainObject只是单纯的数据类,只包含每个属性的setter和getter方法,如下是两个持久化类。
第一个DomainObject是消息,其代码如下:
java代码
1.public class News extends BaseObject implements Serializable
2.
3.{
4.
5. //主键
6.
7. private Long id;
8.
9. //消息标题
10.
11. private String title;
12.
13. //消息内容
14.
15. private String content;
16.
17. //消息的发布时间
18.
19. private Date postDate;
20.
21. //消息的最后修改时间
22.
23. private Date lastModifyDate;
24.
25. //消息所属分类
26.
27. private Category category;
28.
29. //消息对应的消息回复
30.
31. private Set newsReviews;
32.
33. //无参数的构造器
34.
35. public News() {
36.
37. }
38.
39. //消息回复对应的getter方法
40.
41. public Set getNewsReviews() {
42.
43. return newsReviews;
44.
45. }
46.
47. //消息回复对应的setter方法
48.
49. public void setNewsReviews(Set newsReviews) {
50.
51. this.newsReviews = newsReviews;
52.
53. }
54.
55. //消息分类对应的getter方法
56.
57. public Category getCategory() {
58.
59. return category;
60.
61. }
62.
63. //消息分类对应的setter方法
64.
65. public void setCategory(Category category) {
66.
67. this.category = category;
68.
69. }
70.
71. //消息最后修改时间的getter方法
72.
73. public Date getLastModifyDate() {
74.
75. return lastModifyDate;
76.
77. }
78.
79. //消息最后修改时间的setter方法
80.
81. public void setLastModifyDate(Date lastModifyDate) {
82.
83. this.lastModifyDate = lastModifyDate;
84.
85. }
86.
87. //消息发布时间的getter方法
88.
89. public Date getPostDate() {
90.
91. return postDate;
92.
93. }
94.
95. //消息发布时间的setter方法
96.
97. public void setPostDate(Date postDate) {
98.
99. this.postDate = postDate;
100.
101. }
102.
103. //消息内容对应的getter方法
104.
105. public String getContent() {
106.
107. return content;
108.
109. }
110.
111. //消息发布者对应的setter方法
112.
113. public void setContent(String content) {
114.
115. this.content = content;
116.
117. }
118.
119. //消息主键对应的getter方法
120.
121. public Long getId() {
122.
123. return id;
124.
125. }
126.
127. //消息主键对应的setter方法
128.
129. public void setId(Long id) {
130.
131. this.id = id;
132.
133. }
134.
135. //消息标题对应的getter方法
136.
137. public String getTitle() {
138.
139. return title;
140.
141. }
142.
143. //消息标题对应的setter方法
144.
145. public void setTitle(String title) {
146.
147. this.title = title;
148.
149. }
150.
151. //Domain Object重写equals方法
152.
153. public boolean equals(Object object) {
154.
155. if (!
(object instanceof News)) {
156.
157. return false;
158.
159. }
160.
161. News rhs = (News) object;
162.
163. return this.poster.equals(rhs.getPoster())
164.
165. && this.postDate.equals(rhs.getPostDate());
166.
167. }
168.
169. //Domain Object重写的hashCode方法
170.
171. public int hashCode() {
172.
173. return this.poster.hashCode() + this.postDate.hashCode();
174.
175. }
176.
177. //Domain Object重写toString方法
178.
179. public String toString() {
180.
181. return new ToStringBuilder(this).append("id", this.id).append("title",
182.
183. this.title).append("postDate", this.postDate).append("content",
184.
185. this.content).append("lastModifyDate", this.lastModifyDate)
186.
187. .append("poster", this.poster)
188.
189. .append("category", this.category).append("newsReviews",
190.
191. this.newsReviews).toString();
192.
193. }
194.
195.}
196.
第二个DomainObject是消息对应的回复,其代码如下:
java代码
1.public class NewsReview extends BaseObject
2.
3.{
4.
5. //消息回复的主键
6.
7. private Long id;
8.
9. //消息回复的内容
10.
11. private String content;
12.
13. //消息回复的回复时间
14.
15. private Date postDate;
16.
17. //回复的最后修改时间
18.
19. private Date lastModifyDate;
20.
21. //回复的对应的消息
22.
23. private News news;
24.
25. //消息回复的构造器
26.
27. public NewsReview() {
28.
29. }
30.
31. //回复内容对应的getter方法
32.
33. public String getContent() {
34.
35. return content;
36.
37. }
38.
39. //回复内容对应的setter方法
40.
41. public void setContent(String content) {
42.
43. this.content = content;
44.
45. }
46.
47. //回复主键对应的setter方法
48.
49. public Long getId() {
50.
51. return id;
52.
53. }
54.
55. //回复主键对应的setter方法
56.
57. public void setId(Long id) {
58.
59. this.id = id;
60.
61. }
62.
63. //回复的最后修改时间对应的getter方法
64.
65. public Date getLastModifyDate() {
66.
67. return lastModifyDate;
68.
69. }
70.
71. //回复的最后修改时间对应的setter方法
72.
73. public void setLastModifyDate(Date lastModifyDate) {
74.
75. this.lastModifyDate = lastModifyDate;
76.
77. }
78.
79. //回复对应的消息的getter方法
80.
81. public News getNews() {
82.
83. return news;
84.
85. }
86.
87. //回复对应的消息的setter方法
88.
89. public void setNews(News news) {
90.
91. this.news = news;
92.
93. }
94.
95. //回复发布时间的getter方法
96.
97. public Date getPostDate() {
98.
99. return postDate;
100.
101. }
102.
103. //回复发布时间的setter方法
104.
105. public void setPostDate(Date postDate) {
106.
107. this.postDate = postDate;
108.
109. }
110.
111. //Domain Object重写的equals方法
112.
113. public boolean equals(Object object) {
114.
115. if (!
(object instanceof NewsReview)) {
116.
117. return false;
118.
119. }
120.
121. NewsReview rhs = (NewsReview) object;
122.
123. return this.poster.equals(rhs.getPoster()) &&
124.
125.this.postDate.equals(rhs.getPostDate());
126.
127. /*return new EqualsBuilder().append(this.news, rhs.news).append(
128.
129. this.content, rhs.content).append(this.postDate, rhs.postDate)
130.
131. .append(this.lastModifyDate, rhs.lastModifyDate).append(
132.
133. this.id, rhs.id).append(this.poster, rhs.poster)
134.
135. .isEquals();
136.
137.*/
138.
139. }
140.
141. //Domain Object对应的hashCode方法
142.
143. public int hashCode() {
144.
145. return this.poster.hashCode() + this.postDate.hashCode();
146.
147. /*return new HashCodeBuilder(-1152635115, 884310249).append(this.news)
148.
149. .append(this.content).append(this.postDate).append(
150.
151. this.lastModifyDate).append(this.id)
152.
153. .append(this.poster).toHashCode();
154.
155.*/
156.
157. }
158.
159. //Domain Object对应的toString方法
160.
161. public String toString() {
162.
163. return new ToStringBuilder(this).append("id", this.id).append(
164.
165. "postDate", this.postDate).append("lastModifyDate",
166.
167. this.lastModifyDate).append("content", this.content).append(
168.
169. "poster", this.poster).append("news", this.news).toString();
170.
171. }
172.
173.}
174.
从上面贫血模式的DomainObject可看出,其类代码中只有setter和getter方法,这种DomainObject只是单纯的数据体,类似于C的数据结构。
虽然它的名字是DomainObject,却没有包含任何业务对象的相关方法。
MartinFowler认为,这是一种不健康的建模方式,DomainModel既然代表了业务对象,就应该包含相关的业务方法。
从语言的角度上来说,DomainModel在这里被映射为Java对象(一般都是ORM),Java对象应该是数据与动作的集合,贫血模型相当于抛弃了Java面向对象的性质。
RodJohnson和MartinFowler一致认为:
贫血的DomainObject实际上以数据结构代替了对象。
他们认为DomainObject应该是个完整的Java对象,既包含基本的数据,也包含了操作数据相应的业务逻辑方法。
下面是NewsDAOHibernate的源代码,该DAO对象用于操作News对象:
java代码
1.//NewsDAOHibernate继承HibernateDaoSupport,实现NewsDAO接口
2.
3.public class NewsDAOHibernate ext
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常见 SSH 架构 设计 策略
