【问题标题】:JSF - Get HTML of UIComponent programmaticallyJSF - 以编程方式获取 UIComponent 的 HTML
【发布时间】:2014-12-05 02:38:17
【问题描述】:

如何以编程方式检索单个 UIComponent 的 HTML 响应?

【问题讨论】:

  • “HTML 响应”是什么意思?你的意思是组件生成的标记?
  • jep 确切地说,发送到浏览器的最终 HTML

标签: jsf jakarta-ee jsf-2


【解决方案1】:

我想你已经在一个 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);
    }

}

【讨论】:

    【解决方案2】:

    在某种程度上只需要简单的文本 Omnifaces outputFormat 可以将其输出保存到 var

    http://showcase.omnifaces.org/components/outputFormat

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      相关资源
      最近更新 更多