Chinaunix

标题: 关于Spring+Struts+Hibernate的问题 [打印本页]

作者: comliu    时间: 2006-06-20 09:11
标题: 关于Spring+Struts+Hibernate的问题
不是所有的页面数据都是通过控制器获取并转发的,有些页面比如index.jsp要直接访问DAO获取数据。
在这种情况下是否只能在页面上傻乎乎地直接new一个ApplicationContext,然后再getBean获取DAO?有没有其他的更Spring一些的办法?
作者: tong0245    时间: 2006-06-20 09:40
如果你用struts的 可以重写 process类具体名字我忘记了 然后在自己的实现中用spring的autowire类  把spring中的bean注入到 action中 不用傻傻的去getbean
细节我记不清楚了 给你个思路
如果不通过转发的 你可以用servicelocator 方式取bean applicationcontext应该是个单例的

[ 本帖最后由 tong0245 于 2006-6-20 09:43 编辑 ]
作者: comliu    时间: 2006-06-20 14:11
标题: 问题基本解决
ServiceLocator只是将生成ApplicationContext和getBean等方法封装起来而已阿!
作者: tong0245    时间: 2006-06-20 14:41
原帖由 comliu 于 2006-6-20 14:11 发表
ServiceLocator只是将生成ApplicationContext和getBean等方法封装起来而已阿!

可是起码你不用“在这种情况下是否只能在页面上傻乎乎地直接new一个ApplicationContext,然后再getBean获取DAO?有没有其他的更Spring一些的办法?”
n你每个页面都new吗????????
作者: xyz20003    时间: 2006-06-20 14:57
jsp似乎没法子用spring管理注入,如果你遵守mvc的守则,把业务逻辑都写进bean里,而不是在jsp中处理,那就不需要在jsp里获取applicationContext了。
我个人的建议是不要在jsp里写任何逻辑。
作者: comliu    时间: 2006-06-20 17:14
原帖由 xyz20003 于 2006-6-20 14:57 发表
jsp似乎没法子用spring管理注入,如果你遵守mvc的守则,把业务逻辑都写进bean里,而不是在jsp中处理,那就不需要在jsp里获取applicationContext了。
我个人的建议是不要在jsp里写任何逻辑。


不知道您所说的“逻辑是指什么”。
我的意思是,比如我需要在页面上显示一个班学生的列表,
我把这个业务逻辑在DAO对象里写成一个getStudentsByClassId()方法,
像这种情况,就可以直接让jsp调用getStudentsByClassId()直接获取数据,
而没有必要由控制器调用getStudentsByClassId(),然后setAttribute,然后转发。
但是现在由于Spring的引入,DAO对象在使用之前需要注入SessionFactory,并且要使用事务代理,所以
不能直接访问DAO对象,而要通过ApplicationContext加工一下。
我相信从页面直接访问DAO对象是必要的。tong0245的ServiceLocator是可行的。作为一个刚接触Spring
的人,我要感谢tong0245对我的帮助。
作者: kakasi    时间: 2006-06-20 18:13
恕我直言,lz暂时还不太适合整合这么一堆框架。
就问题而言,实际上从index.jsp到dao,从清晰角度说至少应该有这么几层:

login.jsp(index.jsp访问dao实在有些不知所谓)-->loginAction(这里应该是spring bean注入点)-->loginService-->userDao

spring可以非常优美的进行事务处理,我想这是考虑结合spring的最大初衷,至少对我来讲。而并非要如何如何才能“更spring”,更前卫。
作者: xyz20003    时间: 2006-06-21 08:37
原帖由 comliu 于 2006-6-20 17:14 发表


不知道您所说的“逻辑是指什么”。
我的意思是,比如我需要在页面上显示一个班学生的列表,
我把这个业务逻辑在DAO对象里写成一个getStudentsByClassId()方法,
像这种情况,就可以直接让jsp调用getStuden ...


我对mvc的理解是,jsp属于view,只负责显示。意思就是说,jsp里除了从HttpServletRequest里getAttribute外,就只有out.print这样的操作了。所有对dao的操作都放在struts的Action里。这样虽然会比较麻烦,但分层会让人感觉舒服很多。

尽量不要在jsp里写java代码,也是规则之一。
作者: comliu    时间: 2006-06-21 13:27
原帖由 xyz20003 于 2006-6-21 08:37 发表


我对mvc的理解是,jsp属于view,只负责显示。意思就是说,jsp里除了从HttpServletRequest里getAttribute外,就只有out.print这样的操作了。所有对dao的操作都放在struts的Action里。这样虽然会比较麻烦,但分 ...


http://bbs.qianlong.com/main.jsp?url=%2Fforum1%2Ffrontshow%2F
千龙BBS主要就是页面直接访问DAO,包括分页操作。

拿数据库设计打比方,如果完全按照范式设计,则在应用时可能出现过度的连接查询,如果在遵循范式的基础上有选择地逆规范化,则可以提高效率。
MVC与此同理,过分严格地遵循MVC,也会造成效率的下降。有些页面,比如论坛首页,完全定死了的,就是查数据库里的那个表,就是查那么多行,什么时候都是这套规则,这时再搬出一个控制器来多废道手就多余了。
MVC是很好,应当遵循,但也要灵活掌握,这就是我的想法.
作者: xyz20003    时间: 2006-06-21 16:50
原帖由 comliu 于 2006-6-21 13:27 发表


http://bbs.qianlong.com/main.jsp?url=%2Fforum1%2Ffrontshow%2F
千龙BBS主要就是页面直接访问DAO,包括分页操作。

拿数据库设计打比方,如果完全按照范式设计,则在应用时可能出现过度的连接 ...




哦,如果非要在jsp里写业务逻辑代码的话,你怎么用spring托管这些jsp呢?不能用spring管理jsp,也就不能使用依赖注射啦。。。不遵守规则获得灵活性,估计就要丧失另外一些应用的便利了。

要不咱们取一个折中的办法,写个servlet或listener,在里边获取applicationContext放进ServletContext里,jsp直接从ServletContext拿这个applicationContext?因为我不知道如何让spring注入东西,期待其他同志的建议。

[ 本帖最后由 xyz20003 于 2006-6-21 16:51 编辑 ]
作者: comliu    时间: 2006-06-21 17:08
用大天使说的ServiceLocator就可以
实际上ServiceLocator封装了获取ApplicationContext和getBean()的方法
我写了一个简单的:
public class ServiceLocator {
       
        private ApplicationContext appContext;
       
       
        public ServiceLocator(ServletContext sc){
                appContext=WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
        }

        public Object lookupService(String serviceName){
                return appContext.getBean(serviceName);
        }
}


可以写一个listener,在应用程序初始化的时候将其实例化并置于ServletContext中,页面上用
application.getAttribute()获取。
作者: kakasi    时间: 2006-06-21 17:51
原帖由 comliu 于 2006-6-21 14:27 发表


http://bbs.qianlong.com/main.jsp?url=%2Fforum1%2Ffrontshow%2F
千龙BBS主要就是页面直接访问DAO,包括分页操作。

拿数据库设计打比方,如果完全按照范式设计,则在应用时可能出现过度的连接查询,如果在遵循范式的基础上有选择地逆规范化,则可以提高效率。
MVC与此同理,过分严格地遵循MVC,也会造成效率的下降。有些页面,比如论坛首页,完全定死了的,就是查数据库里的那个表,就是查那么多行,什么时候都是这套规则,这时再搬出一个控制器来多废道手就多余了。
MVC是很好,应当遵循,但也要灵活掌握,这就是我的想法.


程序可能强调的是简洁高效,但是工程很多时候更要求清晰与可维护。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2