2013-05-10 90 views
1

我正在使用internet-explorer 8和jsf。 我做了我的自定義轉換器,在兩個空格之後添加「\ n」(打破太長的字符串)。轉換器正在被調用並返回正確的值(我用調試器檢查它),但不幸的是這個正確的值沒有顯示在頁面上。這是XHTML代碼: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> 

轉換器代碼:在faces-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一切。

回答

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;"