JSP および JSTL を使用して改行文字を置換するにはどうすればよいですか?

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

質問

JSP ページに渡される Bean オブジェクトのリストがあり、そのうちの 1 つがコメント フィールドです。このフィールドには改行が含まれている可能性があるため、フィールドをテキスト入力で表示できるように、JSTL を使用して改行をセミコロンに置き換えたいと考えています。解決策を 1 つ見つけましたが、あまり洗練されたものではありません。可能性として以下に書いておきます。

役に立ちましたか?

解決

これが私が見つけた解決策です。ただし、あまりエレガントではないようです。

<%@ 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/> 要素の 2 行目はインデントできません (見た目が醜くなる可能性があります)。

    <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, '')}" />
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top