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

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
spring aop 2.0 编程(二 ...
依照你的例子,但是我test的时候出现以下结果我把class都放在package ...
-- by Ben.Sin -
ext 之我见
祝愿ext越走越远,把效率问题解决一下。
-- by InnocentBoy -
关于服务端生成js的构思
楼主的想法跟我不谋而合,想问一下remove相应的删除js脚本 ,是指删除以前返 ...
-- by gif98 -
关于服务端生成js的构思
stevenwang 写道你好像把方向搞反了。 为了减轻服务器的负载才选择了ri ...
-- by zyl -
关于服务端生成js的构思
你好像把方向搞反了。为了减轻服务器的负载才选择了rich client技术,你却 ...
-- by stevenwang






评论排行榜