是否有办法从uiccomponent对象获得生成的HTML作为字符串



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

有办法做到这一点吗?

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

就像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调用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();

相关内容

  • 没有找到相关文章

最新更新