【问题标题】:Is there a way to get the generated HTML as a String from a UIComponent object?有没有办法从 UIComponent 对象获取生成的 HTML 作为字符串?
【发布时间】:2013-06-06 14:48:07
【问题描述】:

我有一个UIComponent 对象。我想得到这个组件在运行时生成的 HTML 代码,以便我分析它。

有没有办法做到这一点?

我正在尝试使用 JsfUnit 来创建自动化测试。我可以从测试方法中获取 UICompoment 对象。但是,我找不到检查组件生成的 Html 的方法。

【问题讨论】:

  • 您要手动分析吗?如果是这样,那么只需使用例如 Firebug 从浏览器检查 html;如果不是,那么 - 你真正想做什么?
  • @dratewka,我改进了我的问题,以便您了解我想要达到的目标。

标签: jsf jsfunit


【解决方案1】:

就像 JSF 在幕后所做的一样:调用 UIComponent#encodeAll()。要捕获输出,请将响应写入器设置为 FacesContext#setResponseWriter() 的本地缓冲区。

例如(假设您正处于调用应用程序阶段;当处于渲染响应阶段时,这需要以不同的方式完成):

FacesContext context = FacesContext.getCurrentInstance();
ResponseWriter originalWriter = context.getResponseWriter();
StringWriter writer = new StringWriter();

try {
    context.setResponseWriter(context.getRenderKit().createResponseWriter(writer, "text/html", "UTF-8"));
    component.encodeAll(context);
} finally {
    if (originalWriter != null) {
        context.setResponseWriter(originalWriter);
    }
}

String output = writer.toString();
// ...

【讨论】:

  • 完美的 BalusC!我在测试环境中使用了这段代码,它可以工作!非常感谢。
  • 很好的答案,像往常一样,谢谢。您能否详细说明“当处于渲染响应阶段时,这需要以不同的方式完成”?
【解决方案2】:

BalusC 调用 UIComponent#encodeAll() 的解决方案通常有效,但在使用 utf-8 编码时遇到了 unicode 字符问题。在我修改当前上下文的响应编写器后,ajax 响应中的所有非 ascii 字符都被损坏了。

我没有在FacesContext.getCurrentInstance() 检索到的当前上下文上修改响应编写器,而是通过扩展FacesContextWrapper 在当前上下文上创建了一个包装器,因此原始上下文保持不变:

StringWriter writer = new StringWriter();
FacesContext context = new FacesContextWrapper() {
    private ResponseWriter internalWriter = getWrapped()
        .getRenderKit().createResponseWriter(writer, "text/html", "UTF-8");

    @Override
    public FacesContext getWrapped() {
        return FacesContext.getCurrentInstance();
    }

    @Override
    public ResponseWriter getResponseWriter() {
        return internalWriter;
    }

};

component.encodeAll(context);
String output = writer.toString();

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2019-10-21
    相关资源
    最近更新 更多