2015-09-15 2 views
1

Я хотел бы реализовать пользовательский тэг jsf, который займет текст между тегом открытия и закрытия, выполнить операцию над ним и вернуть его. Например,Изменение содержимого тела пользовательского компонента

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

мне это нужно, чтобы принять содержание <l:lessInline> и передать его через МЕНЬШЕ компилятор, а затем сделать его между <style> тегами.

Я создал JSF 2.2 FacesComponent успешно визуализирует Hello World внутри <style> теги:

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

} 

Что я не могу понять, это как «читать», а затем заменить материал внутри тега. В настоящее время что-либо «внутри» тегов компонента остается на месте под визуализированным элементом. Спасибо за любую помощь!

ответ

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); 
+0

Работал как очарование, спасибо. – lmerry213

+0

Добро пожаловать. – BalusC

Смежные вопросы