Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf adf-如何修改树中的组件?_Jsf_Oracle Adf - Fatal编程技术网

Jsf adf-如何修改树中的组件?

Jsf adf-如何修改树中的组件?,jsf,oracle-adf,Jsf,Oracle Adf,来自jsf 1.2 revB mrel2规范:第65页底部 ■ 应用程序必须能够在请求处理生命周期的任何时候(视图呈现期间除外)以编程方式修改组件树,并使系统按预期运行。例如,必须允许以下情况。在渲染期间修改视图可能会导致未定义的结果。在呈现之前,必须允许从树中删除模板系统(如JSP)添加的组件。必须能够以编程方式将组件添加到树中,并使它们呈现在层次结构中的适当位置。在渲染之前,必须能够重新排序树中的组件。这些操作确实要求添加到树中的任何组件具有在最近父NamingContainer组件范围内唯

来自jsf 1.2 revB mrel2规范:第65页底部

■ 应用程序必须能够在请求处理生命周期的任何时候(视图呈现期间除外)以编程方式修改组件树,并使系统按预期运行。例如,必须允许以下情况。在渲染期间修改视图可能会导致未定义的结果。在呈现之前,必须允许从树中删除模板系统(如JSP)添加的组件。必须能够以编程方式将组件添加到树中,并使它们呈现在层次结构中的适当位置。在渲染之前,必须能够重新排序树中的组件。这些操作确实要求添加到树中的任何组件具有在最近父NamingContainer组件范围内唯一的ID。rendersChildren属性的值按预期进行处理,可以为true或false

那么在adf 11g中如何实现这一点呢?我正在尝试实现一个应用程序范围的授权系统,其中组件基于用户角色可见/可编辑。但是,在写出响应之前,我找不到一种方法连接到adf来修改组件(例如RichInputText.setDisabled(true))。我试过使用PhaseListener和ViewHandler。这两项似乎都不允许我执行上述功能。那么是什么原因呢?我运气不好吗?我错过什么了吗

谢谢, 本

根据我在文档中的(有限)搜索,UIViewRoot对象是视图树的根节点。您可以使用它的getChildren方法来查找适当的UIComponents并进行修改。然而,我会建议另一种方式

如果将授权服务公开为bean,则可以直接将方法添加到标记中。例如

public class User {
...
Map<String, Boolean> allowedRoles;
...
public Map<String, Boolean> getAllowedRoles { return allowedRoles; }
}

<h:inputText value="#{SomethingImportant}" disabled="!#{User.allowedRoles['importantRole']}/>
公共类用户{
...
地图允许的角色;
...
公共映射getAllowedRoles{return allowedRoles;}
}

如果可以定位,它允许访问/修改树中的UI组件。使用findComponent()时需要提供客户端组件Id。唯一的问题是,它不允许您访问/控制初始页面加载(还原视图):-(
目前为止,我只能找到一种方法,即在jspx/jsp/jsff中指定EL。

您确实需要在表示端执行此操作。不要使用phaselistener来执行此操作,因为它不适用于此。明智地使用
rendered
属性。下面是一些如何使用它的基本示例:

<h:someComponent rendered="#{bean.booleanValue}" />
<h:someComponent rendered="#{bean.intValue > 10}" />
<h:someComponent rendered="#{bean.objectValue == null}" />
<h:someComponent rendered="#{bean.stringValue != 'someValue'}" />
<h:someComponent rendered="#{!empty bean.collectionValue}" />
<h:someComponent rendered="#{!bean.booleanValue && bean.intValue != 0}" />
<h:someComponent rendered="#{bean.stringValue == 'oneValue' || bean.stringValue == 'anotherValue'}" />


Drew,获取UIViewRoot没有任何帮助,因为正如我在评论中记录的那样,以下一项是正确的://相关的ui组件还不存在//相关的ui组件已经存在,但已经写入流中,我宁愿不必手动将禁用的属性添加到我的所有JSF中。首先,这很乏味另一件事,我们让用户设置角色。因此,我们的需求比解决方案允许的粒度要细得多。我们使用安全框架(acegi)开始,但我们的需求更深入。我几乎在编写我们自己的安全框架。我用aop做了必要的事情。这是一种黑客行为,但它是有效的。
<h:someComponent rendered="#{bean.booleanValue}" />
<h:someComponent rendered="#{bean.intValue > 10}" />
<h:someComponent rendered="#{bean.objectValue == null}" />
<h:someComponent rendered="#{bean.stringValue != 'someValue'}" />
<h:someComponent rendered="#{!empty bean.collectionValue}" />
<h:someComponent rendered="#{!bean.booleanValue && bean.intValue != 0}" />
<h:someComponent rendered="#{bean.stringValue == 'oneValue' || bean.stringValue == 'anotherValue'}" />