2008-09-12 8 views
40

私はJSPページに渡されるBeanオブジェクトのリストを持っており、その1つはコメント・フィールドです。このフィールドに改行が含まれていて、JSTLを使ってセミコロンに置き換えて、フィールドをテキスト入力に表示できるようにします。私は1つの解決策を見つけましたが、それほどエレガントではありません。私は可能性として以下に投稿します。JSPとJSTLを使用して改行文字を置き換えるにはどうすればよいですか?

答えて

51

ここに私が見つけた解決策があります。しかし、それほどエレガントではありません。

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

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

これは私自身の答えですが、私はこれを受け入れています。なぜなら、これは最も単純で実際に動作することがわかっているからです。 – parkerfath

+0

これは不要です。ちょうどバックスラッシュをエスケープ:http://stackoverflow.com/questions/58054/how-can-i-replace-newline-characters-using-jsp-and-jstl/1690942#1690942 – BalusC

+2

私はバックスラッシュをエスケープしようとしましたが、どちらもうまくいきません。 pageContext属性を設定する上記の私の方法は、私がそれを働かせる唯一の方法です。 BalusCが述べているように、あなたはより簡単な方法のいくつかに恵まれているかもしれません。おそらくすべてのオプションがここにあるのは良いですね。 – parkerfath

2

fn:replaceを使用して実行できるはずです。

あなたは次の宣言を使用してJSPにタグライブラリをインポートする必要があります。

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

次にあなたがセミコロンで$ {データ}内の改行の発生を交換するには、次の式を使用することができます。

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

ドキュメントはこのような点では素晴らしいものではなく、テストする機会はありませんでした。

+0

私はこれが私が最初に試したことであり、それはうまくいかないと確信しています。私は本当にそれを再テストする時間はありませんが、私は間違っているかもしれません。 – parkerfath

+0

この回答は私のものとほとんど同じですが(下記参照)、追加のpageContext.setAttribute()はありません。この余分なメソッドを呼び出す必要があるように私が設定していない設定があるかどうか知っていますか? – parkerfath

+0

このエラーが発生しました: org.apache.jasper.JasperException:/WEB-INF/jsp/team/alarms.jsp(11,2) "$ {fn:replace(blob、" \ n "、"; ") } "は無効な式が含まれています:javax.servlet.jsp.el.E​​LException:[" INTEGER_LITERAL "、などの予想される\ n" "が見つかりました。 – parkerfath

0

置き換えを行う独自のJSP関数を書くことができます。

これは、あなたのようなもので終わるだろう意味:

nsは、ユーザーが定義した名前空間接頭辞であると replaceがあなたのJSP機能である
<%@ taglib prefix="ns" uri="..." %> 
... 
${ns:replace(data)} 

これらの関数は実装が非常に簡単です(静的メソッドです)。ただし、現時点でこれらの関数を記述するための参考にはなりません。

4

独自の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あなたのJSPで

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

次の方法であなたの機能にアクセスすることができます。

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

は$ {sf:clean(item .comments)} ...私はこのソリューションを使用しました。スクリプトレットよりもきれいに見えます – danb

+0

ありがとうdanb、私は私のポストを更新しました – Geekygecko

+0

@danb:あなたは私の答えを忘れましたか?http://stackoverflow.com/questions/58054/how- can-i-replace-newline-characters-using-jsp-and-jstl/1690942#1690942 – BalusC

0

varを設定しているときに、値を二重引用符で囲んでEnterキーを押します。

$ {FN:置き換え(データ、newLineCharは、 ";")}

8

このソリューションでは、PageContextの属性を直接設定された独自のソリューションよりもエレガントです。ところで

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

:あなたはこのため<c:set>タグを使用する必要があります${fn:replace(data, "\n", ";")}は動作しません。

+0

これは、樹脂3では私にとってはうまくいきませんが、pageContextスクリプトレットを使用した最上位の答えはありません。 – pimlottc

+0

バグは正常に動作するはずですので – Bousch

+1

@pimlottc 担当者'$ {fn:replace(data、 '\ n'、 '\ n'、 '\ n'、 '') ; ')} '。それ以外の場合、例えば、値の後に二重引用符があるため、 '' – mvdb

1

\ nはEL式の改行文字を表しません。

改行文字にpageContext属性を設定し、それをJSTLのfn:replace関数で使用するソリューションが動作します。

はしかし、私はこの問題を解決するために、ジャカルタの文字列]タブライブラリを使用することを好む:

<%@ 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"は私が置き換えを行っているテキストに現れそうにないので、私にとっては合理的な選択でした。

4

これは私のために動作しません:

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

これが行われます。

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

これは上記の答えです。たぶん、回答を繰り返すのではなく、すでに与えられた答えをコメントしたり、アップアップしたりするほうがよいでしょう。 – parkerfath

+0

私は同じ問題を抱えていますが、この解決済みの鉱山、ありがとう、なぜ最初のものがうまくいかないのですか? –

+0

@parkerfathこの回答の上位ランクのバージョンは、c:setまたはインラインバージョンが頻繁に黙って失敗することを警告しません。 – LateralFractal

19

ちょうど;\nを置き換えるためにfn:replace()関数を使用します。その後、(あなたがTomcatの、TomEEは、JBossなどの代わりに、GlassFishの、ペーシュ・カショーロ、WildFlyは、WebSphereなどを使用しているとき、すなわち)あなたがApacheのEL実装の代わりに、OracleのELのリファレンス実装を使用している場合は

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

、バックスラッシュを再エスケープする必要があります。レコードの

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

この問題に取り組んでいる間、私はこの記事に出くわした:

をJSTLで複数行の文字列をテキストエリアのタイトル属性として追加されます。 Javascriptはこれをテキストエリアのデフォルトテキストとして追加します。このテキストをクリアするには、タイトルと同じ値にする必要がありますが、多くのテキストエディタは\ nの代わりに\ r \ nを置くので失敗します。だから、follownig不要な\ rを取り除くます:

<% pageContext.setAttribute("newLineChar", "\r"); %> 
<c:set var="textAreaDefault" value="${fn:replace(textAreaDefault, newLineChar, '')}" /> 
1

より簡単に:あなたが本当に必要なものならば

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

あなたはhereからアドバイスを使用することができます\ n個のシンボルである:

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

または

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

これには、文字列リテラルの新しい行が含まれます。

12

これは(むしろELよりも改行を表現するためにJavaを使用しているため)受け入れ答えに似ていますが、ここで< C:セット/ >要素は、属性を設定するために使用されます。

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

次のスニペットも動作しますが、< Cの2行目は:

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

素晴らしい!私は理由を知らないが、受け入れられた答えがうまくいかない。なぜなのかご存知ですか? –

+0

最初のスニペットは私のために働いた。ありがとう! –

0

これはJSP ELのための有効なソリューションです::/ >要素をインデントすることができません(と醜い場合があります)を設定

"${fn:split(string1, Character.valueOf(10))}" 
関連する問題