10

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

有没有办法做到这一点?

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

4

2 回答 2

11

只需像 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();
// ...
于 2013-06-08T17:11:41.193 回答
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();
于 2014-04-15T13:11:25.070 回答