2013-11-01 6 views
3

h 스 메시지를 'span'요소 대신 'p'html 요소로 렌더링하도록 사용자 지정 메시지 렌더러를 만들고 싶습니다. 다음 메시지 태그와 관련이 있습니다.렌더링 JSF h : 스팬 대신 p 요소가있는 메시지

나는 아래 코드로 작성했지만 빈 'p'요소 만 렌더링합니다. 원본 구성 요소의 모든 특성과 텍스트를 복사하여 작성자에게 보내야한다고 가정합니다. 그러나, 나는 어디에서 모든 것을 발견 해야할지 모르며 그것은 단지 태그를 대체하기위한 많은 일로 보인다.

'p'요소로 렌더링 된 h : message 태그를 얻는 더 좋은 방법이 있습니까?

코드 :

@FacesRenderer(componentFamily = "javax.faces.Message", rendererType = "javax.faces.Message") 
public class FoutmeldingRenderer extends Renderer { 

    @Override 
    public void encodeEnd(final FacesContext context, final UIComponent component) throws IOException { 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.startElement("p", component); 
     writer.endElement("p"); 

    } 
} 

답변

4

그것은 정확히 "많은 일"입니다. 기본적으로 표준 JSF 메시지 렌더러에서 확장하여 encodeEnd() 메서드를 약 200 행으로 구성한 다음 을 "p"으로 바꾸려면 2 줄만 편집하면됩니다. 1 분 안에 할 수 있습니다.

그래, 나는 이것이 평범하지 않은 접근이라는 데 동의한다.

당신은 반드시 더 쉽지 않은 다음과 같은 대안을 고려할 수 있지만, 적어도 더 깨끗한 : 모든

  1. 첫째,이 특정한 경우에 <span> 대신 <p>을 사용하는 semantic 값이 무엇 ? 솔직하게 말해서, 나는이 의미 론적 가치를 보지 못하고있다. 따라서, 나는 그것을 단지 <span>으로 유지하는 것이 좋습니다. 유일한 기능 요구 사항이 으로 표시되면 <p>과 같은처럼 표시 한 다음 일부 CSS 만 넣으십시오. 예 :

    .error-msg { 
        display: block; 
        margin: 1em 0; 
    } 
    

  2. 다음과 같이 부모 폼이 ID formId가 가정을 직접 EL에서 특정 클라이언트 ID에 대한 모든 메시지를 얻을 수 있습니다

    #{facesContext.getMessageList('formId:firstName')} 
    
    그래서

    , 요약을 인쇄를 첫 번째 메시지의 세부 사항은 다음과 같습니다.

    <c:set var="message" value="#{facesContext.getMessageList('formId:firstName')[0]}" /> 
    <p title="#{message.detail}">#{message.summary}</p> 
    

    언제나 숨길 수 있습니다. 멀리 그래서 같은 사용자 정의 태그 파일에 :

    <my:message id="firstNameErrorMsg" for="firstname" class="error-msg" /> 
    

  3. 사용 OmniFaces <o:messages>. var 속성이 지정되면 <ui:repeat>처럼 사용할 수 있습니다.

    <o:messages for="firstNameErrorMsg" var="message"> 
        <p title="#{message.detail}">#{message.summary}</p> 
    </o:messages> 
    
+0

안녕 BalusC, 당신이 제공 한 내 문제에 대한 해결책의 가능성에 대한 감사합니다. 나는 당신이 건네 준 첫 번째 것을 사용했는데, 그 이유는 주로 가장 빠르고 구현하기가 쉽기 때문입니다. 다양한 스타일 시트의 거대한 크기와 내가 함께 작업하도록 강요 당했고 소유자가 내 변경을 허용하지 않으므로 CSS 옵션을 사용할 수 없었습니다. 또한 OmniFaces보다 다른 jsf 태그 라이브러리를 이미 사용하고 있으므로 OmniFaces 옵션도 사용할 수 없습니다. 감사합니다. Kees –

+0

OmniFaces는 구성 요소 라이브러리가 아니라 유틸리티 라이브러리이며 모든 구성 요소 라이브러리와 호환됩니다. PrimeFaces, RichFaces, ICEFaces 등과 함께 사용할 수 있습니다. – BalusC