层次架构的困惑
介绍一下项目的现状先:
大体介绍:
表示层使用JSP,控制层使用STRUTS2,业务逻辑层使用自己封装的service类,持久层使用SPRING的JDBCTemplate封装SQL。
我现在的调用流程是这样的:
JSP(表单参数[参数形式:model.propertyName])--->ACTION(引用一个实体对象作为成员属性,struts2框架自动封装请求参数到实体对象)
--->调用service层的业务逻辑方法(层之间的参数传递依然是ACTION中封装的实体对象)---->service方法处理实体对象(实体对象可能嵌套)并调用多个DAO操作,且封装事务
--->DAO操作(从service层传过来的参数依然是ACTION中的实体对象,只是由service处理过了)
也就是说,层与层之间的接口的参数,我都使用了一个实体对象(当然实体对象会有嵌套关系,这样就可以操作多个实体),
或者在明确了参数仅需要ID的时候,参数为int型的ID(如:根据ID查询某条记录的详细信息时)
有几个困惑如下:
1. 表示层的表单参数的name感觉依赖于实体对象,尤其是实体嵌套的情况,比如某个表单项可能要这样写:name=user.department.deptName,甚至更长.
想问一下,这样好吗?表单参数和实体类属性纠缠在一起
2. 查询的时候,我喜欢直接使用spring的jdbcTemplate封装,使用queryForList等方法,直接返回LIST或MAP,从DAO方法返到SERVICE方法一直到ACTION中,
再将LIST或MAP添加到request中,在JSP页面上,直接使用EL表达式${list.数据库字段名}来显示
这样有个坏处,表示层直接和数据库字段扯在一起了...但是确实方便,想请教一下,老师们是怎么做的?
是不是这样:DAO负责从数据库中select数据,并封装成相应的实体对象或实体对象集合,然后返回到页面去展示吗?
3. 接着问题2,想问一下,查询得到的数据,有没有一种办法,可以灵活动态的定制字段列表,比如同一个查询,但是我需要的显示字段不同,
类似于[粗略展示记录列表]和[某记录的详细信息]这两种情况
我目前是将所有的字段全查出,封装成list或map,一并送去表示层,需要的显示,不需要的就不显示,这样应该是浪费传输资源的吧...
4. 是不是我的这种做法,实体对象就是传说中的DTO ? 我这种情况是否属于DTO满天飞的情况....老师指点啊
5. 看了不少相关文章,记得文章中说过,使用Hibernate的情况,实体对象的持久性质(如ID),不应该带到表示层去,应该剥离持久性质再传到表示层去显示...
这里有个疑问:比如我选中某条记录进行修改,步骤是:
1.根据选中记录的ID取出记录的详细信息并显示--->2.修改详细信息--->3.请求ACTION-->4.业务逻辑-->5.DAO做出修改
其中步骤2修改的页面中,肯定要保存一个hidden表单项---即该记录的ID,以便请求修改时知道所修改的是哪个记录?
老师们,耽误时间指点一下了...多谢!
[该贴被edison87915于2011-12-12 20:04修改过]