JSP 및 JSTL을 사용하여 개행 문자를 어떻게 바꿀 수 있습니까?
문제
내 JSP 페이지에 전달된 Bean 개체 목록이 있는데 그 중 하나가 주석 필드입니다.이 필드에는 개행 문자가 포함될 수 있으며 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', ';')}
Oracle의 EL 참조 구현 대신 Apache의 EL 구현을 사용하는 경우(예:GlassFish, Payara, WildFly, WebSphere 등 대신 Tomcat, TomEE, JBoss 등을 사용하는 경우 백슬래시를 다시 이스케이프해야 합니다.
${fn:replace(data, '\\n', ';')}
이는 허용된 답변과 유사하지만(EL이 아닌 줄 바꿈을 표시하기 위해 Java를 사용하기 때문에) 여기서 <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 String Tab Library를 사용하는 것을 선호합니다.
<%@ 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, '')}" />