征服jsf

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  6 随笔 :: 0 文章 :: 27 评论 :: 0 Trackbacks

我目前的项目前端使用的是jsf+seam的架构,目前项目已经进入尾声,我想把一些心得体会给大家说说,以便大家在使用jsf的时候,少走弯路。

1.异常处理问题:请为jsf加入seam框架,看看Seam - 无缝集成JSF,共三部分,里面告诉了你怎么在servlet容器下配合spring使用seam,seam不是一定要在ejb3和jboss下才可以使用。因为单独使用jsf的话她的异常处理功能很简陋,跟踪不到你想看的地方,对于开发很不方便,你只有打开日志才能看到问题所在,而seam在加入phase-listener以后,对jsf不同的生命周期都进行了功能增强,即使不使用seam任何的功能,她也能毫无保留的输出所有的异常栈。

2.css问题:如果你想在你的项目中使用jsf,css太重要了,很多刚开始使用jsf的人都不是很习惯jsf基于块结构开发页面,因为jsf让你注意的是展现的内容,而不是展现的样式,这是完全符合w3开发html的初衷,大家使用<table><tr><td>来做页面展现布局,其实是错误已久的方法,如果在jsf中能了解如何使用css进行布局,jsf不适合复杂页面设计这句话就不攻自破了。

3.细心的使用dataTable组件,数据列表是最常用的页面组件,但是我毫不留情的说jsf的dataTable组件的实现简直太滥了,它就是jsf开发一大祸根。没有很方便的解决特定行样式显示的问题,没有解决回退按钮风险问题,没有dataScroll和dataTable组件进行数据库分页的优雅办法,数据提交的幻影问题,我的开发很多时间用在了dataTable的和其他组件块融合上面。不过jsf1.2通过统一el,加入了对jstl的foreach标记的支持,我虽然还没有使用,但是我认为这有可能成为数据列表开发的一个有力补充。

4.建议把jsf的模型bean和后台的业务bean合二为一,这样可以在前端提交页面与模型绑定的同时,完成业务bean的数据封装,并且交由服务层处理一气呵成。这样做有个好处,就是我们会想方设法通过各种手段在第一时间就完成模型bean对业务bean的封装,消除服务层对dto的依赖。这样是可行的,因为jsf的页面绑定机制提供了很好的帮助。

5.请考虑多的使用convert组件,比如列表页面有个radio块,提交radio值就是一个int数值,然后在展现逻辑去恢复这个radio值对应的业务模型,这样增加了展现逻辑处理页面数据的负担,而且不好管理,如果把这个工作放在自定义的convert中,让convert在页面上显示int数值,在提交上寻找对象,那么页面和服务层就屏蔽了这样的工作,看到的都是对象的进出。

6.我使用了myfaces一个自己的组件<t:updateListener>,就是跨页面专递参数,非常好用,刚使用jsf的朋友,可以看到跳转的下一个页面用它怎么做,但是建议传递模型对象,不要传递数值,你使用jsf就是因为她是基于对象考虑页面设计的。

7.小心使用session来处理jsf,jsf过多的使用了session,但是我可以肯定一点,展现层一定是需要基于状态的方式来做的,这样可以简化开发,无状态的方式会带来更多的无序代码。不是每个人都是高手。可以考虑使用seam的conversation来处理,她的长会话特别适合业务编辑,默认的短会话会填补jsf有时容易丢失的短期数据。

8.调试jsf的问题:有时你使用jsf想知道你的数据在哪个阶段变化了,你不会把jsf代码加入到自己的工程中来调试把,请加入自定义的phaseListener,继承phaseListener这个接口,你可以在把你的程序设置在任何阶段跳出来进行调试。

9.分页的问题:在google搜一下,有个http://www.blogjava.net/steady/archive/2005/12/30/26013.aspx提供了分页的方式,我就在使用,这是目前最可能的方式了把,呵呵,不过要注意她使dataTable的values直接使用了dataModel,她与seam的@dataModel是不兼容的,所以不能使用seam的@dataModel功能,需要使用get方式了。

10.如果想使用ajax4jsf等ajax框架,你需要使用facelet,让页面成为标准的xhtml,记好了,不要写了一大堆才发现这个问题。

11.如果你在dataTable列表页面使用了radio的话,你还想在列表上做一些link操作,一定要在操作上加入immediate=true,否则在没有选择radio的情况下她是不会让你过去的。并且列表中要使用selectOneRadio,如果使用checkbox就要使用selectBooleanCheckbox.组件。

12.对于doGet的方式请使用seam的<s:link>组件,<%=request.getContextPath() %>问题,提交引起的书签问题都迎刃而解。

13.如果你导入了其他页面,而没有使用facelet的话,那么导入的那个页面就要完全符合jsf组件的渲染方式,混合html会解析不出来。反过来在主页面应该尽量多使用jsf标记与html混合的方式,这样可以使开发变得简单,尽管有时候jsf会很丢丑,你试试每个html组件都有个render属性就知道了。jsf1.2已经把混合的html作为一个output组件来输出,可以和jsf组件兼容,是件好事。对于混合html这种方式,我想说你关注的是jsf组件和模型的关系,而不一定页面都得是jsf组件标记。

14.不要相信jsf运行的速度慢,jsf虽然在树形组件处理上,每一个阶段都经历了递归遍历,但是要相信jsf依然很快,我现在的系统很快,如果你使用后很慢那是项目产生了问题,而不是框架的产生了问题。

15.相信jsf一定是下一代表现层的王者,这很重要。

就这么多把,jsf的能多经验,我还在摸索当中,有机会还会和大家交流
fangshun1980@hotmail.com

posted on 2007-09-09 10:45 方顺 阅读(3202) 评论(12)  编辑  收藏 所属分类: jsf

评论

# re: 共享我在项目中使用jsf的一些经验 2007-09-09 11:24 yz
老兄,写得不错!有机会讨论下JSF.  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2007-09-09 12:20 steady
相当的不错,比较全面系统  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2007-09-09 12:40 BeanSoft
支持一下!  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2007-09-09 13:13 Thomas
总结得不错,期待交流。
MSN: qixiangnj AT gmail DOT com  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2007-09-09 13:58 coolfish
你好,看来博主对JSF的了解相当深入了.
我们也在考虑在开发过程中加入JSF. 不过我有一个疑问,JSF的RI和myface之类的是不是不兼容的?就是说如果我采用JSF的RI(我看他组件少了点)就没办法采用myface的组件了?反之亦然?

还有一个问题就象上文里第二点,现在在开发中竟然使用div啊之类的,在jsf中都是定义好的tag,那么我们在使用html本身的标签时是不是就没有那么方便了?  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2007-09-09 15:28 Friszart
很不错,不过seam里面的bug还是蛮多的,seam-gen是很方便,但也有很多小问题,其提供的一些framework类好像还不能适应真正的开发。。  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验[未登录] 2007-09-10 11:14 方顺
感谢大家的回复!
1.从理论上讲RI和myfaceImpl是可以兼容的,因为都使用了规范,但是我倾向使用myfaces tomahawk组件,里面对1.1规范的很多组件进行了增强。
2.使用div.label.span等是现在html开发的趋势,而jsf的htmlTag组件,你可以把它看成是div.label等等这些基于块结构的标记,主要是对styleClass的操作,才是核心,jsf tag和html的使用都是一样的!使用css很多事情都变得漂亮。
3.seam还是比较新,但是有很多功能非常好,完全可以选择使用,这就要看你的权衡了,比如异常处理,状态增强,以及不错的扩展组件!  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验[未登录] 2007-09-10 11:29 冰峰
最近在用myfaces/facelets +spring+hibernte做项目,我自己在做的过程也确实遇到了很多问题
希望以后多多交流
honeylee0226#gmail.com  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2007-10-20 19:01 bclz
推荐看一下ICEFaces 的JSF 扩展  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2007-10-29 21:46 嘻哈标明
我之前用jsf,但是觉得很不方便,,现在看到seam之后,丰富多了,但配合一直出错,希望多共享seam的项目搭建,谢谢.  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验 2008-01-06 17:48 xiaopianzi
我页面上有很多的commandLink,action到另一个页面。在a.jsp点击commandLink后,我发现,页面总是先到a.jsp的最顶端,然后,才发送出请求跳到b.jsp。如果,我在a.jsp页面的最下面点了一个commandLink,这时,页面一下子滚动到了a.jsp的最上面,才到b.jsp。
想请问大家是不是也是这样的?
如果是,怎么解决?谢谢
  回复  更多评论
  

# re: 共享我在项目中使用jsf的一些经验[未登录] 2009-03-11 04:30 joe
@xiaopianzi

对jsf还不是很了解
但是我猜应该是因为href="#"
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: