更改自定义组件的正文内容

时间:2015-09-15 22:32:00

标签: jsf custom-component

我想实现一个自定义的jsf标记,它将在开始和结束标记之间获取文本,对其执行操作并返回它。例如,

<l:lessInline>
.list-results {
    .search-result {
        margin-top: 10px;
        margin-bottom: 10px;
    }
}
</l:lessInline>

我需要这个来获取<l:lessInline>的内容并将其传递给LESS编译器,然后在<style>个标记之间进行渲染。

我创建了一个JSF 2.2 FacesComponent,它在<style>标记内成功呈现了Hello World:

@FacesComponent (value = "inlineLess")
public class InlineLessComponent extends UIComponentBase
{

    @Override
    public String getFamily ()
    {
        return "inlineLessComponent";
    }

    @Override
    public void encodeBegin (final FacesContext context) throws IOException
    {
        final ResponseWriter writer = context.getResponseWriter ();
        writer.startElement ("style", this);
        writer.write ("Hello World");
        writer.endElement ("style");
        writer.flush ();
    }

}

我无法弄清楚如何阅读&#39;然后替换标签内的东西。目前,任何内部&#39;内部&#39;组件标签留在渲染元素下方。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

encodeChildren()期间渲染正文。只需用下面的本地缓冲区临时替换响应编写器,这样就可以捕获渲染的输出,而无需通过它写入。

ResponseWriter writer = context.getResponseWriter();
StringWriter output = new StringWriter();
context.setResponseWriter(writer.cloneWithWriter(output));

try {
    super.encodeChildren(context);
}
finally {
    context.setResponseWriter(writer);
}

String body = output.toString();
// ... Manipulate it here if necessary.
writer.write(manipulatedBody);