Подтвердить что ты не робот

Как заменить символы новой строки с помощью JSP и JSTL?

У меня есть список объектов bean, переданных на мою страницу JSP, и один из них - поле комментариев. Это поле может содержать новые строки, и я хочу заменить их точкой с запятой, используя JSTL, чтобы поле отображалось в текстовом вводе. Я нашел одно решение, но оно не очень элегантно. Я опубликую ниже как возможность.

4b9b3361

Ответ 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))}"