2014-01-15 4 views
1

일부 간단한 텍스트 처리를 수행하는 정적 메서드 format이있는 Java 클래스 Formatter이 있다고 가정합니다. 내가 지금처럼 Formatter#format 방법으로 구성 요소 내에서 텍스트를 전달합니다 구성 요소 쓰고 싶습니다 인수를 위해서JSF : 사용자 지정 구성 요소에서 구성 요소 본문의 텍스트에 액세스

<test:format> 
    Hello, #{user.name}! 
</test:format> 

를 가정하자 포맷터는 다음과 같다 (실제로 그것은 마크 다운 라이브러리입니다) :

public class Formatter { 
    public static format(String s) { return s.toUpperCase(); } 
} 

위의 태그의 렌더링 결과를 HELLO, DANIEL!으로하고 싶습니다.

가능합니까? 이와 같이 처리 할 구성 요소 아래에서 렌더링 된 텍스트 컨텐츠를 얻으려면 어떻게해야합니까?

답변

0

나는이 일을 처리 할 방법을 알아 냈습니다. 그러나 나는 그것이 진흙이라고 의심합니다. 코드 :

@FacesComponent("MyComponent") 
public class MyComponent 
    extends UIComponentBase 
    implements NamingContainer { 

    @Override public String getFamily() { 
    return UINamingContainer.COMPONENT_FAMILY; 
    } 

    @Override public boolean getRendersChildren() { return true; } 

    @Override public void encodeChildren(FacesContext fc) throws IOException { 
    StringWriter writer = new StringWriter(); 
    ResponseWriter rw = fc.getResponseWriter(); 

    // create the response writer 
    ResponseWriter replacement = rw.cloneWithWriter(writer); 

    // this tag wrapping step is necessary for the MyFaces ResponseWriter to 
    // work correctly 
    replacement.startDocument(); 
    replacement.startElement("div", this); 

    // mask the response writer temporarily  
    fc.setResponseWriter(replacement); 

    // perform the render to get the text in our string 
    super.encodeChildren(fc); 

    // unmask the response writer 
    fc.setResponseWriter(rw); 

    // finish the wrapping calls 
    replacement.endElement("div"); 
    replacement.endDocument(); 

    // this strips the rendered <div> tag wrapper from the generated text. 
    final String renderedText = writer.toString() 
      .substring(5, writer.toString().length()-6); 

    // process the text and send it out 
    rw.append(Formatter.format(renderedText)); 
    } 
} 

이 모든 힌트는 ResponseWriter#cloneWithWriter 방법에 있습니다. 그러나 거기에 StringWriter를 두드려서 옮길 예정이라면 MyFaces가 폭발 할 것입니다. 최소한 텍스트를 렌더링 할 안전한 컨텍스트를 만들기 위해 배치 태그를 만들어야합니다. 내 포맷터는 래핑 요소를 기대하지 않으므로 이후에는 전체 부분 문자열로 제거합니다. 그 외에도 getRendersChildren을 구현하는 것으로 충분합니다. 그런 다음이를 taglib.xml과 연결합니다.