Pergunta

Eu tenho uma lista de objetos bean passados ​​para minha página JSP e um deles é um campo de comentário.Este campo pode conter novas linhas e desejo substituí-las por ponto e vírgula usando JSTL, para que o campo possa ser exibido em uma entrada de texto.Encontrei uma solução, mas não é muito elegante.Vou postar abaixo como uma possibilidade.

Foi útil?

Solução

Aqui está uma solução que encontrei.Mas não parece muito elegante:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<% pageContext.setAttribute("newLineChar", "\n"); %>

${fn:replace(item.comments, newLineChar, "; ")}

Outras dicas

Apenas use fn:replace() função para substituir \n por ;.

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

Caso você esteja usando a implementação EL do Apache em vez da implementação de referência EL da Oracle (ou seja,quando você estiver usando Tomcat, TomEE, JBoss, etc em vez de GlassFish, Payara, WildFly, WebSphere, etc), será necessário escapar novamente da barra invertida.

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

Isso é semelhante à resposta aceita (porque está usando Java para representar a nova linha em vez de EL), mas aqui o elemento <c:set/> é usado para definir o atributo:

<c:set var="newline" value="<%= \"\n\" %>" />
${fn:replace(myAddress, newline, "<br />")}

O trecho a seguir também funciona, mas a segunda linha do elemento <c:set/> não pode ser recuada (e pode parecer mais feia):

    <c:set var="newline" value="
" /><!--this line can't be indented -->
    ${fn:replace(myAddress, newline, "<br />")}

Esta solução é mais elegante do que a sua própria solução, que define o atributo pagecontext diretamente.Você deve usar o <c:set> tag para isso:

<%@ 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, "; ")}

POR FALAR NISSO: ${fn:replace(data, "\n", ";")} não funciona.

Isso não funciona para mim:

<c:set var="newline" value="\n"/>
${fn:replace(data, newLine, "; ")}

Isso faz:

<% pageContext.setAttribute("newLineChar", "\n"); %> 
${fn:replace(item.comments, newLineChar, "; ")}

Você poderia criar sua própria função JSP.http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags6.html

Isso é aproximadamente o que você precisa fazer.

Crie um arquivo descritor de biblioteca de tags
/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>

Crie uma classe Java para a lógica das funções.
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", "; ");
  }
}

No seu JSP você pode acessar sua função da seguinte maneira.

<%@ taglib prefix="sf" uri="http://www.stackoverflow.com"%>
${sf:clean(item.comments)}

Se o que você realmente precisa é de um símbolo , você pode seguir o conselho de aqui:

${fn:replace(text, "
", "<br/>")}

ou

<c:set var="nl" value="
" /><%-- this is a new line --%>

Isso inclui a nova linha em sua string literal.

Você deve conseguir fazer isso com fn:replace.

Você precisará importar a biblioteca de tags para seu JSP com a seguinte declaração:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

Então você pode usar a seguinte expressão para substituir ocorrências de nova linha em ${data} por ponto e vírgula:

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

A documentação não é boa nesse assunto e não tive a oportunidade de testá-la.

não representa o caractere de nova linha em uma expressão EL.

A solução que estabelece um pageContext atributo para o caractere de nova linha e, em seguida, usa-o com JSTL's fn:replace função funciona.

No entanto, prefiro usar a Jakarta String Tab Library para resolver este problema:

<%@ 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>
...

Você pode usar o que quiser para o newlineToken;É improvável que "~n" apareça no texto em que estou substituindo, então foi uma escolha razoável para mim.

Mais facilmente:

<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>  

Esta é uma solução válida para o JSP EL:

"${fn:split(string1, Character.valueOf(10))}"

Você poderia escrever sua própria função JSP para fazer a substituição.

Isso significa que você acabaria com algo como:

<%@ taglib prefix="ns" uri="..." %>
...
${ns:replace(data)}

Onde ns é um prefixo de namespace que você define e replace é a sua função JSP.

Essas funções são muito fáceis de implementar (são apenas um método estático), embora eu não consiga encontrar uma boa referência para escrevê-las no momento.

No valor ao definir o var, pressione ENTER entre aspas duplas.

${fn:replace(dados, newLineChar, ";")}

Para que conste, me deparei com esta postagem enquanto resolvia esse problema:

Uma string multilinha em JSTL é adicionada como o atributo title de uma textarea.Javascript então adiciona isso como o texto padrão da área de texto.Para limpar este texto em foco o valor precisa ser igual ao título...mas falha porque muitos editores de texto colocam em vez de .Assim, o seguinte irá se livrar do indesejado:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top