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