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


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

14 42

14 ответов:

Вот решение, которое я нашел. Это не кажется очень элегантным, хотя:

<%@ 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 reference Oracle (например, когда вы используете Tomcat, TomEE, JBoss и т. д. Вместо GlassFish, Payara, WildFly, WebSphere и т. д.), Вам нужно повторно избежать обратной косой черты.

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

Это похоже на принятый ответ (поскольку он использует Java для представления новой строки, а не EL), но здесь элемент используется для задания атрибута:

<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 />")}

Это решение более элегантно, чем ваше собственное решение, которое устанавливает атрибут 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 для логики функций.
ком.сайте StackOverflow.сеть.метка.функция.Тагутилы

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)}

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

${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", ";")}
Документация по этому материалу не очень хороша, и у меня не было возможности проверить ее.

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

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

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

<%@ 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 затем добавляет Это в качестве текста по умолчанию textarea. Чтобы очистить этот текст от фокуса, значение должно быть равно заголовку... но терпит неудачу, так как многие текстовые редакторы ставят \r\n вместо \n. таким образом, followownig избавится от нежелательного \r:

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