gpt4 book ai didi

java - JSF 自定义组件 : How to get attribute of

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:00 29 4
gpt4 key购买 nike

我已经为 jsf 编写了一个自定义组件。渲染器扩展了 com.sun.faces.renderkit.html_basic.ListboxRenderer。我的组件在“javax.faces.SelectMany”-Family 中。

jsf-page 中的代码如下所示:

<tb:myMenu id="testId" value="#{valueForm.someValue}">  
<f:selectItem />
<f:selectItems value="#{dao.getSomething()}" />
<f:ajax render=":myTestForm:myId"/>
</tb:myMenu>

如何在我的渲染器中获取渲染属性的值?我只需要值,不应该向我的组件写入任何内容(就像 RenderKitUtils 类那样)

我目前的解决方案如下所示。它有效,但我对此并不满意。

if (component instanceof ClientBehaviorHolder) {
Map<String, List<ClientBehavior>> behaviors = ((ClientBehaviorHolder)component).getClientBehaviors();
if (behaviors != null && behaviors.keySet().contains("valueChange")) {
for (ClientBehavior cb: behaviors.get("valueChange")) {
if (cb instanceof AjaxBehavior) {
System.out.println("AJAX: " + ((AjaxBehavior) cb).getRender());
}
}
}
}

最佳答案

你到底有什么不开心的地方?太冗长?嗯,确实没有 JSF API 或 Mojarra impl 提供的实用方法将其隐藏起来。它就停在这里。你得自己写。

至少,在您的代码段中,第二个 if 检查 null 是多余的,因为它 never返回 null。此外,同一行的behaviors.keySet().contains(key)也可以简化为behaviors.containsKey(key)。考虑到它永远不会返回 null,您也可以立即获取行为列表并对其进行 nullcheck。

最后用一些实用方法隐藏它。

public static Set<String> getClientBehaviorRenderIds(UIComponent component, String behaviorName) {
Set<String> clientBehaviorRenderIds = new HashSet<String>();

if (component instanceof ClientBehaviorHolder) {
List<ClientBehavior> clientBehaviors = ((ClientBehaviorHolder) component).getClientBehaviors().get(behaviorName);

if (clientBehaviors != null) {
for (ClientBehavior clientBehavior : clientBehaviors) {
if (clientBehavior instanceof AjaxBehavior) {
clientBehaviorRenderIds.addAll(((AjaxBehavior) clientBehavior).getRender());
}
}
}
}

return clientBehaviorRenderIds;
}

以便您可以按如下方式使用它:

Set<String> renderIds = getClientBehaviorRenderIds(component, "valueChange");
// ...

如果令人不安的是嵌套检查,您还可以进行逆向检查(这也是 Mojarra 通常的编写方式;深度 if 嵌套确实是一种糟糕的做法):

public static Set<String> getClientBehaviorRenderIds(UIComponent component, String behaviorName) {
Set<String> clientBehaviorRenderIds = new HashSet<String>();

if (!(component instanceof ClientBehaviorHolder)) {
return clientBehaviorRenderIds;
}

List<ClientBehavior> clientBehaviors = ((ClientBehaviorHolder) component).getClientBehaviors().get(behaviorName);

if (clientBehaviors == null) {
return clientBehaviorRenderIds;
}

for (ClientBehavior clientBehavior : clientBehaviors) {
if (clientBehavior instanceof AjaxBehavior) {
clientBehaviorRenderIds.addAll(((AjaxBehavior) clientBehavior).getRender());
}
}

return clientBehaviorRenderIds;
}

关于java - JSF 自定义组件 : How to get attribute of <f:ajax/>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7268217/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com