2008-09-12 113 views
40

我有一個bean對象的列表傳入我的JSP頁面,其中一個是註釋字段。該字段可能包含換行符,並且我想使用JSTL用分號替換它們,以便字段可以顯示在文本輸入中。我找到了一個解決方案,但它不是很優雅。我將在下面作爲可能性發布。如何使用JSP和JSTL替換換行符?

回答

51

這是我找到的解決方案。但它看起來並不很優雅:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<% pageContext.setAttribute("newLineChar", "\n"); %> 

${fn:replace(item.comments, newLineChar, "; ")} 
+0

雖然這是我自己的答案,但我接受了這一點,因爲它最簡單,而且我發現它確實可行。 – parkerfath 2009-02-12 00:06:43

+0

這是不必要的。只是越過反斜槓:http://stackoverflow.com/questions/58054/how-can-i-replace-newline-characters-using-jsp-and-jstl/1690942#1690942 – BalusC 2010-02-11 11:37:26

+2

我試着只是逃避反斜槓,它沒有也不行。我上面列出的設置pageContext屬性的方法仍然是我可以使其工作的唯一方法。儘管如BalusC所說,用一些簡單的方法你可能會有更好的運氣。可能很好,在這裏有所有的選擇。 – parkerfath 2010-02-19 19:44:41

2

你應該可以用fn:replace來做到這一點。

您需要的標記庫導入您的JSP與以下聲明:

 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

然後你可以用下面的表達式用分號來代替換行的出現在$ {數據}:

 
${fn:replace(data, "\n", ";")} 

該文檔對這個東西並不是很好,我沒有機會測試它。

+0

我很確定這是我第一次嘗試,而且沒有奏效。但是,我沒有時間重新測試它,所以我可能是錯的。 – parkerfath 2008-09-12 22:52:40

0

您可以編寫自己的JSP函數來進行替換。

這意味着你最終的東西,如:

<%@ taglib prefix="ns" uri="..." %> 
... 
${ns:replace(data)} 

ns是一個命名空間前綴定義和replace是你的JSP的功能。

這些函數很容易實現(它們只是一個靜態方法),儘管目前我似乎無法找到寫這些函數的好參考。

4

您可以創建自己的JSP功能。 http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

這大致是你需要做的。

創建一個標籤庫描述符文件
/src/META-INF/sf.tld

<?xml version="1.0" encoding="UTF-8"?> 
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> 
    <tlib-version>1.0</tlib-version> 
    <short-name>sf</short-name> 
    <uri>http://www.stackoverflow.com</uri> 
    <function> 
    <name>clean</name> 
    <function-class>com.stackoverflow.web.tag.function.TagUtils</function-class> 
    <function-signature> 
     java.lang.String clean(java.lang.String) 
    </function-signature> 
    </function> 
</taglib> 

創建功能邏輯的Java類。
com.stackoverflow.web.tag.function.TagUtils

package com.stackoverflow.web.tag.function; 

import javax.servlet.jsp.tagext.TagSupport; 

public class TagUtils extends TagSupport { 
    public static String clean(String comment) { 
    return comment.replaceAll("\n", "; "); 
    } 
} 

在你的JSP您可以訪問你的函數以下列方式。

<%@ taglib prefix="sf" uri="http://www.stackoverflow.com"%> 
${sf:clean(item.comments)} 
0

在設置var的值中,在雙引號之間按下ENTER鍵。

$ {FN:更換(數據,newLineChar, 「」)}

8

該解決方案是比你自己的解決方案,它是設置的pageContext屬性直接更優雅。您應該使用<c:set>標籤此:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 

<c:set var="newLine" value="\n"/> 
${fn:replace(data, newLine, "; ")} 

BTW:${fn:replace(data, "\n", ";")}不起作用。

1

\ n不代表EL表達式中的換行符。

pageContext屬性設置爲換行符並將其與JSTL的fn:replace函數一起使用的解決方案確實有效。

不過,我更喜歡使用雅加達字符串標籤庫來解決這個問題:

<%@ taglib prefix="str" uri="http://jakarta.apache.org/taglibs/string-1.1" %> 
... 
<str:replace var="result" replace="~n" with=";" newlineToken="~n"> 
Text containing newlines 
</str:replace> 
... 

你可以使用任何你想要的newlineToken; 「〜n」不太可能出現在我正在替換的文本中,所以對我來說這是一個合理的選擇。

4

這並沒有爲我工作:

<c:set var="newline" value="\n"/> 
${fn:replace(data, newLine, "; ")} 

這並不:

<% pageContext.setAttribute("newLineChar", "\n"); %> 
${fn:replace(item.comments, newLineChar, "; ")} 
19

只需使用fn:replace()功能通過;更換\n

${fn:replace(data, '\n', ';')} 

在你使用Apache的EL實現,而不是甲骨文的EL參考實現(即,當你使用Tomcat,TomEE時,JBoss等,而不是GlassFish中,似鯖水狼牙魚,WildFly中,WebSphere等)的情況下,則您需要重新轉義反斜槓。

${fn:replace(data, '\\n', ';')} 
0

爲了記錄在案,我碰到這個職位後來雖然解決這個問題:

在JSTL多行字符串被添加爲textarea的title屬性。然後,Javascript將此添加爲textarea的默認文本。爲了清楚地理解這個文本,這個值需要等於標題......但是失敗的是許多文本編輯器放棄\ r \ n而不是\ n。所以follownig將擺脫不必要的\的r:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" /> 
1

更容易:

<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace> 
3

如果你真正需要的是一個\ n符號您可以從here使用建議:

${fn:replace(text, " 
", "<br/>")} 

<c:set var="nl" value=" 
" /><%-- this is a new line --%> 

這包括字符串文字中的新行。

12

(因爲它是使用Java來表示換行,而不是EL),但這裏的< c本類似於接受的答案:設置/ >元件用於設置屬性:

<c:set var="newline" value="<%= \"\n\" %>" /> 
${fn:replace(myAddress, newline, "<br />")} 

的下面的代碼段也適用,但< C的第二行:set/>元件不能被縮進(和可能看起來不美觀):

<c:set var="newline" value=" 
" /><!--this line can't be indented --> 
    ${fn:replace(myAddress, newline, "<br />")} 
0

這是JSP EL一個有效的解決方案:

"${fn:split(string1, Character.valueOf(10))}"