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

StackOverflow https://stackoverflow.com/questions/58054

Вопрос

У меня есть список объектов 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, '')}" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top