Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
Java facelets组件的自动生成ID_Java_Jsf_Jstl_Facelets - Fatal编程技术网

Java facelets组件的自动生成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,我需

我们使用facelets创建一些自定义ajaxy组件。我们希望模仿默认组件的行为之一是,id是可选的,如果未传递,则生成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));
    }
}