2007-09-08
共享我在项目中使用jsf的一些经验
关键字: jsf
我目前的项目前端使用的是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>组件。
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
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>组件。
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
评论
打倒小日本
2008-06-08
flare 写道
jsf 能成为王者那是真正的搞笑。
你有真正想过什么是web开发吗?你对组件化的设计了解多少?
你对w3c了解多少?你精通div+css的设计?
你对美工了解吗,真的知道怎么与她们协作吗?
你好了解除了jsf之外的其他技术吗?
你最好做一些正而八经的调查与比较之后再来发表意见。
你有真正想过什么是web开发吗?你对组件化的设计了解多少?
你对w3c了解多少?你精通div+css的设计?
你对美工了解吗,真的知道怎么与她们协作吗?
你好了解除了jsf之外的其他技术吗?
你最好做一些正而八经的调查与比较之后再来发表意见。
那您精通JSF吗?做过深入调研吗?对JSF组件化设计了解多少?
你最好做一些正而八经的调查与比较之后再来发表意见。
flare
2008-06-07
jsf 能成为王者那是真正的搞笑。
你有真正想过什么是web开发吗?你对组件化的设计了解多少?
你对w3c了解多少?你精通div+css的设计?
你对美工了解吗,真的知道怎么与她们协作吗?
你好了解除了jsf之外的其他技术吗?
你最好做一些正而八经的调查与比较之后再来发表意见。
你有真正想过什么是web开发吗?你对组件化的设计了解多少?
你对w3c了解多少?你精通div+css的设计?
你对美工了解吗,真的知道怎么与她们协作吗?
你好了解除了jsf之外的其他技术吗?
你最好做一些正而八经的调查与比较之后再来发表意见。
manyhope
2008-06-01
lz总结的真好,很多地方和你有同感(除了的4条不太明白以外).
呵呵,尤其是,我也觉得jsf前途无量呢.
呵呵,尤其是,我也觉得jsf前途无量呢.
bizzad
2008-05-31
jsf项目用了3年了,项目目前10几万的固定用户,早期有点麻烦,传值,session有点问题,后面就很顺了,非常不错,页面开发的效率成倍提高,
dboylx
2008-04-03
LZ您的 技术 与学习的精神 我很敬重
在您的JSF技术成本的贴子,已经学了不少
本贴再加以扩展,是否可以出本“JSF/SEAM 最佳实践与项目指导”
在您的JSF技术成本的贴子,已经学了不少
本贴再加以扩展,是否可以出本“JSF/SEAM 最佳实践与项目指导”
kellersoon
2008-04-03
vlinux 写道
jsf1.2的确是加入了JSTL的支持,不过似乎支持得不大好。特别是在forEach标签上...
你的第4条我看不大明白~你的意思是说吧DAO层直接传递给backing?取消掉中间的Service么?
还有,如果我想同一页面上的不同backing相互传递参数(不用MyFaces)应该怎么实现?我用了HtmlInputHidden,这样就可以在生命周期的第二阶段获得数值,不过不知道这样是否合理。
谢谢指教
你的第4条我看不大明白~你的意思是说吧DAO层直接传递给backing?取消掉中间的Service么?
还有,如果我想同一页面上的不同backing相互传递参数(不用MyFaces)应该怎么实现?我用了HtmlInputHidden,这样就可以在生命周期的第二阶段获得数值,不过不知道这样是否合理。
谢谢指教
之前我是將後台bean設為Session來處理不同頁面間的交互,那樣太犧牲性能,曾一度抱怨jsf在頁面交互方面的缺陷。 後來才知道 有binding屬性,可以綁定後台自定義組件,如HtmlInputHidden,HtmlInputText.. ,待有記憶功能 可以實現不同頁面間的交互。
個人認為HtmlInputHidden,HtmlInputText..的出現就是用來處理我曾疑惑的問題。
feiyu367
2008-04-03
谢谢 楼主指点迷津,jsf新手,学习中
fire01312
2008-02-22
谢谢 楼主,我们公司的DRP项目使用的web框架就是 jsf,而且已经上线。不可否认jsf就是下一代web框架的王者。
xiaochouwolf
2008-02-16
呵呵,谢谢楼主,我现在参与的项目就是在使用JSF,看过你讲的可以让我少走一些弯路
风无记
2007-12-23
谢谢你的经验让我一个初学者得到了一些感悟!
fangshun
2007-10-23
maqujun 写道
看来LZ非常的坚信jsf会是下一代表现层的王者,不知道lz有没有试过tapestry或wicket这些完全组件的框架?我个人觉得JSF和他们相比没有什么优势。不过lz写的不错,多谢分享。
我没有使用过上述框架,如果一定要比较,又变成了标准与事实标准之争,这样的争论太多了,我觉得没有必要,jsf的之路是统一的之路,但是百家争鸣又可以鞭策这种结果,如果tapestry能向spring那样异军突起当然是一件好事,但是它的优势往往又是它的劣势!
fangshun
2007-10-23
zelsa 写道
不知道jsf项目中网页美工是怎么配合的,让程序员来做界面,大多数情况下是只能凑或着用。
jsf鼓吹可以让美工接受标签式设计,我觉得现阶段是不可行的,除非杀了他们!
不过jsf可以约束美工按照css的方式去设计网页,这是一件好事,经过css处理过的页面,对于程序开发相当简洁,jsf以及一些扩展的标记库基本都可以找到面向css结构的标记,例如seam的<s:span>,myfaces的
<t:div>,标准的<h:outputLabel>
maqujun
2007-10-23
看来LZ非常的坚信jsf会是下一代表现层的王者,不知道lz有没有试过tapestry或wicket这些完全组件的框架?我个人觉得JSF和他们相比没有什么优势。不过lz写的不错,多谢分享。
zelsa
2007-10-23
不知道jsf项目中网页美工是怎么配合的,让程序员来做界面,大多数情况下是只能凑或着用。
fangshun
2007-10-23
我很想测试jsf在高并发下的性能,但是没有条件,不知道有没有高人可以验证!
linxizeng
2007-10-23
不会,不过看来好像大家比较怀疑
14.不要相信jsf运行的速度慢,jsf虽然在树形组件处理上,每一个阶段都经历了递归遍历,但是要相信jsf依然很快,我现在的系统很快,如果你使用后很慢那是项目产生了问题,而不是框架的产生了问题。
15.相信jsf一定是下一代表现层的王者,这很重要。
不过我也要用到了....学习!
引用
14.不要相信jsf运行的速度慢,jsf虽然在树形组件处理上,每一个阶段都经历了递归遍历,但是要相信jsf依然很快,我现在的系统很快,如果你使用后很慢那是项目产生了问题,而不是框架的产生了问题。
15.相信jsf一定是下一代表现层的王者,这很重要。
不过我也要用到了....学习!
虚无的曾经
2007-10-23
写得不错,下个项目会用到JSF了,感谢分享经验。
另外我想说的是,质疑JSF的性能问题之前,最好先去验证一下。
另外我想说的是,质疑JSF的性能问题之前,最好先去验证一下。
fangshun
2007-10-23
feigme 写道
使用过myfaces的<t:updateListener>,确实比较好用
但是myfaces对于checkbox好像很无奈,他自己给的例子里也是有问题的
不知道有什么办法- -?
但是myfaces对于checkbox好像很无奈,他自己给的例子里也是有问题的
不知道有什么办法- -?
我使用checkbox是可以的如果在数据列表中使用checkbox要使用BooleanCheckbox组件!
fangshun
2007-10-23
vlinux 写道
jsf1.2的确是加入了JSTL的支持,不过似乎支持得不大好。特别是在forEach标签上...
你的第4条我看不大明白~你的意思是说吧DAO层直接传递给backing?取消掉中间的Service么?
还有,如果我想同一页面上的不同backing相互传递参数(不用MyFaces)应该怎么实现?我用了HtmlInputHidden,这样就可以在生命周期的第二阶段获得数值,不过不知道这样是否合理。
谢谢指教
你的第4条我看不大明白~你的意思是说吧DAO层直接传递给backing?取消掉中间的Service么?
还有,如果我想同一页面上的不同backing相互传递参数(不用MyFaces)应该怎么实现?我用了HtmlInputHidden,这样就可以在生命周期的第二阶段获得数值,不过不知道这样是否合理。
谢谢指教
jsf1.2需要搭配jsp2.1,jstl1.2以后规范才可以体现统一EL表达式的优势,那将是jsf的辉煌的开始,大家可以等等看!
我不是要打破分层,而是要共享模型,以前使用的web技术都很难在模型上下工夫,因为你需要增强处理类去处理web的请求,这样就降低了对象间的可复用程度,你见过有谁把struts的action还做继承,组合等操作的吗? jsf因为屏蔽了复杂的web请求等操作,让模型bean可以映射的页面,而这些模型bean又可以分解为处理,模型,也可以混合,复用,那么这就变的和pojo级别的业务层一样灵活,我们就可以从层次上进行更高的抽象和复用,而我做的就是把hibernate映射的pojo模型,也成为映射在页面的模型bean(backing bean),这样页面处理完模型bean,hibernate的模型对象也就生成了,这样就避免了大量form,dto的复制,你可以想想持久层的模型在属性复制上是多么麻烦!seam更狠,直接把服务层处理类也可以和backing复用也就是ejb3的sessionBean可以作为jsf的backing bean, 当然实体也可以是backing bean,一样的意思!
不需要HtmlInputHidden,要忘记老的开发方式,你现在处理的就是模型bean!如果你的页面某个文本框映射在某个bean的属性上,那么在处理端使用了其他bean,引入那个bean就可以了,引入的方法:
FacesContext facesContext = FacesContext.getCurrentInstance();
VariableResolver vr = facesContext.getApplication().getVariableResolver();
return vr.resolveVariable(facesContext, varName);
varName就是你的那个bean在faces-config里面里面配置的名称!这样就通过解析变量,自动解析,也许在request中,也许在session中!而seam就一个@In("#{varName}")就搞定了!
fangshun
2007-10-22
fight_bird 写道
没用过jsf,不过看完楼主前14条后,我很难相信最后一条。
我提出的很多都是jsf的存在的问题,希望不会打击你的信心,他的前途是你要去用才知道的!
haihai 写道
正在看jsf,发现jsf非常占内存,我现在都有点怀疑在那种并发比较大的项目中,是否能用它
jsf占用内存的情况大多出现在项目中过多session的使用上,jsf自身组件树的状态化会占用一些内存,得看你的项目是不是并发超高的网站,如果是建议还是不要使用jsf,使用jsf不是仅仅为了从数据库读取数据,它给你的是良好的编程模型。
paranoid945 写道
看了第十五条后令我十分怀疑。
我认为所谓表现层的王者不会是基于html这种畸形的东西,而是类似与flash的那种cs结构的东西。
我认为所谓表现层的王者不会是基于html这种畸形的东西,而是类似与flash的那种cs结构的东西。
你言中了,基于html,http无状态协议,我们一直就是在一种畸形的模型下开发,cs结构可以提供好的面向对象化的状态模型,这是web不具备的,这也是jsf成为王者的条件!
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 574 次
- 性别:

- 来自: 西安

- 详细资料
搜索本博客
最新评论
-
共享我在项目中使用jsf的 ...
flare 写道jsf 能成为王者那是真正的搞笑。 你有真正想过什么是web开发 ...
-- by 打倒小日本 -
共享我在项目中使用jsf的 ...
jsf 能成为王者那是真正的搞笑。你有真正想过什么是web开发吗?你对组件化的设 ...
-- by flare -
共享我在项目中使用jsf的 ...
lz总结的真好,很多地方和你有同感(除了的4条不太明白以外). 呵呵,尤其是,我 ...
-- by manyhope -
共享我在项目中使用jsf的 ...
jsf项目用了3年了,项目目前10几万的固定用户,早期有点麻烦,传值,sessi ...
-- by bizzad -
基于myfaces 1.1.x,seam 1 ...
如果部署在上层,那么应用不管如何顺序启动,你的jsf相关类会和ibm-jsf类在 ...
-- by fangshun






评论排行榜