gpt4 book ai didi

jsf-2 - 从流中包含包含 JSF 标签/组件的动态内容

转载 作者:行者123 更新时间:2023-12-03 23:29:48 24 4
gpt4 key购买 nike

我正在开发一个应用程序,我想在其中包含来自流的动态 XHTML 内容。为了解决这个问题,我编写了一个 taghandler 扩展,它将动态 XHTML 内容转储到输出组件中

UIOutput htmlChild = (UIOutput) ctx.getFacesContext().getApplication().createComponent(UIOutput.COMPONENT_TYPE);
htmlChild.setValue(new String(outputStream.toByteArray(), "utf-8"));

这适用于没有 JSF 标签的 XHTML 内容。如果我的动态 XHTML 内容中有 JSF 标签,例如 <h:inputText value="#{bean.item}"/> ,然后将它们打印为纯文本。我希望它们呈现为输入字段。我怎样才能做到这一点?

最佳答案

本质上,您应该使用 <ui:include>结合定制 ResourceHandler 它能够以 URL 的风格返回资源.所以当有一个 OutputStream ,您真的应该将其写入(临时)文件,以便您可以获得 URL从它。

例如。

<ui:include src="/dynamic.xhtml" />


public class DynamicResourceHandler extends ResourceHandlerWrapper {

private ResourceHandler wrapped;

public DynamicResourceHandler(ResourceHandler wrapped) {
this.wrapped = wrapped;
}

@Override
public ViewResource createViewResource(FacesContext context, String resourceName) {
if (resourceName.equals("/dynamic.xhtml")) {
try {
File file = File.createTempFile("dynamic-", ".xhtml");

try (Writer writer = new FileWriter(file)) {
writer
.append("<ui:composition")
.append(" xmlns:ui='http://java.sun.com/jsf/facelets'")
.append(" xmlns:h='http://java.sun.com/jsf/html'")
.append(">")
.append("<p>Hello from a dynamic include!</p>")
.append("<p>The below should render as a real input field:</p>")
.append("<p><h:inputText /></p>")
.append("</ui:composition>");
}

final URL url = file.toURI().toURL();
return new ViewResource(){
@Override
public URL getURL() {
return url;
}
};
}
catch (IOException e) {
throw new FacesException(e);
}
}

return super.createViewResource(context, resourceName);
}

@Override
public ResourceHandler getWrapped() {
return wrapped;
}

}

(警告:基本启动示例!这会在每个请求上创建一个新的临时文件,您应该自己发明一个重用/缓存系统)

注册于 faces-config.xml如下
<application>
<resource-handler>com.example.DynamicResourceHandler</resource-handler>
</application>

注意:以上所有内容都是针对 JSF 2.2 的。对于偶然发现此答案的 JSF 2.0/2.1 用户,您应该使用 ResourceResolver相反,此答案中提供了一个示例: Obtaining Facelets templates/files from an external filesystem or database .重要提示: ResourceResolverdeprecated在 JSF 2.2 中支持 ResourceHandler#createViewResource() .

关于jsf-2 - 从流中包含包含 JSF 标签/组件的动态内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20268860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com