Java facelets组件的自动生成ID
我们使用facelets创建一些自定义ajaxy组件。我们希望模仿默认组件的行为之一是,id是可选的,如果未传递,则生成id。我已经可以这样做了:Java facelets组件的自动生成ID,java,jsf,jstl,facelets,Java,Jsf,Jstl,Facelets,我们使用facelets创建一些自定义ajaxy组件。我们希望模仿默认组件的行为之一是,id是可选的,如果未传递,则生成id。我已经可以这样做了: <ui:composition ...> <div class="myComponent" id="#{jsfSupport.generateId(id)}"> ... </div> </ui:composition> 问题是,如果我在组件的javascript代码中需要该id,我需
<ui:composition ...>
<div class="myComponent" id="#{jsfSupport.generateId(id)}">
...
</div>
</ui:composition>
问题是,如果我在组件的javascript代码中需要该id,我需要再次检索它。所以我想我可以做到以下几点:
<ui:composition ...>
<c:set var="id" value="#{jsfSupport.generateId(id)}" />
<div class="myComponent" id="#{id}">
...
</div>
<script type="text/javascript">
document.getElementById('#{id}');
</script>
</ui:composition>
...
document.getElementById('#{id}');
但这不起作用。这个id会被重新生成,我会得到两个不同的id。
关于什么是实现这一点的理想方法有什么想法吗?
在Facelets中意味着别名,而不是JSP中的赋值。因此,{id}
的每次使用都会转换为对{jsfSupport.generateId}
的单独调用,这会导致您描述的问题
您可以编写自己版本的
标记,该标记只对传递的表达式求值一次,并保存返回值:
public class SetOnceHandler extends TagHandler
{
private TagAttribute var;
private TagAttribute value;
public SetOnceHandler(TagConfig cfg)
{
super(cfg);
value = getRequiredAttribute("value");
var = getRequiredAttribute("var");
}
public void apply(FaceletContext ctx, UIComponent parent)
{
ctx.setAttribute(var.getValue(ctx), value.getObject(ctx));
}
}
这很好用!谢谢我很惊讶没有现成的东西…我也面临着完全相同的问题。您能解释一下,要使这个处理程序就位,需要做些什么吗?我能问一下您如何从包含/使用上述ajax组件的页面访问生成的“id”吗?例如:如果您必须重新加载自定义ajax组件,您将如何做到这一点?@bchetty您不能。如果需要重新提交,则需要传入Id。自动生成的Id仅在与组件没有外部交互的情况下使用。感谢您的快速响应!:)
public class SetOnceHandler extends TagHandler
{
private TagAttribute var;
private TagAttribute value;
public SetOnceHandler(TagConfig cfg)
{
super(cfg);
value = getRequiredAttribute("value");
var = getRequiredAttribute("var");
}
public void apply(FaceletContext ctx, UIComponent parent)
{
ctx.setAttribute(var.getValue(ctx), value.getObject(ctx));
}
}