У меня есть список объектов bean, переданных на мою страницу JSP, и один из них - поле комментариев. Это поле может содержать новые строки, и я хочу заменить их точкой с запятой, используя JSTL, чтобы поле отображалось в текстовом вводе. Я нашел одно решение, но оно не очень элегантно. Я опубликую ниже как возможность.
Как заменить символы новой строки с помощью JSP и JSTL?
Ответ 1
Вот решение, которое я нашел. Это не кажется очень изящным, хотя:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newLineChar", "\n"); %>
${fn:replace(item.comments, newLineChar, "; ")}
Ответ 2
Просто используйте fn:replace()
функцию для замены \n
на ;
.
${fn:replace(data, '\n', ';')}
Если вы используете реализацию Apache EL вместо эталонной реализации Oracle EL (т.е. когда вы используете Tomcat, TomEE, JBoss и т.д. вместо GlassFish, Payara, WildFly, WebSphere и т.д.), вам нужно повторно -открыть обратную косую черту.
${fn:replace(data, '\\n', ';')}
Ответ 3
Это похоже на принятый ответ (потому что он использует Java для представления новой строки, а не EL), но здесь < c: set/ > элемент используется для установки атрибута:
<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 />")}
Ответ 4
Это решение более элегантно, чем ваше собственное решение, которое напрямую устанавливает атрибут 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", ";")}
НЕ работает.
Ответ 5
Вы можете создать свою собственную функцию 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)}
Ответ 6
Это не работает для меня:
<c:set var="newline" value="\n"/>
${fn:replace(data, newLine, "; ")}
Это делает:
<% pageContext.setAttribute("newLineChar", "\n"); %>
${fn:replace(item.comments, newLineChar, "; ")}
Ответ 7
Вы можете сделать это с помощью fn: replace.
Вам нужно будет импортировать библиотеку тегов в ваш JSP со следующим объявлением:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
Затем вы можете использовать следующее выражение для замены вхождения строк в строке ${data} точкой с запятой:
${fn:replace(data, "\n", ";")}
Документация не очень хороша в этом материале, и у меня не было возможности проверить ее.
Ответ 8
Если вам действительно нужен символ \n, вы можете использовать совет здесь:
${fn:replace(text, "
", "<br/>")}
или
<c:set var="nl" value="
" /><%-- this is a new line --%>
Это включает в себя новую строку в строковом литерале.
Ответ 9
\n не представляет символ новой строки в выражении EL.
Решение, которое устанавливает атрибут pageContext
для символа новой строки, а затем использует его с функцией JSTL fn:replace
, работает.
Однако я предпочитаю использовать библиотеку вкладок Jakarta String для решения этой проблемы:
<%@ 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" вряд ли появится в тексте, в котором я делаю замену, поэтому для меня это был разумный выбор.
Ответ 10
Легче:
<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>
Ответ 11
Вы можете написать свою собственную функцию JSP для замены.
Это означает, что у вас будет что-то вроде:
<%@ taglib prefix="ns" uri="..." %>
...
${ns:replace(data)}
Где ns
- префикс пространства имен, который вы определяете, и replace
- ваша функция JSP.
Эти функции довольно легко реализовать (они всего лишь статические методы), хотя я не могу найти хорошую ссылку для написания этих данных на данный момент.
Ответ 12
В значении при настройке var нажмите клавишу ВВОД между двойными кавычками.
${fn: replace (data, newLineChar, ";" )}
Ответ 13
Для записи я столкнулся с этим сообщением при решении этой проблемы:
Многострочная строка в JSTL добавляется как атрибут title текстового поля. Затем Javascript добавляет это как текст по умолчанию в текстовое поле. Чтобы очистить этот текст от фокуса, значение должно совпадать с заголовком... но сбой, так как много текстовых редакторов помещают \r\n вместо\n. Поэтому follownig избавится от нежелательных \r:
<% pageContext.setAttribute("newLineChar", "\r"); %>
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
Ответ 14
Это правильное решение для JSP EL:
"${fn:split(string1, Character.valueOf(10))}"