惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Affairs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Jina AI
Jina AI
P
Palo Alto Networks Blog
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Blog — PlanetScale
Blog — PlanetScale
S
Schneier on Security
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
雷峰网
雷峰网
T
Tenable Blog
人人都是产品经理
人人都是产品经理
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
AWS News Blog
AWS News Blog
Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
Scott Helme
Scott Helme
SecWiki News
SecWiki News
C
CERT Recently Published Vulnerability Notes
Recorded Future
Recorded Future
I
InfoQ
Security Archives - TechRepublic
Security Archives - TechRepublic
Help Net Security
Help Net Security
Cloudbric
Cloudbric
C
Check Point Blog
Engineering at Meta
Engineering at Meta
TaoSecurity Blog
TaoSecurity Blog
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
N
News and Events Feed by Topic
云风的 BLOG
云风的 BLOG
MyScale Blog
MyScale Blog
腾讯CDC
量子位
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
Kaspersky official blog
Vercel News
Vercel News
F
Full Disclosure
T
Troy Hunt's Blog
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs

博客园 - 灵石

精神空虚时想到的 系统架构:J2EE中我使用SDO与JSF后的分层架构体系 学习程序开发的方法,仅供参考吧 WAS应用系列:WAS6 自定义用户注册接口代码 + 企业应用安全角色配置 + WAS安全配置 实现统一灵活的集成授权 5月以来的学习,软件工程+设计模式+J2EE开发+portal开发,以及SOA技术 跨越3个层面的学习进展,.net事件驱动编程/.net模型驱动编程/J2EE模型驱动Struts架构编程 together 2005 for VS.NET bug 汇总 五一假期学习目标 读博友的一篇《陈安之成功法则》后的感想 困惑?UML的缺陷? UML学习随笔20060427 UML学习随笔20060420 回来了,很久很久没来了 进一步的研究微软的报表服务 微软报表服务ReportServices的安装 在微软报表服务中,使用odbc连接Sybase数据库,无法使用参数查询的问题我找到办法了 我在寻找.net的 oledb for syabse 死微软, TM的报表服务中如果用odbc联接,不支持查询参数 微软的ReportServise
代码实现JSF组件树的创建与呈现
灵石 · 2006-09-01 · via 博客园 - 灵石

 意义:
代码创建和呈现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); //组合到树上去

//tableColumn1

UIColumn myColumn1 = new UIColumn();

myColumn1.setId("myColumn1");

myTable1.getChildren().add(myColumn1);

//Column1Output

UIOutput myText1 = new UIOutput();

myText1.setId("myText1");

myColumn1.getChildren().add(myText1);

//tableColumn2

UIColumn myColumn2 = new UIColumn();

myColumn2.setId("myColumn2");

myTable1.getChildren().add(myColumn2);

//Column2Output

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

                                          //valuebinding1的表达式

                                                 //#{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对象不仅可以引用已有的beanbean的属性值,等 ……

还可以创建出新的属性对象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我试了很多名字,包括组件的idparent,都没有出现异常。