2013-05-10 4 views
1

인터넷 익스플로러 8 및 jsf를 사용하고 있습니다. 두 개의 공백 뒤에 "\ n"을 추가하는 사용자 지정 변환기를 만들었습니다 (너무 긴 문자열을 나누기 위해). 변환기가 호출되고 올바른 값 (디버거로 확인)을 반환하지만 불행히도이 올바른 값은 페이지에 표시되지 않습니다.JSF 변환기가 변환 된 값을 표시하지 않습니다.

<h:commandLink action="#{bean.sort(property)}" 
        style="margin-left:0.01px;margin-right:0.01px;white-space:nowrap;"> 
        <h:outputText value="#{header}"> 
         <f:converter converterId="headerConverter" /> 
        </h:outputText> 
</h:commandLink> 

컨버터 코드 : 얼굴-config.xml에 모든 노력을 사전에 덕분에 물론

public class HeaderConverter implements Converter { 

public HeaderConverter() { 
} 

public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    /* Converter tylko do wyświetlania */ 
    throw new RuntimeException("HeaderConverter - display only"); 
} 

public String getAsString(FacesContext context, UIComponent component, Object value) { 
    if (value instanceof String) { 

     int i = 0; 
     int spaceIter = 0; 
     String header = (String) value; 
     String afterChange = header; 

     for (char c : header.toCharArray()) { 
      if (Character.isWhitespace(c)) { 
       spaceIter++; 
       if(spaceIter == 2) { 
        afterChange = "" + header.substring(0, i) + "\n" + header.substring(i+1); 
       } 
      } 
      i++; 
     } 
     return afterChange; 
    } 
    return null; 
} 

} 내가 vonfigured 한 모든이 XHTML 코드입니다.

답변

2

JSF는이 질문의 맥락에서 HTML 코드 생성기입니다. HTML에서는 개행 문자가 <br> 요소로 표시되고 \n 문자로 표시되지 않습니다. 당신은 웹 브라우저에서 페이지를 마우스 오른쪽 단추로 및 소스보기을 할 경우

, 당신은 \n 실제로 생성 된 HTML 출력으로 그것을 만들었지 만, 단순히 HTML 프레젠테이션/포맷에 참여하지 않는 것을 볼 수 있습니다.

  1. 사용 <br> 대신 \n :

    그래서, 당신은 두 가지 옵션이 있습니다.

    ... + "<br/>" + ... 
    

    는 당신은 탈출 XML을 해제해야합니다.

    <h:outputText ... escape="false" /> 
    

    사용자가 제어하는 ​​입력을 다시 표시 할 때 잠재적 인 XSS 공격 구멍에주의하십시오!

  2. 웹 브라우저에게 \n을 (기본값으로) 태그가 아닌 서식의 일부로 해석하도록 지시하십시오. CSS white-space: pre을 사용할 수 있습니다.

    style="white-space: pre;" 
    
관련 문제