请教一些关于J2EE的一些疑问

herowach 2008-08-05 03:39:46
前提是没有用任何框架;一直想问一下一般的J2EE的实现顺序和一些技巧;一直不知道自己的理解到底对不对,哪里还需要修改?
我自己的理解是:
首先页面发送请求到Servlet,然后Servlet不做逻辑操作(Controller)(一般只接收参数,然后对参数进行简单的有效性校验,如是否整数等),
之后是调处理类(Model)去做具体的操作,但不对数据库进行操作,对数据库操作的全部放在另一个类(DAO)里让Model去调,
同理,这个DAO类也不做逻辑操作,只是做数据库的增删改查操作,如果是查询,将查询结果存放在一个类似数据仓库的类里(DTO)传给MODEL类,
DTO中只有对查询表中每个字段的set,get方法,目的是为了不用频繁请求数据库;


Controller调用Model的方法和Model调用DAO方法,一般是不是都要通过接口的形式啊?
就是Controller调用的是一个接口的方法,而Model实现了这个接口,同样DAO也是实现了一个接口,让Model去调用,
产生的Model和DAO的实例可以由一个工厂类去生成,一般是不是一个工厂只对应一个Model/DAO啊?
如果Model/DAO没有重用,是不是每一个Model/DAO都要对应一个接口啊?
怎么保证Model/里加了方法,而接口又不动呢?难道一定要事先都设计好?想不全怎么办,需求变化怎么办?
那么有多个Model/DAO,会不会有很多的工厂类和接口呢?
好象抽象工厂是多个工厂的一个包装,但感觉还是不够灵活,能不能只写一个工厂,然后要调用哪个工厂就把工厂要制造的类的一个映射名传给工厂制造呢?
这样所有的地方都只需要一个工厂,这样做好不好呢?
除了工厂模式, 一般J2EE项目中,最常用的还有哪些设计模式,都分别用在什么时候呢?


大家都来讨论下```





--------------------------------------------------------------------
以下内容为自动编辑的内容,并非楼主的发贴内容,此仅用于显示而已,并无任何其他特殊作用
楼主【herowach】截止到2008-08-05 15:39:56的历史汇总数据(不包括此帖):
发帖的总数量:10 发帖的总分数:550 每贴平均分数:55
回帖的总数量:68 得分贴总数量:21 回帖的得分率:30%
结贴的总数量:10 结贴的总分数:550
无满意结贴数:1 无满意结贴分:50
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:10.00 % 无满意结分率:9.09 %
敬礼!

取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=herowach
...全文
341 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eddie 2008-08-21
  • 打赏
  • 举报
回复
mark 收藏一下
herowach 2008-08-21
  • 打赏
  • 举报
回复
差不多了,还有人要补充吗?```
Landor2004 2008-08-20
  • 打赏
  • 举报
回复
问题1:
是不是每一个Servlet,至少需要对应1个Model类,这个Model类又至少对应一个DAO类,2个接口,2个工厂类,如果Model比较多会不会比较冗余,
工厂多了应该写一个抽象工厂包装所有的工厂还是应该传配置文件的KEY,让工厂通过KEY取配置文件里的类并实例化?
其实Servlet和model类还有DAO类没什么必然的联系,可能一个servlet只是一个动作,也就是说增删改查可能是4个动作,也就是4个servlet,而这四个动作都是在一个业务类里定义,而某个业务可能有多个实体完成,就可能会调用到多个DAO
问题2:
DTO , VO , POJO, JavaBean之间的区别是什么?
DTO:相当于要传给要传到客户端的对象,客户端不一定需要所有的实体对象,需要什么字段就在DTO里面写什么
VO:页面上要显示的对象
POJO:老的java对象,就是不包含任何耦合的,脱离容器的外部的对象
Java Bean:一个特殊的java类,符合如下条件 1、有无参数的构造函数2、每个属性都要有setter,getter方法3、要实现Serializable接口


问题3:
是不是每一张数据库中的数据表都要对应一个DTO?
DTO是数据传输对象:一张表可能对应多个dto,多个表也可能对应一个dto,看你要往客户端穿什么
问题4:
在DAO层和Model层的异常捕抓应该怎么处理,是一直抛到Servlet里根据异常显示不同的错误页吗?
一般的都是一直往上抛,然后自己写一个异常处理类,来处理所有异常
问题5:
如果只写一个工厂,然后实例化工厂的时候传入要实例的Model/DAO类名(可通过配置文件读入),这样是不是就不够解偶合了?
我觉得其实只要你的每个层面的代码用接口说话,看不到具体的实现就行了
herowach 2008-08-19
  • 打赏
  • 举报
回复
补充一个问题6:
DAO里如果不做逻辑操作,相当于只做简单的查询,更新操作,
那么在Model里的一个方法,就可能对多表进行插入或更新,相当于调多个DAO类里的方法,如果其中一个方法异常了,应该要事务回滚,
那么回滚控制是不是也应该在Model层里?
herowach 2008-08-19
  • 打赏
  • 举报
回复
谢谢Landor2004 的回复,
你说的:"可以设计成一共有两个工厂,一个是产生所有model的,一个是产生所有dao的" ,这个是怎么实现?
这两个工厂是制造所有的具体model实例还是制造生成每个model的工厂的实例呢?

问题1:
是不是每一个Servlet,至少需要对应1个Model类,这个Model类又至少对应一个DAO类,2个接口,2个工厂类,如果Model比较多会不会比较冗余,
工厂多了应该写一个抽象工厂包装所有的工厂还是应该传配置文件的KEY,让工厂通过KEY取配置文件里的类并实例化?

问题2:
DTO , VO , POJO, JavaBean之间的区别是什么?

问题3:
是不是每一张数据库中的数据表都要对应一个DTO?

问题4:
在DAO层和Model层的异常捕抓应该怎么处理,是一直抛到Servlet里根据异常显示不同的错误页吗?

问题5:
如果只写一个工厂,然后实例化工厂的时候传入要实例的Model/DAO类名(可通过配置文件读入),这样是不是就不够解偶合了?

然后有谁能先指点下,我理解的那种顺序和方法,有什么不对的地方吗?

另外加里150分,最后详细回答问题的请到下面地方拿分
http://topic.csdn.net/u/20080806/13/e9550d20-e27b-4dc9-8302-d64de60f5100.html
http://topic.csdn.net/u/20080819/12/370de809-4e9a-4bf5-a344-5c8739e21fc7.html
  • 打赏
  • 举报
回复
楼主加油,你马上就要体会到包结构的设计原理及使用Spring等框架的原因了
herowach 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 Landor2004 的回复:]
引用 11 楼 herowach 的回复:
谢谢Landor2004 的回复,
你说的:"可以设计成一共有两个工厂,一个是产生所有model的,一个是产生所有dao的" ,这个是怎么实现?
这两个工厂是制造所有的具体model实例还是制造生成每个model的工厂的实例呢?

举个例子,如果自己做这种分层开发的话,先不说异常,我觉得简单点的可以这样,没实践过,因为都是用框架的
可以做两个接口,User为例

Java code//业务工厂
public class Busi…
[/Quote]
你写的这个好象就是抽象工厂,但又不象,因为直接返回了目标实例而不是制造目标的工厂实例,
这种方法跟我的问题5里的生成工厂的方法,哪个要好一点呢?

后来加的5个问题还没解决```,解决马上结帖
happy002 2008-08-19
  • 打赏
  • 举报
回复
mark ~
cuixiuqin1954 2008-08-19
  • 打赏
  • 举报
回复
顶你,顺便学习一下!
海会圣贤 2008-08-19
  • 打赏
  • 举报
回复
那么有多个Model/DAO,会不会有很多的工厂类和接口呢?

是啊,当然会有多个工厂啊,
你如果学了Spring的话就不需要工厂了啊,
去学Spring 吧,那里会有很好的解决方法的!

第三个贴子了,记得给分哦!
海会圣贤 2008-08-19
  • 打赏
  • 举报
回复
怎么保证Model/里加了方法,而接口又不动呢?难道一定要事先都设计好?想不全怎么办,需求变化怎么办?

一班都是先写好,实在不行的话,你可以向接口里面添加方法嘛!
海会圣贤 2008-08-19
  • 打赏
  • 举报
回复
Controller调用Model的方法和Model调用DAO方法,一般是不是都要通过接口的形式啊?

一般来说是的,因为一般都是写好接口,然后再去实现,
这样是一种好的习惯!
Landor2004 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 herowach 的回复:]
补充一个问题6:
DAO里如果不做逻辑操作,相当于只做简单的查询,更新操作,
那么在Model里的一个方法,就可能对多表进行插入或更新,相当于调多个DAO类里的方法,如果其中一个方法异常了,应该要事务回滚,
那么回滚控制是不是也应该在Model层里?
[/Quote]

事务要定义到业务层,这是必需的,但是这样就增加了耦合,所以自己写的话很麻烦,所以要用现成的框架来解决这个问题
Landor2004 2008-08-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 herowach 的回复:]
谢谢Landor2004 的回复,
你说的:"可以设计成一共有两个工厂,一个是产生所有model的,一个是产生所有dao的" ,这个是怎么实现?
这两个工厂是制造所有的具体model实例还是制造生成每个model的工厂的实例呢?
[/Quote]
举个例子,如果自己做这种分层开发的话,先不说异常,我觉得简单点的可以这样,没实践过,因为都是用框架的
可以做两个接口,User为例
//业务工厂
public class BusinessFactory{
public static UserBO getUserBO(){
UserDAO userDAO = DAOFactory.getUserDAO();
return new UserBOImpl(userDAO);//每次都new一个新的BO对象
}

public static OtherBO getOtherBO(){
OtherDAO otherDAO = DAOFactory.getOtherDAO();
return new OtherBOImpl(otherDAO);
}
......
}
//DAO工厂
public class DAOFactory{
public static UserDAO getUserDAO(){
return new UserDAOImpl();//得到实际的UserDAOImpl
}
public static OtherDAO getOtherDAO(){
return new OtherDAOImpl();//得到实际的其他的OtherDAOImpl
}
}
//其中一个业务类
public class UserBOImpl implements UserBO{
private UserDAO userDAO;
public UserBOImpl(UserDAO userDAO){
this.userDAO = userDAO;
}
public void addUser(User user){
userDAO.addUser(user);
}
//其他业务方法
......
}
//其中一个DAO类
public class UserDAOImpl implements UserDAO{
public void addUser(User user){
//实际的数据库增加方法
}
//其他持久层方法
......
}

以上例子代码的UserBO和OtherBO是业务接口,UserDAO和OtherDAO是持久层接口,以上是两个简单的工厂,可以这么来调用,以user为例,UserServiceTest是单元测试,可以相当于表示层
public class UserServiceTest {
private UserBO userBO;
......
public void testAddUser()
{
User user = new User();
user.set......
userBO = BusinessFactory.getUserBO();
userBO.addUser(user);
}
}

以上是个例子,没有考虑异常处理,我个人认为这么实现分层!
herowach 2008-08-07
  • 打赏
  • 举报
回复
问题没解决啊```,难道没有人能消除心中的疑问吗?
Landor2004 2008-08-07
  • 打赏
  • 举报
回复
Controller调用Model的方法和Model调用DAO方法,一般是不是都要通过接口的形式啊?
如果想实现分层开发的话,需要实现,比如说表示成,业务层和持久层并行开发,大家不相互影响,这样是需要进行接口话开发的
就是Controller调用的是一个接口的方法,而Model实现了这个接口,同样DAO也是实现了一个接口,让Model去调用,
产生的Model和DAO的实例可以由一个工厂类去生成,一般是不是一个工厂只对应一个Model/DAO啊?
可以设计成一共有两个工厂,一个是产生所有model的,一个是产生所有dao的
如果Model/DAO没有重用,是不是每一个Model/DAO都要对应一个接口啊?
当然要实现,每一个层都是通过接口说话
怎么保证Model/里加了方法,而接口又不动呢?难道一定要事先都设计好?想不全怎么办,需求变化怎么办?
model里加了方法,model里的每一个方法基本上都对应一个业务,增加了方法说明业务发生变化,那么业务接口肯定也的变化。函数内部的变动不影响接口,这个你肯定也知道。
那么有多个Model/DAO,会不会有很多的工厂类和接口呢?
接口肯定会有多个,但是工厂可以只有两个
除了工厂模式, 一般J2EE项目中,最常用的还有哪些设计模式,都分别用在什么时候呢?
单例模式,工厂模式,适配器,迭代器等等
herowach 2008-08-07
  • 打赏
  • 举报
回复
ServletA---调用接口IModelA中的方法--->ModelA工厂类FacModelA实例化ModelA,并以接口IModelA的形式返回给ServletA
ModelA---调用接口IDaoA中的方法--->DaoA工厂类FacDaoA实例化DaoA,并以接口IDaoA的形式返回给ModelA

如果照这个过程,是不是每一个Servlet,需要对应1个Model类,一个DAO类,2个接口,2个工厂类,这样下去会不会太冗余,
工厂多了应该写一个抽象工厂包装所有的工厂还是应该传配置文件的KEY,让工厂通过KEY取配置文件里的类并实例化?
nqyfeng 2008-08-05
  • 打赏
  • 举报
回复
jsp-modle-control-manager-dao
fulianglove 2008-08-05
  • 打赏
  • 举报
回复
vo---> value object 值对象
herowach 2008-08-05
  • 打赏
  • 举报
回复
BO是business object?VO是指什么?
加载更多回复(3)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧