现在的位置: 首页 > 综合 > 正文

jsp+spring+hibernate

2013年09月09日 ⁄ 综合 ⁄ 共 4911字 ⁄ 字号 评论关闭

特别感谢

       在文章最开始之前,我要特别最感谢我的朋友子夜,是在他的大力帮助下,才使我很快的对于这部分知识入门,并且完成下面的东西,他是一个对这部分知识很熟悉并且很热心帮助的人,另外要感谢的是steady和他的论坛http://www.js66.com/java/index.php,以及论坛上的朋友们,由于jsf是一个崭新的技术,steady和他的论坛上的朋友们正在努力的翻译相关的E文文档,并且在他的论坛上解答各种各样新人的疑问,希望中国程序员对于这部分知识能够更快的入门,致力于中国jsf的发展作出自己最大的贡献,我有幸加入到了他们的开源组织,以后我也会尽力帮助大家。

第一部分

设计+框架

       现在流行松耦合,所有的东西都要能很好的耦合,基于这个思想,最近网上就出现了一个针对web页面编程的一个全新的做法:jsf+spring+hibernate

       在表现层我们使用了jsfjsf最大的好处就是页面组件化,和传统的页面编程不一样,传统的是将一个页面porst出去,而jsf会把每个页面控件里面填入的值和每个页面控件的事件做一个绑定,通过manage bean back bean的使用来连接后台的java bean,往往在表现层做的最多的事情就是页面跳转,通过manage bean来完成页面跳转,如果用到调用方法就通过配置文件设置back bean来实现,在表现形式上back bean就是manage bean,就是说标签和manage bean是一摸一样的,但是back bean要处理事件,方法,可以说是一个业务beanmanage bean只是单纯的属性调用,完全不用涉及任何业务。总结一下就是完成:收集用户输入,呈现数据,控制页面导航,代替用户与业务逻辑层交互。

       在业务层使用了spring框架,就是ioc的思想,由于是松耦合所以,所以配置起来是很灵活的,比如在dao层我们既可以使用HQL也可以使用SQL,可以互换,另外就是编程到接口的思想,每个源文件都暴露一个接口文件出来,我们要修改实际源文件的内容我们可以任意修改,只要接口不变,还是使用的同一个地方的同一个东西,不用关心里面的任意修改,第三点就是层次清楚,由低向高分别为为model,dao,service,web四层,每一层调用下一层的接口(程序),每一层的任务明确。

在后台使用hibernate映射数据库成为对象,对数据库的操作就是对对象的操作。

所以下面一副框架图表现的相当清楚。

 

第二部分

实现+test

实现

页面层:

       用jsf非常方便,他是struts的一种扩展,相对于struts处理页面action更加细致,在struts里面,页面统一提交给一个ation处理,在jsf里面单位为控件,把对于每个控件输入的值和指定都绑定到控件级别,使得action的处理更加细致,使得页面编程可以象winform编程一样轻松,再加上现在对于jsf编程的插件已经有很好的支持,并且做到了可视化的一步,所以完全可以使用拖拉操作来实现页面设计。写页面程序的时候我们可以用一个很好的插件工具m7拖拉页面控件,每个页面在生成以后要设置其值,如果text控件要设置关联的bean的属性,如果是button控件要设置其事件action,就是跳转时调用bean的方法,以及其id,这个id在配置文件里面就作为跳转页面的from-outcome(标签的值不同的值,可以确定跳转到不同的页面),这就是页面里面一个主要做的事情,另外就是如果用到srping框架,必须在web.xml里面指定用到spring框架,而且要指定spring框架的最主要的配置文件applicationcontext的路径,这web.xml这个文件的配置很重要,因为数据库的相关配置以及数据业务层的bean的调用都是在applicationcontext.xml这个配置文件里面,如果web.xml没有指明applicationcontext的路径或者没有配置,那么等于没有和数据库做关联,或者没有使用spring框架,使用了也不认,所以web.xml是很重要的一个配置文件。再说applicationcontext.xml文件,如果不是做单元测试用,就放到config下面,否则放到classes下面。否则不认。

业务层:

按照调用关系来说明,由低到高分为四层,分别是:model,dao,service,web

model就是由hibernate生成的对应的数据库类,是一个数据库映射,包含一个类文件和一个*.hbm.xml的配置文件。

dao直接对数据层操作,使用hibernate的话就是可以使用HQL面相对象查询语言来直接操作model层,不关心业务层有些什么东西,有些什么方法,有些什么参数,只管自己对model层的完全操作,并返回给一个对象,整个操作的返回值全部放在该对象里面。特别说明的是,如果使用了spring框架,就是引入spring包,可以使用getHibernateTemplate()这个方法,如果没有就还要单独写一个seesion类,通过调用对象seesion来调用hibernate的方法。

serveice操作dao层,就是可以使用HQL面相对象语言来直接面向对象操作dao,业务逻辑也是写在这个层面里面,并且返回一个对象,所有页面会使用到的业务逻辑全部封装在这一层,页面操作层是可以直接使用这一层的。

web就是页面交互和控制层,直接调用serivce层里面的业务逻辑,大量的get,set方法操作页面控件属性,页面直接对这一层操作得到各种各样的值。

数据层:

        可以用hibernate的工具生成一个和数据库相对应的类文件,里面对应到相对应的数据库名字,表名,字段名,而且还要生成一个配置文件*.hbm.xml,例子文件很简单全文如下:

<hibernate-mapping>

       <class name="test.ziye.model.User" table='"user"' dynamic-insert="true" dynamic-update="true">

              <id name="id" column="id" type="long">

                     <generator class="native" />

              </id>

              <property name="name" column="name" type="string" />

              <property name="pass" column="pass" type="string" />

       </class>

</hibernate-mapping>

仅仅是指定了数据库的路径,字段名字,长度,类型等。那么和数据库打交道就等于在和这个类打交道。

test:

代码太多,有兴趣的同事可以问我要test和共同讨论。

第三部分

使用心得和感受

1.页面层:

      由于插件很好的支持,我们可以用可视化IDE编辑页面,方便,可视化程度高,连接后台bean也可以通过这种IDE来实现。非常方便。页面可以组件化和复用,有点OO的思想。

2.业务层:

a.由于使用了spring的依赖注入(ioc)的思想,配置起来很方便,只是需要对applicationctext.xml的文件进行数据库的基本配置以及对数据库操作的dao beanserive bean的配置就可以完成数据库层两面的连接和设置,如果想更换业务或者数据库,直接修改这个配置文件,再导入新的源文件和数据库就ok了。

b.业务分了4层之多,每一层的关联和关系很清楚,业务操作以及数据流程相当清楚,管理每一层都很方便,任何一层可以单独进行修改和维护,比如要加入新的业务,就直接在业务层里面加入新的方法,如果要在页面控制层做变更,同样只用修改web层即可,其他层都是通过配置文件和类名来关联,所以只要配置文件和类名不变就不会有变动,如果要想连一个新的文件,修改配置文件的路径和文件名即可,其实这也是依赖注入思想。

c.编程到接口的思想,如果规范的写程序的话,都会写一个接口和一个实现两个文件,接口只暴露出了方法,另外一个文件是实现,里面才写具体方法的实现,而我们往往只是调用接口文件就可以对里面的方法使用了,如果里面方法有任何变动,我们无需关心,只要接口还是那个接口,非常good的思想,虽然很老,但是在这里面体现得很充分。

3.数据层:

      数据层使用了hibernate,正如hibernate的特性一样,把数据库映射成一个对象,之后的一切操作都是对面向对象,用了hql语言以后体会更加深刻,String hql = "select pass from User a where a.name=:name and pass=:pass";

这个hql能够看出,查找是完全面向对象化的,另外自己写业务的时候要有这个思想,刚开始的我就没有具备这个思想.比如“我们要查询一个传入参数是name的数据库里的pass这个字段”我们要完成这个功能的功能,我们应该在业务层写下面这个方法:

public User getUser(String name) {

              User bean = new User();

              bean.setName(name);

              return (User)userDao.getObjectByBean(bean);

       }

然后web层里面写下面这个方法

public String showPass() {

              User userInfo = loginService.getUser(name);

              pass = userInfo.getPass();

              return "showPass";

       }

       看得出来一切都是在对对象进行操作,如果我们想得到Password这个字段的值,我们就得到这个对象的pass这个属性,而业务层我们放到查询结果或者得到结果也是得到这个对象的整体,也就是说得到这个对象的所有的一切,而我们需要用的时候,要用什么取什么即可。

总体来说:

好处是分层很细,层次清楚,代码维护和管理想当方便,耦合度相当松,解耦方便任何层之间的相互调用很随意(只需要修改配置文件和注意文件路径以及文件名即可),页面编写方便。

坏处是jsf不成熟,贸然使用有不可预知的问题,刚开始出现,文档和帮助都不多,得不到很好的技术支持。

其他注意事项:

1.单元测试就放到classes下面,不然放在config下面,所以web.xmlapplicationContext文件路径就得修改

2.数据源和连接池的jar包:commons-dbcp    dbcpapache的一个开源项目作用是数据源和连接池

3.dbcp的依赖包(pool)dbcp是数据源,而dbcp需要pool这个包作为连接池的支持

4.数据库的jdbc三个jar包:msbase.jarmssqlserver.jarmsutil.jar

5.三个xml文件相当关键,就是web.xml,face-config.xml,appliactioncontext.xml文件,web.xml指定使用了spring框架和appliactioncontext.xml的路径,face-config.xml指定页面跳转,页面调用后台bean的路径和具体事项,appliactioncontext.xml文件配置连接数据库和操作数据库的bean。这三个xml文件非常重要,一定要配置对了。

6.如果使用了spring框架,就是引入spring包,可以使用getHibernateTemplate()这个方法,如果没有就还要单独写一个seesion类,通过调用对象seesion来调用hibernate的方法。

抱歉!评论已关闭.