2008-09-12 5 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 нажмите клавишу ВВОД между двойными кавычками.

$ {п: заменить (данные, 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, "; ")} 

КСТАТИ: ${fn:replace(data, "\n", ";")} не работает.

1

\ n не представляет символ новой строки в выражении EL.

Решение, которое устанавливает атрибут pageContext символу новой строки, а затем использует его с функцией JSTL fn:replace, действительно работает.

Однако я предпочитаю использовать Jakarta Струнный Tab Library, чтобы решить эту проблему:

<%@ 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', ';')} 

В случае, если вы используете реализацию Апача EL вместо эталонной реализации EL Oracle (то есть, когда вы используете Tomcat, TomEE, JBoss, и т.д. вместо GlassFish, скумбриевидный гидролик, WildFly, WebSphere, и т.д.), то вам нужно снова избежать обратную косую черту.

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

Для записи, я наткнулся на этот пост в то время как решение этой проблемы:

многострочный строки в JSTL добавляется в качестве заголовка атрибут текстового поля. Затем Javascript добавляет это как текст по умолчанию в текстовое поле. Чтобы очистить этот текст от фокуса, значение должно совпадать с заголовком ... но сбой, так как много текстовых редакторов помещают \ r \ n вместо \ n. Так follownig избавится от нежелательных \ г:

<% 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

Если то, что вам действительно нужно, а \ п символов вы можете использовать советы от here:

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

или

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

Это включает в себя новую строку в строковом литерале.

12

Это аналогично принятому ответ (потому что он использует Java для представления новой строки, а не Е.Л.), но здесь < с: набор/> элемент используется для установки атрибута:

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

следующий фрагмент кода работает, но вторая линия < с: установить/> элемент не может быть отступом (и может выглядеть уродливее):

<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))}" 
Смежные вопросы