用JSF编程创建HTML表单字段集标记



在我的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上下文中是未知的)?

您可以尝试以下操作:

有一个名为<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);

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

1 PrimeFaces

通过包含PrimeFaces组件套件(以及它的Apache Commons FileUpload依赖项),可以使用Fieldset类以编程方式动态创建字段集。不好的是,PrimeFaces字段集组件依赖于PrimeFacesJavaScript文件,因此将获得一个字段集和一个JavaScript include,而不是普通的字段集,这太多了。

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

2 MyFaces战斧

UI组件集Tomahawk还附带了一个Fieldset组件,该组件可用于以编程方式创建HTML字段集。如果战斧的场集会被使用,那么你会得到一个简单好看的场集标签。糟糕的是Tomahawk是MyFaces的扩展,而MyFaces本身是一个完整的JavaServerFaces实现,不应该与标准JSF一起使用。

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

3 JSF Verbatim UI组件

标准化和技巧化的方法是使用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");

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

相关内容

  • 没有找到相关文章

最新更新