`
glacier3
  • 浏览: 385138 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

代码实现JSF组件树的创建与呈现

阅读更多
意义:
代码创建和呈现JSF组件树的成功意味着,可以在页面动态的呈现各种JSF组件,如在用户交互后,根据用户需求产生界面.,或者用户自定义页面发布

好了,废话不多,直接进入正题

l         JSF组件树创建与呈现



²        创建或者获取根

//从当前上下文获取

UIViewRoot root = facesContext.getViewRoot();



²        创建树

======在现有的根上创建======



用下行方法把组件对象组合起来

parentUIComponent.getChildrern().add(childUIComponent);



例子:

//***树***:根

UIViewRoot root = facesContext.getViewRoot();



//***树***:根/ scriptCollector1

UIComponent uic0 = (UIComponent) root.getChildren().iterator().next();

// uic0获得页面上已有的scriptCollector1,将在这之下创建自己的组件



//***树***:根/ scriptCollector1/ myTable1

HtmlDataTable myTable1 = new HtmlDataTable();

myTable1.setId("myTable1");

uic0.getChildren().add(myTable1); //组合到树上去



//table的Column1

UIColumn myColumn1 = new UIColumn();

myColumn1.setId("myColumn1");

myTable1.getChildren().add(myColumn1);



//Column1的Output

UIOutput myText1 = new UIOutput();

myText1.setId("myText1");

myColumn1.getChildren().add(myText1);



//table的Column2

UIColumn myColumn2 = new UIColumn();

myColumn2.setId("myColumn2");

myTable1.getChildren().add(myColumn2);



//Column2的Output

UIOutput myText2 = new UIOutput();

myText2.setId("myText2");

myColumn2.getChildren().add(myText2);

(例子 完)



²        呈现

组件的Encode()方法,自呈现



renderResponse(facesContext, root ) ; //呈现整个组件树



private void renderResponse(FacesContext context, UIComponent component) {

              try {

                     component.encodeBegin(context); // encodeBegin



                     component.encodeChildren(context); // encodeChildren



                     Iterator kids = component.getChildren().iterator();

                     while (kids.hasNext()) {

                            UIComponent child = (UIComponent) kids.next();

                            renderResponse(context, child);  //递归调用

                     }



                     component.encodeEnd(context); // encodeEnd

              } catch (IOException e) {

                     e.printStackTrace();

              }

}



²        字段数据绑定(表达式,绑定方法)

在数据表中,字段绑定值应为当前行的这个字段的值,不能固定为某个固定的值。

(    代码中不能调用setValue()来绑定数据,

这与页面标记内使用value="#{vardd3.GROUPTYPE}"绑定数据容易混淆 )



表达式创建使用ValueBinding对象

例子:

HtmlDataTable myTable1 = new HtmlDataTable();

myTable1.setId("myTable1");

myTable1.setValue(getDd3());    //获取SDO的数据源: getDd3()

myTable1.setVar("vardd33");        //产生了一个包含当前行数据的一个内部对象

//vardd33,在request域,取值的方法只可以内部组件

//之间完成  [内部当前行,重要的一个对象]

...... ......

              ...... ......

              ...... ......

//创建ValueBinding对象,放入表达式

ApplicationFactory factory = (ApplicationFactory) FactoryFinder

                            .getFactory(FactoryFinder.APPLICATION_FACTORY);

Application app = factory.getApplication();



ValueBinding binding1 = app.createValueBinding("#{vardd33.GROUPKEY}");

//表达式中把前面定义的内部当前行vardd33纳入计算

...... ......

              ...... ......

              ...... ......



//绑定数据到字段

UIColumn myColumn1 = new UIColumn();

myColumn1.setId("myColumn1");

myTable1.getChildren().add(myColumn1);



UIOutput myText1 = new UIOutput();

myText1.setId("myText1");

myText1.setValueBinding("value",binding1);     //最关键的一句, value 是UIOutput

                                                                      //隐藏的一个属性字段,这句话的意

                                                                      //思是动态设置myText1

                                          //的value为binding1的表达式

                                                 //#{vardd33.GROUPKEY}计算出的

                                                 //当前行vardd33的字段GROUPKEY

                                                 //的值

myColumn1.getChildren().add(myText1);





//注意: myText1.setValue(binding1),或者myText1.setValue(binding1.getValue(facesContext))都不能实现setValueBinding的功能。setValue始终是设定一个固定值。

页面上value="#{vardd3.GROUPTYPE}"这样写,肯定faces框架在后台遇到表达式就调用了setValueBinding方法,遇到值,就调用setValue方法。



//探讨ValueBinding对象



比如:

ValueBinding binding = application.createValueBinding("#{newvar}");

binding.setValue( facesContext, map );

(注释:假设这个map对象为{id=”test001”, name=”testName”}



ValueBinding binding1 = application.createValueBinding("#{newvar.id}");

ValueBinding binding2 = application.createValueBinding("#{newvar. name }");

那么

binding1.getValue(facesContext) 就是 ”test001”

binding2.getValue(facesContext) 就是 ” testName”



ValueBinding对象不仅可以引用已有的bean、bean的属性值,等 ……

还可以创建出新的属性对象newvar,供其他使用。



还有就是UIComponent setValueBinding(“newName”,binding)这个的“newName”如果不是属性字段的名称,就会创建这样的属性名称,getValueBinding(“newName” )也可以取出来



setValueBinding

public abstract void setValueBinding(java.lang.String name,

                                     javax.faces.el.ValueBinding binding)

Set the ValueBinding used to calculate the value for the specified attribute or property name, if any.

Parameters:

name - Name of the attribute or property for which to set a ValueBinding

binding - The ValueBinding to set, or null to remove any currently set ValueBinding

Throws:

java.lang.IllegalArgumentException - if name is one of id or parent

java.lang.NullPointerException - if name is null



===========================

java.lang.IllegalArgumentException - if name is one of id or parent好像没有其效果,这里name我试了很多名字,包括组件的id,parent,都没有出现异常。
分享到:
评论

相关推荐

    JSF创建自定义组件

    下面将详细解释如何创建一个自定义JSF组件,包括组件的组成部分、标签库描述、属性处理类和组件类的创建。 一、自定义组件组成 一个完整的自定义JSF组件通常包括以下几个部分: 1. **标签库描述文件(TLD)**:...

    jsf自定义组件的实现

    一个完整的自定义JSF组件通常包含以下几个关键部分: 1. **页面显示代码**:在HTML或JSF页面中,你需要定义组件的呈现方式。例如,一个简单的自定义组件可能在HTML中表现为一个`<div>`元素,在JSF页面中则通过...

    编写JSF用户自定义UI组件(之五)

    1. **JSF组件体系结构**:JSF组件是由UIComponent类及其子类构成的,每个组件都具有属性、事件和生命周期方法。理解这个体系结构是创建自定义组件的基础。 2. **创建自定义组件**:通常涉及以下步骤: - 定义Java...

    JSF1.2.07版源代码

    UIComponent是JSF组件的基础类,代表用户界面中的一个可渲染元素。RenderKit则决定了组件如何在客户端呈现。源代码中,你可以看到各种预定义的UIComponent子类和RenderKit实现,了解它们如何协同工作。 4. **...

    JSF实例源代码下载

    通过分析和运行这些代码,你将能更好地理解JSF框架的工作方式,学习如何创建、配置和使用JSF组件,以及如何处理用户交互和业务逻辑。这些实例对于初学者和有经验的开发者来说都是宝贵的资源,有助于加深对JSF的理解...

    JSF入门代码

    3. **JSP/JSF页面**:JSF应用的视图通常由JSP(JavaServer Pages)或Facelets文件构成,这些文件使用JSF组件库来创建用户界面。在"HelloJSF"中,可能有一个名为`HelloJSF.xhtml`的Facelets页面,它包含了`h:...

    JSF中自定义分页呈现器(Render)的实现和应用

    ### JSF中自定义分页呈现器的实现与应用 #### 概述 JavaServer Faces(简称JSF)作为一项强大的Web应用开发框架,为Java开发者提供了构建动态Web应用程序的有效手段。JSF的一个显著特点在于它能够实现业务逻辑与...

    JSF完全参考手册 所有代码

    4. **视图(View)**:视图是用户看到的界面,由JSP或Facelets页面组成,其中包含JSF组件。 5. **控制器(Controller)**:JSF的控制器主要由动作监听器(ActionListener)和动作事件(ActionEvent)组成,它们处理...

    JSF(java server faces)开源框架的源代码

    JSF组件通过JSF标记语言(JSF tags)在JSP或Facelets页面上声明,并且每个组件都有其特定的功能和属性。 2. **事件(Events)和监听器(Listeners)**:JSF允许组件之间通过事件进行通信。当一个组件触发事件时,...

    JSF网盘实现源代码

    1. **JSF组件**:JSF提供了一系列预定义的UI组件,如按钮、输入字段、表格等。开发者可以使用这些组件快速构建Web页面,并通过EL(Expression Language)表达式与后端数据绑定。 2. **生命周期**:JSF有请求处理、...

    用jsf页面动态创建表格

    本文介绍了如何在JSF页面中使用JavaScript动态创建表格,并提供了详细的示例代码。通过这种方式,可以根据用户的操作实时更新表格内容,极大地提高了Web应用的灵活性和可用性。此外,还讨论了如何添加更复杂的表单...

    JSF入门

    通过这个入门指南,你可以学习到JSF的基础知识,包括如何创建简单的JSF应用程序、理解和使用JSF组件、配置和管理Managed Beans,以及掌握JSF生命周期和Ajax支持。继续深入研究,你将能够利用JSF构建高效、可维护的...

    JSF教程(有关jsf实例的操作步骤)

    JSF组件经历了六步生命周期:恢复视图、应用请求值、处理验证、更新模型值、调用应用程序和呈现响应。每一步都提供了插入自定义行为的机会,如验证用户输入或执行业务逻辑。 **4. Facelets** Facelets是JSF的标准...

    完整的jsf博客源代码

    - **视图**:JSF页面(.xhtml)结合EL和JSF组件,呈现数据给用户。 - **控制层**:处理用户请求,通常通过Action或Navigation来控制流程。 **6. 学习与实践** 对于JSF初学者,这个博客项目提供了一个很好的起点。你...

    利用自定义渲染器实现JSF数据库表分页显示

    通过创建自定义渲染器,我们可以控制JSF如何呈现特定的用户界面组件。 3. **分页**: 分页是一种将大量数据分成多个小块来显示的方法。每个小块称为一页,用户可以通过导航控件(如上一页、下一页等)在不同的页之间...

    JSF实例

    JSF组件有六个主要阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用事件和呈现响应。在这个过程中,JSF处理用户提交的数据,进行验证,更新模型,然后渲染响应。 ### PPT演示 PPT演示通常包含详细的...

    core jsf 1.2 jsf 核心

    JSF遵循MVC(Model-View-Controller)设计模式,将业务逻辑、视图呈现和用户交互分离开来,使得开发者能够更专注于各自领域的代码编写。JSF的核心组件包括UI组件、事件处理、数据绑定和转换验证。 ### 2. UI组件库 ...

    jsf src

    这些源代码文件可能包含了JSF库的实现,包括核心类、组件库、以及与请求处理、渲染和状态管理相关的代码。 在JSF中,以下是一些重要的知识点: 1. **组件树**:JSF应用程序基于组件模型,UIComponent是所有组件的...

    IBM-JSF数据树控件(工具RAD7)项目交换

    在设计阶段,可以通过RAD7的可视化编辑器来添加和配置JSF组件,包括数据树控件。控件的属性可以根据需求进行设置,如默认展开的层级、节点样式、事件处理等。数据绑定是关键一步,将数据模型与控件关联起来,确保...

    JSF实现的智力测试系统

    系统可能利用JSF的各种组件来呈现题目、收集用户答案,并根据用户的回答进行评分。 JSF的组件模型是其一大特色,它提供了丰富的预定义组件库,如输入字段、按钮、表格等。开发者可以通过简单的XML配置或者在Java...

Global site tag (gtag.js) - Google Analytics