【问题标题】:Programmatically create HTML form fieldset tag with JSF使用 JSF 以编程方式创建 HTML 表单字段集标记
【发布时间】:2014-04-07 07:55:32
【问题描述】:

在我的 Java 代码中,我想以编程方式创建一个 <fieldset> 标记,我可以在我的 JSF 表单中使用它。

我的表单设置如下:

Application app = FacesContext.getCurrentInstance().getApplication();

HtmlForm form = (HtmlForm) app.createComponent(HtmlForm.COMPONENT_TYPE);
form.setStyleClass("pure-form pure-form-stacked");

如您所见,我使用 HtmlForm.COMPONENT_TYPE 作为 JSF UI 组件的标识符,但我没有找到字段集的标识符,所以我尝试了:

UIComponent fieldset = app.createComponent("fieldset");
form.getChildren().add(fieldset);

不幸的是,这不起作用,所以我必须想出另一个解决方案。你有什么想法吗?

是否有一种通用的方法来创建 HTML 标签(在 JSF 上下文中是未知的)?

【问题讨论】:

    标签: html forms jakarta-ee jsf-2 form-generator


    【解决方案1】:

    我找到了三个解决问题的方法。第一个是使用PrimeFaces,第二个是使用MyFaces Tomahawk,第三个是使用带有字符串输入的JSF Verbatim UI component。我将很快列出代码示例以及解决方案之间的差异。

    1 PrimeFaces

    通过包含 PrimeFaces 组件套件(以及它的 Apache Commons FileUpload 依赖项),您可以使用 Fieldset 类以编程方式即时创建字段集。不好的是,PrimeFaces Fieldset 组件依赖于一个 PrimeFaces JavaScript 文件,所以不是普通的字段集,而是一个字段集和一个 JavaScript 包含,这太过分了。

    import org.primefaces.component.fieldset.Fieldset;
    
    ...
    
    form.getChildren().add(new Fieldset());
    

    2 MyFaces 战斧

    UI 组件集 Tomahawk 还附带一个 Fieldset 组件,可用于以编程方式创建 HTML 字段集。如果将使用 Tomahawk 的 Fieldset,那么将得到一个简单而漂亮的 fieldset 标签。这里的坏处是 Tomahawk 是 MyFaces 的扩展,而 MyFaces 本身是一个完整的 JavaServer Faces 实现,不应与标准 JSF 一起使用。

    import org.apache.myfaces.custom.fieldset.Fieldset
    
    ...
    
    form.getChildren().add(new Fieldset());
    

    3 JSF Verbatim UI 组件

    标准化和 hacky 的方式是使用 JSF Verbatim UI 组件。在逐字组件中,您可以放置​​所需的任何 HTML。通过这个小技巧,我们可以创建一个逐字标记:

    UIOutput fieldset = new UIOutput();
    fieldset.setRendererType("javax.faces.Text");
    fieldset.getAttributes().put("escape", false);
    fieldset.setValue("<fieldset></fieldset>");
    

    上面显示的代码呈现了一个字段集 HTML 元素,但是因为它是一个字符串,并且字符串中的标签是封闭的,所以您不能以编程方式将任何内容附加到该标签,所以这不起作用:

    form.getChildren().add(fieldset);
    

    要生成可用于嵌套元素的 HTML 标记,每个开始和结束标记都必须放在自己的 Varbatim 组件中,这使得该解决方案的文本非常繁重:

    UIOutput fieldsetStart = new UIOutput();
    fieldsetStart.setRendererType("javax.faces.Text");
    fieldsetStart.getAttributes().put("escape", false);
    fieldsetStart.setValue("<fieldset>");
    
    UIOutput fieldsetClose = new UIOutput();
    fieldsetClose.setRendererType("javax.faces.Text");
    fieldsetClose.getAttributes().put("escape", false);
    fieldsetClose.setValue("</fieldset>");
    
    HtmlInputText inputText = (HtmlInputText) app.createComponent(HtmlInputText.COMPONENT_TYPE);
    
    form.getChildren().add(fieldsetStart);
    form.getChildren().add(inputText);
    form.getChildren().add(fieldsetClose);
    

    结论:

    所展示的解决方案都不是真正优雅的。 PrimeFaces 和 MyFaces 有很大的依赖关系,标准的 JEE 方式需要大量的编写工作。我曾希望找到一个很好的解决方案来生成未知/自定义的 HTML 元素,例如:document.createElement("fieldset");

    如果有人知道如何做到这一点,请发布解决方案。

    【讨论】:

      【解决方案2】:

      您可以尝试以下方法:

      有一个名为 &lt;f:verbatim&gt; 的组件,您可以像这样在 xhtml 中使用它:

      <f:verbatim escape="false">
          <fieldset id="blah"></fieldset>
      </f:verbatim>
      

      要以编程方式实现这一点,您可以像这样添加这个组件:

      String fieldsetHTMLText ="<fieldset id=\"blah\"></fieldset>";
      
      UIOutput verbatim = new UIOutput();
      verbatim.setRendererType("javax.faces.Text");
      verbatim.getAttributes().put("escape", false);
      verbatim.setValue(fieldsetHTMLText);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-06
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 2016-03-19
        • 1970-01-01
        • 2011-07-06
        • 2012-09-18
        相关资源
        最近更新 更多