关于jsf 的标记库

    技术2022-05-11  45

    对于标记库,不想再说些什么了。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有优势多了。  

    最新回复(0)