在我的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上下文中未知)的一般方法?
答案 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
。我将很快列出代码示例和解决方案之间的差异。
通过包含PrimeFaces组件套件(以及它的Apache Commons FileUpload依赖关系),可以使用Fieldset类以编程方式动态创建字段集。不好的是,PrimeFaces Fieldset组件依赖于PrimeFaces JavaScript文件,因此不会使用普通字段集,而是会得到一个字段集和一个JavaScript包含太多。
import org.primefaces.component.fieldset.Fieldset;
...
form.getChildren().add(new Fieldset());
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());
标准化和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");
。
如果有人知道如何做到这一点,请发布解决方案。