Is there a way to get the generated HTML as a String from a UIComponent object?

后端 未结 2 1802
野趣味
野趣味 2021-01-05 05:07

I have a UIComponent object. I would like to get the HTML code generated by this component at runtime so I can analyze it.

Is there a way to achieve this?

I

相关标签:
2条回答
  • 2021-01-05 05:39

    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();
    // ...
    
    0 讨论(0)
  • 2021-01-05 05:41

    Solution by BalusC to invoke UIComponent#encodeAll()generally works, but I had a problem with unicode characters when using utf-8 encoding. All non-ascii characters in ajax response were damaged after I modified current context's response writer.

    Instead of modifying response writer on current context retrieved by FacesContext.getCurrentInstance(), I created a wrapper over current context by extending FacesContextWrapper, so that original context is left unmodified:

    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();
    
    0 讨论(0)
提交回复
热议问题