【发布时间】:2014-12-05 02:38:17
【问题描述】:
如何以编程方式检索单个 UIComponent 的 HTML 响应?
【问题讨论】:
-
“HTML 响应”是什么意思?你的意思是组件生成的标记?
-
jep 确切地说,发送到浏览器的最终 HTML
标签: jsf jakarta-ee jsf-2
如何以编程方式检索单个 UIComponent 的 HTML 响应?
【问题讨论】:
标签: jsf jakarta-ee jsf-2
我想你已经在一个 JSF 请求中了。
在这种情况下,您可以为当前的 FacesContext 设置一个自定义响应编写器,例如一个新的 com.sun.faces.renderkit.html_basic.HtmlResponseWriter,然后再渲染该组件:
public String createHtml(UIComponent component) {
FacesContext context = FacesContext.getCurrentInstance();
ResponseWriter oldWriter = context.getResponseWriter();
try {
StringWriter buffer = new StringWriter();
context.setResponseWriter(new HtmlResponseWriter(buffer, "text/html", "UTF-8"));
component.encodeAll(context);
context.getResponseWriter().close();
return buffer.toString();
} finally {
context.setResponseWriter(oldWriter);
}
}
请务必注意,您的组件或其子组件不得使用在页面上其他位置定义的任何变量,因为如果您仅呈现单个组件,则不会定义这些变量。
如果您还想初始化所有变量,您可以像对 AJAX 请求的响应(部分响应)一样打印 HTML:
public String createHtml(UIComponent component) {
FacesContext context = FacesContext.getCurrentInstance();
ResponseWriter oldWriter = context.getResponseWriter();
try {
StringWriter buffer = new StringWriter();
context.setResponseWriter(new HtmlResponseWriter(buffer, "text/html", "UTF-8"));
final VisitContext vc = VisitContext.createVisitContext(context,
Collections.singleton(component.getClientId()),
Collections.<VisitHint> emptySet());
context.getViewRoot().visitTree(vc, new VisitCallback() {
public VisitResult visit(final VisitContext ctx, final UIComponent comp) {
try {
comp.encodeAll(ctx.getFacesContext());
} catch (final IOException e) {
throw new IllegalStateException(e);
}
return VisitResult.COMPLETE;
}
});
context.getResponseWriter().close();
return buffer.toString();
} finally {
context.setResponseWriter(oldWriter);
}
}
【讨论】:
在某种程度上只需要简单的文本 Omnifaces outputFormat 可以将其输出保存到 var。
【讨论】: