JSF学习札记(一)

刚进公司,公司采用的前台表现层框架是JSF,这让我一直学习Struts的新人来说,学习JSF成为首要的任务。公司领导也让我写学习札记来跟踪我的学习进度。说实话,写学习札记是一件非常枯燥的工作,但是如果与自己的博客结合,也许会让自己的学习更加的充满激情。于是以一个初学者的心态把自己的学习札记发表在我的csdn博客上,希望能记录的是自己的进步,也希望各位大侠多提意见,让我找出自己的不足,和更加优秀的学习方法,让自己快速的提高。

2007.07.06  星期五

    公司下星期新的项目就要开始了,采用JSF来进行开发,这让我因为很多原因一直耽搁的JSF学习又一次的提上了议程。
    JSF和Struts都是表现层的框架,都实现了MVC的三层结构。在学习一门技术时,真正的能够在项目中得到很好的应用,最好能做一些增删改查的例子,这样就差不多它最主要的技术和流程掌握清晰,然后在项目中再不断的运用,再把一些细节充实一下,这样就基本能掌握这种技术了。但是做了两天的增删改查的例子,我看是漫漫的发现问题了,我以前学习过Struts并且也一直使用Struts,既然都是表现层的框架,我认为应该和Struts差不多,不是特别难学。但是随着学习的深入,以及对Struts的根深蒂固,让我还是多多少少的不适应。
    相比于Struts的灵活,JSF对jsp封装的更深,入门不是特别的容易。JSF是基于事件驱动的,这一点和基于组件的Struts不同,倒是和ASP.NET有点相似。在学习的过程中,到现在还没有对事件驱动有一个更加深刻的理解,仍然不能摆脱Struts中的思维。
    在做增删改查的例子中,增加、现实列表的功能最先也是最容易实现的,这两项和Struts中的原理基本是一样的,只不过是列表封装成了DataTable,不过也没什么不好理解的。在Struts中,修改和删除操作都是由前台通过url传递参数id,然后后台得到,然后去执行操作数据库。在JSF中我实现这几项功能时,还是利用这种方法去实现。但是因为他的组件封装的太深了,我怎么也找不到一个合适的方法去传递这个id,最后还是同事帮我解决了这个问题,在页面上传递了id,在后台中通过在构造方法中去根据id得到这个对象,然后也就轻松的实现了删除操作和查看操作。但是在实现修改操作的时候,却出现了对象丢失的情况,不是在修改数据,而是执行了插入操作。最后,使用了 FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("articleId",id);这样一句话在丢失对象之前先保存这个对象,然后再触发修改事件的时候再得到这个对象,实现了修改的功能。
    虽然在同事的大力帮助下实现了JSF增删改查的功能,但是里面有很多的细节还没有彻底的搞明白,这也是我以后几天努力的重点,明白JSF的流程,熟悉JSF常用的标签以及工作原理。

2007.07.17 星期二

   以前在同事的帮助下,实现了jsf最基本的增删改查的功能,虽然对一些代码还不是真正的理解,但是已经可以依着葫芦画瓢实现比较基本的功能,这也算学习jsf小有成果吧。
    今天看了百洋健康药房的代码,发现一些的基本的功能的实现依靠了了大量的工具类和基类,于是今天也用了这些工具类重新实现了功能。这些工具类主要是抽取了大量的广泛使用的方法,继承这个类就不需要再写那些冗长的方法,简化了代码,让代码看起来更加的整洁。
    今天在杜刚的帮助下,实现了基本的分页功能。分页功能的实现的主要的步骤是:
    1、在要分页的页面里加入:<%@ include file="dataScroller.jsp"%>
  <%@ include file="dataTestScroller.jsp"%>,并且dataTestScroller.jsp中的for属性值应该和页面中dataTable标签里的id属性值相同。
    2、在实现列表的bean中要继承BasePagedBackingBean.java这个类,并且要实现protected PaginationSupport getDataPage(int startRow, int pageSize){}这个方法,最后返回new PaginationSupport(count,startRow,list)这样一个实例。
    在用Struts的时候,我们可以把一个对象的所有操作放在一个action类中执行(前提是用的分派action),在做jsf的例子的时候,由于受到这种思想的影响,也把增删改查放在一个bean中来执行,但是发现,这样做分页的时候就会出现问题。因为,我在实现修改和删除功能的时候,是在构造函数里得到数据里,在分页的时候要执行构造函数,所以会出现错误。最后把list方法放在一个bean中,其他的方法放在其他的类中,没有问题了。
    下一步的任务就是把代码优化一下,提高代码的运行效率,认真地研究一下基类,理解更加底层的东西。

2007.07.18 星期三
    今天主要是针对分页进行了代码的优化。
    在实现protected PaginationSupport getDataPage(int startRow, int pageSize){}方法的时候,最后需要返回new PaginationSupport(count, startRow, list),其中里面的参数代表的意义是,startRow是查询的起始位置,list是返回的list对象,而count表示查询所有的数据的数目。当时计算count值是采用的以下这种策略:int count = articleDAO.listArticle("from Article a").size();其中DAO里listArticle()方法是返回所有包含Article对象的list,然后计算数目。分页的目的就是为了减少数据库访问量,查询该查询的条数,但是这样计算count的方法,相当于又把数据库里所有的数据查了一遍,效率不仅没有提高,反而因为好几次的查询,效率反而减弱了,怎么改进呢?我查看了公司的网上药店的源代码,发现count的计算是用sql语句中的count来查询的,所以就试着用这种方式来查询。
     一般在hibernate里都是这么写:session.createQuery("select count(a.id) from Article a"),它返回的是一个query对象,我试了好多query的一些方法,始终没能正确地得到一个整形值。最后从网上查,试着采用session.createQuery("select count(a.id) from Article a").uniqueResult()这种方式,它返回的是一个object对象,其实它就是一个结果集的数目,然后通过强制转换,转换成整数值。int count=((Integer)session.createQuery(sql).uniqueResult()).intValue();这种方式要比我的第一种写法效率提高很多。
    hibernate优化非常重要,hibernate使用的好坏很大程度上决定了系统的性能,我会再以后的工作和学习中,逐步的去优化自己的代码,提高系统的运行效率。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值