2009-07-14 42 views
0

从JSF 1.2 revB mrel2规格:第65页adf - 如何修改树中的组件?

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

那么如何在adf 11g中做到这一点?我试图实现一个应用程序范围的授权系统,其中组件根据用户角色可见/可编辑。但是,在写出响应之前,我无法找到挂钩adf以修改组件的方法(例如,RichInputText.setDisabled(true))。我已经尝试了PhaseListeners和ViewHandlers。这些似乎都不允许我执行上述功能。那么是什么给了?我运气不好吗?我错过了什么吗?

谢谢, 奔

public class AuthorizationPhaseListener implements PhaseListener { 
    ... 
    public PhaseId getPhaseId() { 
    return PhaseId.RENDER_RESPONSE; // I've also tried in the other phases including ALL_PHASES 
    } 
    public void beforePhase(PhaseEvent p1) { 
    // relevant ui components don't yet exist 
    ... 
    } 
    public void afterPhase(PhaseEvent p1) { 
    // relevant ui components exist, but have already been written to the stream, thus it's too late to modify them 
    ... 
    } 
    ... 
} 

public class MyCustomViewHandler extends ViewHandlerWrapper { 
    ... 
    @Override 
    public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException { 
    AuthorizationService as = (AuthorizationService)RiscsContext.getCurrentInstance().getBean("AuthorizationService"); 
    // relevant ui components don't yet exist 
    as.applyAuthorization(); 
    super.renderView(context, viewToRender); 
    // relevant ui components exist, but have already been written to the stream, thus it's too late to modify them 
    as.applyAuthorization(); 
    } 
    ... 
} 

回答

0

根据我的(有限的)通过该文档搜索时,UIViewRoot对象是视图树的根节点。您可以使用它的getChildren方法来查找相应的UIComponent并进行修改。但是,我会建议一种不同的方式。

如果您将Authorization服务公开为bean,则可以直接将这些方法添加到标记中。例如...

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

<h:inputText value="#{SomethingImportant}" disabled="!#{User.allowedRoles['importantRole']}/> 

甚至更​​好的是使用安全框架,这将更加简化这一点。

+0

德鲁, 越来越UIViewRoot也于事无补,因为我在评论中一个记录以下情况如下: //相关的UI组件尚不存在 //存在相关的UI组件,但已经写入流 我宁愿不必手动将禁用的属性添加到我所有的jsfs。首先,它很乏味。另一件事,我们让用户设置角色。所以,我们的要求比解决方案允许的要好得多。 – andersonbd1 2009-07-21 17:14:43

0

它允许访问/修改树中的UI组件,如果它是可定位的。您需要在使用findComponent()时提供客户端组件ID。唯一的问题是,它不会为初始页面加载(restore_view)提供访问权限。 :-( 对于这个目前只有一种方法,我可以找到指定EL在jspx/jsp/jsff中。

2

您确实需要在演示文稿处执行此操作。不要使用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'}" />