使用JSF以编程方式创建HTML表单fieldset标记

时间:2014-03-05 10:14:01

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

在我的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上下文中未知)的一般方法?

2 个答案:

答案 0 :(得分:3)

您可以尝试以下操作:

Theres是一个名为<f:verbatim>的组件,您可以在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);

答案 1 :(得分:3)

我找到了解决问题的三种方法。第一个是使用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 Tomahawk

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");

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