JSP ページに渡された Bean オブジェクトのリストがあり、そのうちの 1 つがコメント フィールドです。このフィールドには改行が含まれている可能性があり、テキスト入力でフィールドを表示できるように、JSTL を使用して改行をセミコロンに置き換えたいと考えています。解決策を 1 つ見つけましたが、あまりエレガントではありません。可能性として以下に掲載します。
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', ';')}
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", ";")}
動作しません。
本当に必要なのが\n記号である場合は、ここからのアドバイスを使用できます。
${fn:replace(text, "
", "<br/>")}
また
<c:set var="nl" value="
" /><%-- this is a new line --%>
これには、文字列リテラルの改行が含まれます。
独自の 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)}
これは私にはうまくいきません:
<c:set var="newline" value="\n"/>
${fn:replace(data, newLine, "; ")}
これは次のことを行います。
<% pageContext.setAttribute("newLineChar", "\n"); %>
${fn:replace(item.comments, newLineChar, "; ")}
\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」は、置換を行っているテキストに表示される可能性が低いため、私にとっては妥当な選択でした。
fn:replace でできるはずです。
次の宣言を使用して、タグ ライブラリを JSP にインポートする必要があります。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
次に、次の式を使用して、${data} 内の改行をセミコロンに置き換えることができます。
${fn:replace(data, "\n", ";")}
ドキュメントはこのようなものではなく、テストする機会がありませんでした.
これは、JSP EL の有効なソリューションです。
"${fn:split(string1, Character.valueOf(10))}"
もっと簡単に:
<str:replace var="your_Var_replaced" replace="\n" with="Your ney caracter" newlineToken="\n">${your_Var_to_replaced}</str:replace>
In the value while setting the var, press ENTER between the double quotes.
${fn:replace(data, newLineChar, ";")}
記録のために、この問題に取り組んでいるときにこの投稿に出くわしました。
JSTL の複数行の文字列は、テキストエリアのタイトル属性として追加されます。Javascript は、これをテキストエリアのデフォルト テキストとして追加します。フォーカス時にこのテキストをクリアするには、値をタイトルと等しくする必要があります...しかし、多くのテキスト エディタが \n の代わりに \r\n を配置しているため失敗します。したがって、次のようにすると、不要な \r が削除されます。
<% pageContext.setAttribute("newLineChar", "\r"); %>
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" />
独自の JSP 関数を作成して、置換を行うことができます。
これは、次のような結果になることを意味します。
<%@ taglib prefix="ns" uri="..." %>
...
${ns:replace(data)}
ns
は定義する名前空間接頭辞で、はreplace
JSP 関数です。
これらの関数は非常に簡単に実装できます (静的メソッドにすぎません) が、現時点ではこれらを記述するための適切なリファレンスが見つからないようです。