浏览 3509 次
锁定老帖子 主题:关于jsf 的标记库
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-09
对于标记库,不想再说些什么了。jsf可能最大的毛病都在这个标记库上面,首先定义的标记在jsp中,并不起到相应的输出功能,而只是用来增加相应得组 件。在jsf中,最上层的组件为UIViewRoot,基本上所有的操作都是需要围绕着此组件。而标记库的存在,只是为了简化相应的操作。如下的标记:
<!----><f:view>
<h:form> <h:panelGrid> . </h:panelGrid> </h:form> </f:view> 其实对应的java代码,如下: <!---->FacesContext context = FacesContext.getCurrentInstance();
UIViewRoot root = context.getViewRoot(); HtmlForm form = new HtmlForm(); HtmlPanelGrid grid = new HtmlPanelGrid(); form.getChildren().add(grid); root.getChildren().add(form); 也就是说没有标记库,我完全可以使用java代码完成。 那么标记库的存在到底有没有意义,意义可能就在于简化相应的操作,想想html的属性是比较多的,如果每个都要用java代码去控制,那么可能对于应用来 说,显得很不灵活,因为改代码毕竟没有改jsp来的快。而且代码需要重新编译。所以jsf的标记库存在也是有点意义的。 可是,现在的问题是,由于 jsf本身就是规范,其实现也就会各有不同,对于每种实现都会带有自己的那一套标记库,随着标记库的增加,对于使用者来说,也是不堪忍受的重负。所以,有 些时候,如果需要动态做一些配置,那么还是丢弃标记库,用java代码来完成吧。当然facelets,提供了一种方式,用于很灵活的扩展多个标记库,可 是,看着那么多的标记,总是还有些头疼。 其次,对于标记库来说,各个标记库的不兼容也是一个很大的问题。就拿jstl和jsf来说,jstl的变量声明,在jsf中肯定是没有办法解析的,同样jsf中的变量,在jstl中也不能认识。我指的是页面声明的变量,而不是session变量,如下的例子: <!----><h:dataTable styleClass="table-background"
rowClasses="table-odd-row,table-even-row" cellpadding="3" value="#{recordBean.records}" var="record" binding="#{recordBean.recordData}"> <c:if test="${record}"> </c:if> </h:dataTable> 在dataTable中声明了变量record,但是在jstl中是不会认识的。 可能这个问题,facelets已经解决了,主要facelets把所有的Elcontext中的变量都结合在了一起,使用自身的FaceletsContext。 不过,如果我只是需要简单的功能,还需要使用facelets,那么也就有点大材小用了。况且facelets也只是提供了类似tiles的功能。 最 后,想说的是,虽然jsf目前的ide支持,比其他框架多多了。可惜,人家都是建立在相应的标记库上的,如果你定义了自己标记库,人家不一定会认识。所以 标记库的存在,对于jsf来说,也许并不一定是好事情,可能sun觉得如果把jsp抛弃了,有点可惜。所以在升级jsf的同时,也升级了相应得jsp规 范。 个人觉得,也许模版技术,可能也会是一种选择,看看velocity和freemarker,觉得其比jsp有优势多了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-09
facelets和JSF结合起来用,可以方便开发,复合组件就是不错的例子!
|
|
返回顶楼 | |
发表时间:2007-05-09
LZ所谓Tag对应到API调用其实并是件容易事情,默认的JSF也不是让你这样用的,这主要是受限于UI组件的生命周期,先渲染Tag,然后在服务端维护组件模型,而不是相反的顺序.
只能通过tag的binding属性绑定到后台的一个组件实例,然后去动态的产生一些效果,说到低,还是需要一个tag的 JSF能否成功很大程度取决于一个主够强大的RI实现,而不是需要开发人员自己去集百家之所长,而无法保证它们之间的兼容性 |
|
返回顶楼 | |
发表时间:2007-05-10
JJYAO 写道 LZ所谓Tag对应到API调用其实并是件容易事情,默认的JSF也不是让你这样用的,这主要是受限于UI组件的生命周期,先渲染Tag,然后在服务端维护组件模型,而不是相反的顺序.
只能通过tag的binding属性绑定到后台的一个组件实例,然后去动态的产生一些效果,说到低,还是需要一个tag的 其实,我研究过相应的实现源码,发现其实作用是类似的。不错,组件都是有生命周期的,每个组件都会在session或者client中保存自己的状态,等到下次请求的时候,恢复。可这些都与标记库没有什么特别的联系。而且对于binding,tag就如同在pageContext中声明了相应的变量而以。和jsp的useBean标记没有什么特别的区别。在facelets的源码中,可以完全的使用另外一种方式替换。 当然,这只是我片面的看法。 |
|
返回顶楼 | |