有没有办法从UIComponent对象获取生成的HTML作为字符串?

时间:2013-06-06 14:48:08

标签: jsf jsfunit

我有一个UIComponent个对象。我想在运行时获取此组件生成的HTML代码,以便我可以对其进行分析。

有没有办法实现这个目标?

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

2 个答案:

答案 0 :(得分:6)

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

E.g。 (假设您正处于调用应用阶段;当处于渲染响应阶段时,需要以不同方式完成):

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();
// ...

答案 1 :(得分:1)

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();