primefaces
来源:互联网 发布:看电影软件不付费 编辑:程序博客网 时间:2024/05/16 07:00
以前有一个梦想,找个做前端开发的女朋友。这样她做前端开发,我做后台开发,双剑合并,行走江湖,天下无敌。
一个月前,看了组件库primefaces的demo,心里想,这下子咱么可以把前端妹子们抛弃了,单干也可以。demo的url见http://www.primefaces.org/showcase-labs/ui/home.jsf。
两周前,在公司接了一个小项目,就试验了一下primefaces和jsf,完了以后发现这玩意儿,其实跟妹子的性格很象——顺心的时候,绝对让你很爽,以前要写大量代码,现在一句话可以搞定。但是有各种小脾气,发作的时候,经常让人找不着北,跌进坑里爬不出来。下面列举一下我掉进去的各类坑,也给有兴趣用jsf和primefaces的同学提个醒。
坑一:输入检测错误后,按钮指定的action不运行。jsf在检测错误后,不会运行后续方法。你可以用process属性指定你要提交的panel或控件。如果不指定process,默认提交所有控件,这样会导致你用不到的控件输入值错。
坑二:commandLinK和commandButton被点击的时候,如果process的控件中,不包括@this(如果this不在提交的form中或者panel中),那么对应的action或者actionListener不会被执行。如果你只想提交某个input的值,那么你的控件的process属性应该这么写:process="inputId,@this"
坑三:如果commandLinK在datatable里面,那么update="table"是无效的,原因不知道。解决方法很简单,在table外面再套一个panel,每次更新那个panel。
坑四:jsf和spring结合后,datatable通过lazyload调用spring的bean,如果该bean的scope不是session,就会报错。原因不知,如果这个bean是配置在face——config文件中,又不会报错。可能是spring版本的问题。
坑五:jsf和spring节后后,通过元数据ManagedBean,无法被页面的el表达式引用,原因未知,可能是spring版本的问题。
坑六:错误复位。假设以下场景,有一个表格,显示某张数据库表的数据。表格的最后一列有一个“修改”按钮。每次点击“修改”,弹出一个窗口上面有各类控件显示对应行的数据。然后点击“保存”,提交到数据库中进行保存。点击另外一行的“修改”,会弹出窗口显示另外一行的数据。问题是,当我点击“保存”后,如果发生检测错误,再选择另外一行进行修改,弹窗控件中的数据不会被更新。这个坑我掉进去很久,查了不少资料才知道可以用primefaces-extendsions的resetEditableValues标签可以解决,在commandButton中加入<pe:resetEditableValues for=":form:updatePanel"/>就可以了。
坑七:scope设成session后会有脏数据的问题,可以通过指定属性的方法强行刷新。比如每次提交的时候,提交一个id为refresh的hidden控件,而在后台的java类中的setRefresh方法 中将脏数据刷新。
坑八:没有拦截器。struts2的拦截器功能强大,经常用它做事务管理、日志记录、异常处理。jsf中有类似的phaseListener,但是功能不够强大。幸亏spring有aop,可以弥补这个问题。jsf的phaseListener不能得到当前运行的managebean的实例,实际上也无法得到,因为jsf每次提交可能涉及多个managebean,不像struts2只会有一个action。
坑九:datatable中c:if无法使用,原因未知。
虽然使用primeface遇到了不少问题,也发了不少牢骚,但是我觉得jsf以后还是一个发展方向。各大java开源组织也推出了不少自己的jsf实现或者组件库,像apache有myface和对应的一套组件库、jboss有richfaces、金蝶有他的京剧脸谱。还有一个icefaces也蛮有名。但是我还是比较喜欢primefaces,控件多,效果漂亮,配置也简单,文档也很齐全。
用了primeface后,有些功能原来很复杂的,现在基本上一句话可以搞定。比如隔5秒刷新一个表格, <p:poll interval="5" process="@this" update=":form:tablePanel" />。用了jsf最大的好处是前后台交互变得很少,前台直接调用后台的函数,也可以直接取得后台数据。基本上我们不用写ajax获取后台数据什么的,javascript也写得很少,因为组件库各类效果都帮你实现了。更诱人的是,你可以根据jsf规范自定义组件,组件库没有帮你实现的,可以自己实现。
一个月前,看了组件库primefaces的demo,心里想,这下子咱么可以把前端妹子们抛弃了,单干也可以。demo的url见http://www.primefaces.org/showcase-labs/ui/home.jsf。
两周前,在公司接了一个小项目,就试验了一下primefaces和jsf,完了以后发现这玩意儿,其实跟妹子的性格很象——顺心的时候,绝对让你很爽,以前要写大量代码,现在一句话可以搞定。但是有各种小脾气,发作的时候,经常让人找不着北,跌进坑里爬不出来。下面列举一下我掉进去的各类坑,也给有兴趣用jsf和primefaces的同学提个醒。
坑一:输入检测错误后,按钮指定的action不运行。jsf在检测错误后,不会运行后续方法。你可以用process属性指定你要提交的panel或控件。如果不指定process,默认提交所有控件,这样会导致你用不到的控件输入值错。
坑二:commandLinK和commandButton被点击的时候,如果process的控件中,不包括@this(如果this不在提交的form中或者panel中),那么对应的action或者actionListener不会被执行。如果你只想提交某个input的值,那么你的控件的process属性应该这么写:process="inputId,@this"
坑三:如果commandLinK在datatable里面,那么update="table"是无效的,原因不知道。解决方法很简单,在table外面再套一个panel,每次更新那个panel。
坑四:jsf和spring结合后,datatable通过lazyload调用spring的bean,如果该bean的scope不是session,就会报错。原因不知,如果这个bean是配置在face——config文件中,又不会报错。可能是spring版本的问题。
坑五:jsf和spring节后后,通过元数据ManagedBean,无法被页面的el表达式引用,原因未知,可能是spring版本的问题。
坑六:错误复位。假设以下场景,有一个表格,显示某张数据库表的数据。表格的最后一列有一个“修改”按钮。每次点击“修改”,弹出一个窗口上面有各类控件显示对应行的数据。然后点击“保存”,提交到数据库中进行保存。点击另外一行的“修改”,会弹出窗口显示另外一行的数据。问题是,当我点击“保存”后,如果发生检测错误,再选择另外一行进行修改,弹窗控件中的数据不会被更新。这个坑我掉进去很久,查了不少资料才知道可以用primefaces-extendsions的resetEditableValues标签可以解决,在commandButton中加入<pe:resetEditableValues for=":form:updatePanel"/>就可以了。
坑七:scope设成session后会有脏数据的问题,可以通过指定属性的方法强行刷新。比如每次提交的时候,提交一个id为refresh的hidden控件,而在后台的java类中的setRefresh方法 中将脏数据刷新。
坑八:没有拦截器。struts2的拦截器功能强大,经常用它做事务管理、日志记录、异常处理。jsf中有类似的phaseListener,但是功能不够强大。幸亏spring有aop,可以弥补这个问题。jsf的phaseListener不能得到当前运行的managebean的实例,实际上也无法得到,因为jsf每次提交可能涉及多个managebean,不像struts2只会有一个action。
坑九:datatable中c:if无法使用,原因未知。
虽然使用primeface遇到了不少问题,也发了不少牢骚,但是我觉得jsf以后还是一个发展方向。各大java开源组织也推出了不少自己的jsf实现或者组件库,像apache有myface和对应的一套组件库、jboss有richfaces、金蝶有他的京剧脸谱。还有一个icefaces也蛮有名。但是我还是比较喜欢primefaces,控件多,效果漂亮,配置也简单,文档也很齐全。
用了primeface后,有些功能原来很复杂的,现在基本上一句话可以搞定。比如隔5秒刷新一个表格, <p:poll interval="5" process="@this" update=":form:tablePanel" />。用了jsf最大的好处是前后台交互变得很少,前台直接调用后台的函数,也可以直接取得后台数据。基本上我们不用写ajax获取后台数据什么的,javascript也写得很少,因为组件库各类效果都帮你实现了。更诱人的是,你可以根据jsf规范自定义组件,组件库没有帮你实现的,可以自己实现。
- primefaces
- PrimeFaces
- primefaces研究
- dataGrid(primefaces)
- dataScroller(primefaces)
- dataList(primefaces)
- carousel(primefaces)
- PrimeFaces+JSF
- primefaces的dataTable问题
- primeFaces的ajaxStatus
- ICEfaces抄袭PrimeFaces
- Primefaces框架开发杂谈!
- PrimeFaces布局技巧
- PrimeFaces主题选择器
- JSF + Primefaces表单验证
- Primefaces开发问题
- PrimeFaces主题选择器
- primefaces dataTable radio
- hoj 2275 Number Sequence
- 【技术类】【了解金字塔】金字塔和概视图的关系
- JDBC用PrepareStatement实现增,删,改,查
- RTP协议分析
- 实现CustomDraw绘制ListCtrl子项的关键步骤
- primefaces
- ACE_Recursive_Thread_Mutex 死锁bug
- 重要的shell命令
- u-boot在s3c44b0 上的移植
- OpenGL ES2.0里的3种变量
- 使用 HTML5 开发 WebApp 性能注意点
- iOS blocks - 三個會造成retain cycle的anti patterns
- Android网络开启、关闭整理http://www.cnblogs.com/huazaizai/p/3398675.html
- android手动连接wifi的过程