基于目前的认知,我大概清楚目前JEE App里的架构分层大概如下:
view-->controller-->service-->dao-->entity
1.controller层
(1)职责:负责协调view层与service层,具体而言就是获取、过滤view层的输入,调用相应的service逻辑处理并根据其返回结果选择不同的view进行显示。
(2)依赖性:向下依赖service,向上依赖容器或框架
2.service层
(1)职责:负责向controller提供业务逻辑处理接口,事务安全的调用dao层完成业务逻辑处理。
(2)依赖:组合或继承dao(下面会解释)或向下依赖dao,向上依赖容器或框架。
3.dao层
(1)职责:负责对应实体的持久化工作,包括CRUD等。
(2)依赖:向下依赖PO或entity,向上依赖容器或框架
上面说到service会组合或继承dao,我相信有人会觉得疑惑或质疑。我以我个人的认知来谈谈这个问题。首先,我们不能排除那些微型的基于数据库CRUD的JEEApp的存在,实际上留言板、BBS等都具有该特点,在这种系统中,service层对controller提供的业务逻辑接口至少会有CRUD方法吧?而且是“纯粹”的CRUD,例如添加一条留言,这个行为无论对于service还是dao来说,都是一样的,其方法签名甚至连名字都可以一样,那么,我们是否可以让service具有CRUD的能力呢?不仅如此,我们是否应该无需手动编写任何的CRUD代码呢?(因为这些代码完全可以让反射帮你搞定)。那么,service层到底应该手动编写什么代码呢?从上面说到的职责来看,有两个理由,一个是具有事务性,一个是复杂性,这里说的复杂性是对于超过单个dao方法能力而言。例如前面谈到的添加一条留言,如果添加留言需要某些前置条件,例如保证添加者是登陆状态的,那么这时候dao的create方法就没办法满足要求了,这时候service的create和dao的create方法处理逻辑完全不同,因此需要手动编写service的create方法了,也许编写如下:
public String create(MessageVO message,HttpServletSession session){
String error = null;
if (session.getAttribute(message.getAuthor()) == null){
error = "您还没有登录,请先登录才能发表留言";
}else{
error = this.dao.create(message);
}
return error;
}
但是,如果没有这种需求呢?如果仅仅是发表一下留言而无需登陆呢?我想,这这时候代码应该如下:
public String create(Message message){
return this.dao.create(message);
}
我们发现这时候service里的create方法做的仅仅是调用一下dao的create方法而已,除此之外没有任何额外的动作,那么,想象一下,如果一个系统的service层,这样的方法竟然占了大部分,我想,没有人愿意承受这样无趣的代码编写工作吧?这种问题其实完全可以通过组合dao或者继承dao来解决。这时候,service层依然存在,但是某些无趣的代码就无需开发者手动编写了,当然,前提条件是“无趣的代码”,这里即和dao完全一样的代码,再当然,这一切都基于需求,需求决定了是否能够这样做,上面的例子也已经足够说明问题了,不是吗?
另外,对于DomainModel,我个人有这样一个想法,DomainModel不需要也不必要一一对应一个Java Class,它是对现实世界某个领域的建模,而实现这种模型可以通过多个类的协作或组合来达到目的。Java现在的做法就是Service+DAO+PO的方式。我个人是这么理解的这三部分与DomainObject的关系的,Service包含了DomainObject的DomainLogic,DAO解决了DomainObject的持久化逻辑,PO封装了DomainObject的属性。这三者共同协作完成了对Domain建模(模拟?反映?)
而对于ROR里一个domain既包含了持久化行为,又包含了逻辑行为,本身还是属性数据载体的做法,本人水平有限,不敢苟同。它宣称这样更加OO,可是OO里另外一条重要的原则“保持类的职责单一”,却在这里被违背了,在我认为,持久化、商业(领域)逻辑、数据载体(对外提供setter和getter访问)都算一种职责,那么这里就已经包含了三中职责了。
本人是菜鸟,欢迎拍砖。
分享到:
相关推荐
对自己,则应谦逊,使用谦辞,如“鄙人”、“浅知拙见”。 3. **把握语体**:不同文体对语言的要求不同。比如,文学创作追求形象生动,科技论文要求精确严谨,公文要求简洁明了,合同则需要法律术语和严密的逻辑。...
7. 口语交际:在生日派对上,龙一鸣可以感谢同学们的祝福,表达自己的喜悦和对未来的期待。在辩论中,正方可以从互联网的便利性、沟通快捷等方面阐述其增进感情的作用,反方则可以从过度依赖网络导致面对面交流减少...
GRE考试,全称Graduate Record Examinations,是美国研究生入学考试,主要针对申请研究生阶段的学生,特别是打算攻读硕士和博士学位的人群。这个考试旨在评估考生的批判性思维、分析写作以及定量推理能力。GRE考试中...
- 使用“浅知拙见”表明谦逊态度,请求批评指正是表达开放和尊重他人意见的体现。 - 避免使用过于自大或过于谦卑的语言,要保持适中的表达,如“略尽绵薄之力”可能过于谦虚,而“殷切期望”可能显得过于命令式。 ...
7. 交际语言得体:在D选项中,经理用“浅知拙见”谦虚地评价自己的意见,并邀请他人批评指正,展示了一种谦逊和尊重他人的交际礼仪,是得体的表达方式。 综上所述,这份江苏省盐城中学高三语文月考试题涵盖了语文...
一份好的PPT有关于JAVA,第一章异常的概念,让你浅知异常的基本概念和解决方法
7. 自我评价:在表达个人观点时,应保持谦虚,如“浅知拙见”,表示自己的见解可能肤浅,欢迎批评指正。 8. 悼念与祝福:在涉及生死或敏感话题时,用词要格外慎重,如“家严”是对父亲的尊称,用于悼念;“荣幸”...
D项的"上"和"下"是方位名词作状语,表示动作的趋向,不同于其他三项的用法。 6. 文学常识:A、B、C选项的描述都是正确的。D选项中《始得西山宴游记》是柳宗元的山水游记,其中的“西山”象征了作者的人格,但并没有...
从给定文件内容中,可以提炼出关于教育管理和教师能力提升的知识点: 1. 校长的角色和职责:文档强调了校长不仅是管理职位,更是一名教育行家。校长需要通过不断的自我提升,提高自身的教育教学能力,这样才能更好...
【高考语言表达得体】是高中语文教学中的一个重要知识点,主要考察学生的语言运用能力和情境交际能力。在高考中,这一部分通常以选择题或者主观题的形式出现,要求考生能够根据不同的语境和对象,选择最恰当的语言...
要了解中国服饰那多样的款式、独特的风采、出色的工艺,首要的目的就应该浅知一点中华民族博大深邃的服饰文化发展轨迹,这样才能通过浏览,去着意开掘中华服饰文化的底蕴。 网站将中国的传统服饰作为主题,主要介绍...
【标题】和【描述】提及的是一个中学语文的月考试卷文档,标签为"中学试卷",内容包含了一些具体的语文试题。以下将根据题目内容详细解释相关知识点: 1. **汉字拼音**: - 此题考查的是汉字的正确读音,如"漫溯...
总结来说,C#监听键盘的功能主要通过键盘事件处理和全局键盘钩子来实现,这在多种应用场景中都有其价值,但同时也需要注意对用户隐私的尊重和保护。通过深入理解这些技术,开发者可以创建出更加高效且用户友好的应用...
在C#编程中,系统托盘图标(也称为通知区域图标)是应用程序在任务栏右下角显示的小图标。这个图标通常用于提供快速访问菜单、显示通知或在后台运行服务。"C#系统托盘图标闪动.rar"的资源包含了实现类似QQ那样具有...