??xml version="1.0" encoding="utf-8" standalone="yes"?>
?B/S 开发中最单的一U开发模式是面 + 逻辑处理Q映到技术上反应出来的有 Jsp+Jdbc Q在Zq类的实C?View 层也是 jsp 面上负责数据的昄、逻辑处理Q结?jdbc 完成数据的持久化Q在型的项目中Qh们确实发现这U方式是最为方便的Q但在复杂的目以及需求不断变化的目中,Z慢慢的发现这U方式造成了不的问题Q首先是调试的问题,x在一?jsp 面中进行排错是多么的困难,其次是修改的问题Qؓ了满用户需求的一个小的变化Q都需要去改不的面Q而且很多时候由于写的时间长了,自己都需要回忆很久才能想h怎么回事Q更不用说如果h员流动了会怎么P同时q带来开发效率的问题Q由于需要缺够的调试的支持,需要较为熟l的开发h员才能快速的完成Q对于一般的人员来说需要一定的适应和学习过E,当然伴随而来的还有诸如修改界面的时候一不小心少 copy 了点代码什么造成的错Q最大的问题可能q是重用的问题,通常会造成 N 多同L代码在页面上 copy ?copy ȝQȝ下来在这U模式下有几个比较重大的问题是:
1?调试问题?/P>
2?l护问题Q显C和逻辑处理在一起导致了修改昄的时候较为困难,至于修改代码则因Z前的调试问题D了困难,同时׃逻辑均在面上后期接手h员需要一D|间去理解?/P>
3?代码重用性问题?/P>
但同样它q是存在优点的,那就是可以很快的上手Q但׃调试和维护性问题确实太大了Q所以在现在也是基本不再采用q种方式了?/P>
Jsp+JavaBean
在经历了 jsp+jdbc 阶段后,开始考虑怎么样去解决上面三个问题Q这个时候就诞生了诸 JSP+JavaBean q样的技术体p,在这个体pM?jsp 面负责昄以及接收面hQƈ调用相应?JavaBean 来完成逻辑处理Q在获取其返回的处理数据后{到相应的面q行昄。在q样的技术体pMQ由于逻辑是由 JavaBean 来完成的Q可以对其进行调试了Q代码的重用性一定程度上也得C提高。刚开始的时候用q样的技术体pȝ实发现比以前?jsp+jdbc 爽了很多Q但随着用多了,慢慢又发C问题Q那是在页面中需要编写对于页面请求数据的获取Q还得根据请求去调用相应?javabean QƈҎ javabean 的处理结果{入相应的面Q这同样造成了修改的ȝQ毕竟是去页面上修改q些逻辑Qȝ下来在这U模式下有比较重大的问题是:
1?代码重用性以及维护性问题。但q里的代码重用性问题和 jsp+jdbc 的就不同Q在逻辑处理部分现在已经可以重用了,但现在在各个面׃得不重复的写获取面h的参数、相应的调用 Model 、根?Model 的处理结果{发页面,q样的话导致了在改的时候需要到处去找,造成了维护的复杂?/P>
2?pȝl构不清晰。毕竟仍然是在页面控制整个响应页面事件的处理程Q这个时候就造成了很多页面中出现完全相同?jsp 代码Q而且控制代码在页面,仍然是不便操作,例如对于 JavaBean 的调用等Q而且׃获取 javabean 的数据需要{发的~故Q其实通常是在最l的昄面上加上上面的控制事g处理程的代码,q没有真正的做到昄和处理的分离?/P>
同样Q它的优点在于分M昄和业务逻辑处理Q增Z可调试以及维护性,而且也是很容易上手的Q对于小型项目来说仍然是可选的Ҏ之一?/P>
Z MVC Framework
在经历了上面?Jsp+JavaBean 后,我们发现其实现在最需要的是?jsp ?javabean 之间能有个东西自动完成页面请求数据的装、根据请求调用相应的 javabean 、同时根?javabean 的处理结果返回至相应?View Q有了这L思想后,发现 smalltalk 中的 MVC 思想很适合q种场景Q于是便?Java B/S 开发中引入?MVC 思想Q在q里也简单的介绍?MVC 思想Q?MVC View ?Model 的分, View 所面对的是 Controller Q由 Controller 负责?Model q行交互Q?View 只负责显C页面以及显C逻辑的处理,昄逻辑指的是诸如第一行要昄蓝色、第二行要显C红色这L昄斚w的处理, Controller 负责接受面hQƈ其h数据q行装Q同时根据请求调用相应的 Model q行逻辑处理Q在 Model 处理后返回结果数据到 Controller Q?Controller 根据此数据调用相应?View Qƈ此数据传递给 View Q由 View 负责数据进行融合ƈ最l展现?MVC 带来的优点很明显的体现出来了Q基于一个这L MVC Framework 的话开发h员可以按照一U固定的模式q行开发,规范了整个开发过E,提高了质量以及系l结构的清晰性,q由于保证了 View/Model 的分,使得一?Model 可以对于多种昄形式?View Q需要的仅仅是去改变 View ?Controller ?/P>
按照 MVC 思想Q最Ҏ惛_的实现方案莫q于 jsp+servlet+javabean Q在q里?jsp 对应着 View Q?servlet 对应着 Controller Q?javabean 对应着 Model Q因为采?servlet 可?servlet container 已经装好的面数据h对象 HttpServletRequest Q这样就省去了自己封装页面请求数据的工作Q作?Controller 同时q需要承担根据请求调用对应的 javabean Q最单的做法无非是?Servlet 中直接根据某U逻辑 ( 诸如反射或接?) 调用相应?bean q行执行Q之后将 HttpServletRequest ?HttpServletResponse 作ؓ参数传入 javabean q行处理Q?javabean ?HttpServletRequest 中获取请求数据,返回的l果数据攑օ HttpServletResponse Q整个过E结束后l箋?Controller 接手q行处理Q这个时候作?Controller ?servlet 根据处理的l果q回相应的页面,在这个模型用时Z慢慢的发C一个问题,那就是随着 jsp ?javabean 的变化造成?controller 的不断修改,需要修改其中调用相?javabean 以及转发相应面的部分,Z解决q个问题Q首先想到的是应该分L据请求调用相?javabean 的步骤,q个时候采用了设计模式中的 front controller+application controller 的方法, front controller 负责接受面hq进行封装,同时此数据对象传递至 application controller Q由 application controller 来负责调用相应的 bean Q这L设计其实都是遵@着一个设计原则,是职责单一Q通常实现 application controller 的模式是 Command 模式Q在q种情况?MVC Framework 的结构体pd演变成了 view+controller(front+application)+model ?/P>
在完成了上述演变后慢慢又发现了一个问题,是 model 依赖于了 httpservletrequest Q这样造成的一个问题就是没法测试,仍然要不断重启服务器来测试,当然与此同时的发展是 model 层的l化Q细化成用于响应面h?action Layer+Domain Model Layer+Persistent Layer Q在q里不去讨论后面层次的问题,因ؓ作ؓ MVC Framework 它ƈ不管?Model 层是怎么个处理流E的?/P>
慢慢也发C另外一个问题,那就是变化经常要影响?controller 的修改,于是便引入了采用配置文g的解x法,~写 action 的配|文Ӟ在配|文件中控制Ҏ action 的返回结果{入相应的 View Q这L话在来需要改变的时候只需要去改变q个配置文g可以了Q保证了 Controller 的稳定,q是典型的设计中的重点考虑因素Q分d化和不变化的Q让变化造成的媄响最?/P>
但在引入了上面的配置文g后,慢慢又发C问题Q那是手写配置文gLҎ出各U各L问题Q这个时候采用图形化的界面来生成配置文g的想法又有了Q这也就造就?page flow 的诞生,当然Q这只是 page flow 的一部分功能?/P>
当然Q随着MVC的发展,也带动了其他相关技术的发展Q如异步h/响应模式(ajax、amowaQ^_^){?/P>
?MVC 思想接受后开源界?MVC Framework 也是如雨后春W般的冒出,比较知名的有 struts ?webwork ?spring mvc {,q些 MVC Framework 基本都已l做C上面提及?MVC 思想演变的一些需求,当然Q即使现在的 MVC Framework 是做CQ但在用这?MVC Framework 的时候我们通常又开始违?MVC 思想的基本要素,是保持 View 仅仅?View 的原则,所以我比较推荐?View 使用 Velocity q之cȝ东西作ؓ View Q尽量保?View 的纯z性,M技术的发展都是循序渐进的,不站在那个高度的时候是不知道前面还有什么样的高qQ那么现在我们缺的又是什么呢?现在?MVC Framework 中还存在着什么不_?q是值得我们思考的?/P>
A、什么时候用Hibernate?
Hibernate是业界一个比较成熟的行的O/R Mapping框架.
说它成熟,因ؓ他提供了一个O/R Mapping产品最主要的功?比如数据库映、连接池理、事务支持等{?更重要的,它提供了对多中数据库产品的支?也许,O/R Mapping和多数据库支持更能够吸引开发者的眼球.
说它行,因ؓ太多的h使用?不论是从实用开发的角度出发,q是从研I的角度出发,甚至是从赶时髦的角度出发.相对于没有自q数据持久层开发能力的开发者角度看,hibernate的确能够Z们带来开发效率的提高,改进软g架构.
那么在什么情况下选择使用hibernate来构q数据持久层呢?
1、自己没有数据持久层开发能?/STRONG>
q个当然勿庸|疑?hibernate提供了一套成熟的模型,能够在短旉内构建适合业务需求的数据持久?当然,前提是要对hibernate有基本的使用开发能?
2、对JDBC底层开发不甚熟悉?
hibernate装了对JDBC底层的调?l一了对不同cd数据库系l的支持.在缺乏对JDBC底层调用的了解之?使用Hibernate可以事半功?
3、团队开发中l一持久层开?
我们把hibernateUCؓO/R Mapping开发框?既然是框?那么如果团队中的成员对这个框架比较熟悉的?那么可以l一团队的开?减少沟通的频率,促进协同开?
4、自己开发的数据持久层不能满业务需?
如果~Z对JDBC的了解和数据持久层开发的l验,可能自己开发的数据持久层会慢慢的不满业务需?比如在数据缓存、连接池理、多数据库支持等{方?hibernate在上q方面有比较的表?自然在不影响业务开发的前提下可以考虑采用.
5、希望你的品不依赖于某U特定的数据?
B、如何设计适用于多U类型数据库的通用产品?
如果你开发的是一N用产品,使用了MS-SQL2000数据?可能某一天你的客户会要求你将产品q移到Oracle,理由很简?-客户原来有购买Oracle数据?不希望再增加数据投资?但是你只能很遗憾的告诉他,你的产品只能使用MS-SQL2000数据?无疑,你将可能失去一个重要的准客?
那么,如何设计适用于多U类型数据库的通用产品而不是提供多个品版本呢?
׃JDBC本n是数据库独立的,即不依赖于具体的数据库类?因此,我们可以从以下几斚wq行把握:
1、尽量用标准通用的SQL语句.
2、尽量上不用各数据库方a和某U数据库Ҏ的函数或者数据类?量通用.
3、将配置参数保存在一个properties文g?
4、利用Configuration.setProperties(Properties pro)Ҏ载入配置参数文g,而不是采用Configuration.configuration()默认自动载入hibernate.hbm.xml配置文g.
C、选择合适的获得JDBCq接方式
假设已经配置了数据库表映文件ƈ得到了SessionFactory:
Configuration cfg = new Configuration();
SessionFactory sessionFactory = cfg.buildSessionFactory
在这里我们讨Z下三U获得JDBCq接的方?
1、用戯己提供JDBCq接:
java.sql.Connection conn = datasource.getConnection();
Session session = sessionFactory.openSession(conn);
q种方式允许用户E序自己来管理JDBCq接.不过同一个连接上不能打开两个q行的session.
2、用Hibernate默认的JDBCq接方式:
通过一下四U方式设|JDBCq接参数:
a、传递一个java.util.Properties到Configuration.setProperties();
b、在classpath目录提供一个hibernate.properties配置文g;
c、在hibernate.hbm.xml中包含JDBC配置参数;
d、通过java -Dproperty=value指定pȝ属?
之后使用Session session = sessionFactory.openSession()获取JDBCq接.q个时候所有的hibernate属性和U束都保存在net.sf.hibernate.cfg.Environment?
3、用JNDI获得JDBCq接:
q个应该可以归到2?不过比较特别,独立出来.
使用JNDI获得JDBCq接要依赖于Application Server的JNDIҎ?不过可以JDBC的管理交lApplication Serverd?采用q种Ҏ获得的JDBC自动集成Application Server的容器管理事务的Ҏ?不过如果更换容器之后都需要重新部|容器的JNDI.
D、什么时候POJO需要实现equals和hashCodeҎ?
当你需要合用POJO的时?比如使用set,必须考虑重蝲equals和hashCode,特别是在两个不同的session装蝲POJO.Hibernate只在单个session保证JVM鉴别,而且是用Object默认的equals和hashCode,如果没有重蝲equals和hashCode.
在通常情况?重蝲equals和hashCodeҎ,我们会在Ҏ中比较POJO的标识关键字.不过,在hibernate?如果q个POJOq没有持久化,那么POJO的表C关键字是不存在?所?我们会采用商业关键字相等的原则来判断两个POJO是否相等.
E、如何合理利用hibernate提供的数据二U缓存功?
1、惰性蝲入机?/P>
2、接口代理机?/P>
3、隐式多态机?/P>
1、支持如下主数据库cd:
MS-SQL(MSDE)、Oracle、DB2、Sybase
2、更换数据库pȝ不需要手工修攚w|文件和拯数据库驱动程?通过提供的Y件工具可以实现可视化修改.
3、在软gpȝ安装或者第一ơ启动运行的时候配|?一ơ性配|?处处q行.
原则:
1、尽量用标准通用的SQL语句.
2、基本上不用各数据库方a.
3、下面以HibernateZ,探讨如何实现上述需?
a、将配置参数保存在一个properties文g?
b、利用Configuration.setProperties(Properties pro)Ҏ载入配置参数文g,而不是采用Configuration.configuration()默认自动载入hibernate.hbm.xml配置文g.