把JSF从1.1升级到1.2,这个过程中暴漏出JSF的一些不足,如下:
一,原来在1.1下运行很正常的backing bean 不再正常了,调试之后发现有些backing bean 竟然是使用的包级私有的构造函数,但是很纳闷怎么在1.1下正常而1.2下就实例化不了,可能是JSF 1.1 的实现中是利用反射机制进行backing bean的初始化吧,而1.2又改成调用backing bean 的默认构造函数了,所以碰到包级私有构造函数的backin bean 才出现无法实例化的异常吧。
二,JSF提供的组件中的那个SelectOneMenu个人认为有一个不足之处,如果服务器端初始化组件树时候有四个待选项,到了客户端页面通过ajax对待选项进行了修改,比如改成了五个,这中情况下你页面中的所有command类型的组件的方法绑定都会失效,跟踪JSF源码发现这个SelectOneMenu的Render中首先进行了一个个人认为画蛇添足的校验,它首先校验你提交上来的那个值是否在组件初始化时候提供的待选项内,如果不是待选项中的某个则直接生命周期最后阶段并忽略了中间的所有处理,包括你的方法绑定,这个问题很隐蔽,一般很难发现,这个校验个人认为为客户端使用AJAX带来了很大的麻烦,动态修改下来菜单的选项是很普通的ajax应用了(比如多级联动下拉菜单),为了给SelectOneMenu提供ajax能力我不得不重新实现了一个SelectOneMenu,现在我把工程升级到JSF 1.2才发现JSF1.2的核心api正如官方所言没有重大改动,只是统一了EL,但同时我确发现JSF的一些“不重要”的API改动确很大,我自己开发的组件用了1.1中的**util类,可是现在发现那些静态方法现在都没有了,这时不得不再次重新写一个SelectOneMenu,这回一点儿它的**util类也不用,免的下回升级还重写。
三,JSF 1.1 RI中的commandLink居然把dom中的onClick()自己占用了,发现JSF1.2 RI又还回来了,这点还是做的不错的,不过却发现JSF组件ID系统自动生成的算法改了,1.1中如果你没有给页面上的组件指定ID那么JSF会按照某种算法自动生成一个,可是1.2中不但为这个自动生成id的行为增加了一个“开关”,而且生成算法也改了,这回麻烦大了,当初项目组中很多成员比较懒,页面中的javascript直接就是用的那个自动生成的ID,这回生成算法一改页面中的大部分javascript都瘫痪了,唉,懒人啊!
四,原来1.1与Spring整合的时候发现Spring提供的JSF变量解析器只能整合MyFaces,不得不使用了jsf-spring.jar进行jsf RI+spring整合,现在突然发现JSF 1.2 RI终于可以直接使用spring的变量解析器进行整合了,这点儿还是不错的。表扬一下!
五,原来项目中的上传下载使用了MyFaces的tomahawk组件包中的部分组件,可是到apache的网战上一看虽然MyFaces-core出了1.2版本,但是tomahawk还仍然停留在1.1,唉!组件版本不兼容的烦恼啊!
一,原来在1.1下运行很正常的backing bean 不再正常了,调试之后发现有些backing bean 竟然是使用的包级私有的构造函数,但是很纳闷怎么在1.1下正常而1.2下就实例化不了,可能是JSF 1.1 的实现中是利用反射机制进行backing bean的初始化吧,而1.2又改成调用backing bean 的默认构造函数了,所以碰到包级私有构造函数的backin bean 才出现无法实例化的异常吧。
二,JSF提供的组件中的那个SelectOneMenu个人认为有一个不足之处,如果服务器端初始化组件树时候有四个待选项,到了客户端页面通过ajax对待选项进行了修改,比如改成了五个,这中情况下你页面中的所有command类型的组件的方法绑定都会失效,跟踪JSF源码发现这个SelectOneMenu的Render中首先进行了一个个人认为画蛇添足的校验,它首先校验你提交上来的那个值是否在组件初始化时候提供的待选项内,如果不是待选项中的某个则直接生命周期最后阶段并忽略了中间的所有处理,包括你的方法绑定,这个问题很隐蔽,一般很难发现,这个校验个人认为为客户端使用AJAX带来了很大的麻烦,动态修改下来菜单的选项是很普通的ajax应用了(比如多级联动下拉菜单),为了给SelectOneMenu提供ajax能力我不得不重新实现了一个SelectOneMenu,现在我把工程升级到JSF 1.2才发现JSF1.2的核心api正如官方所言没有重大改动,只是统一了EL,但同时我确发现JSF的一些“不重要”的API改动确很大,我自己开发的组件用了1.1中的**util类,可是现在发现那些静态方法现在都没有了,这时不得不再次重新写一个SelectOneMenu,这回一点儿它的**util类也不用,免的下回升级还重写。
三,JSF 1.1 RI中的commandLink居然把dom中的onClick()自己占用了,发现JSF1.2 RI又还回来了,这点还是做的不错的,不过却发现JSF组件ID系统自动生成的算法改了,1.1中如果你没有给页面上的组件指定ID那么JSF会按照某种算法自动生成一个,可是1.2中不但为这个自动生成id的行为增加了一个“开关”,而且生成算法也改了,这回麻烦大了,当初项目组中很多成员比较懒,页面中的javascript直接就是用的那个自动生成的ID,这回生成算法一改页面中的大部分javascript都瘫痪了,唉,懒人啊!
四,原来1.1与Spring整合的时候发现Spring提供的JSF变量解析器只能整合MyFaces,不得不使用了jsf-spring.jar进行jsf RI+spring整合,现在突然发现JSF 1.2 RI终于可以直接使用spring的变量解析器进行整合了,这点儿还是不错的。表扬一下!
五,原来项目中的上传下载使用了MyFaces的tomahawk组件包中的部分组件,可是到apache的网战上一看虽然MyFaces-core出了1.2版本,但是tomahawk还仍然停留在1.1,唉!组件版本不兼容的烦恼啊!