Just do the same what JSF does under the covers: invoke UIComponent#encodeAll()
. To capture the output, set the response writer to a local buffer by FacesContext#setResponseWriter()
.
E.g. (assuming that you're sitting in invoke application phase; when sitting in render response phase, this needs to be done differently):
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();
// ...