質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

JSPで、replaceAll の行で文字列の入れ替えができない。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,989
退会済みユーザー

退会済みユーザー

JSPでHTMLをcromで表示させようとしています。


ご質問は、
JSPのパラメータに、befor_description=おはよう\nございます。 と改行コードが入っているので、
HTMLで表示すると、そのまま、「おはよう\nございます。」と改行コードも表示されてしまいます。
そこで、\n を <br> に変換したいのですが、変換できていません。

下記に、importの宣言が足りないとか、1行目の宣言が間違っているとか、色々ご指摘をください。


<%@ page language='java' contentType="text/html;charset=UTF-8" session="true" %>
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>商品システム</title>
</head>
<body>
商品システム<br>
<hr />
<tr>
  <td><b>ご説明</b></td>
      <% String strBefor_description = request.getParameter("befor_description"); %>
      <% strBefor_description = strBefor_description.replaceAll("\n", "<br>"); %>                      ← ★ここで、変換ができていない。
  <td><%= strBefor_description %></td>
</tr>
</BODY>
</HTML>


PS.
      <% strBefor_description = strBefor_description.replaceAll("\\n", "<br>"); %>
のように \ を一つ追加しても、変換されません。

-------------------------------------------------------------------------
PS.
下記のように\n以外の文字は、正常に変換されます。
      <% strBefor_description = strBefor_description.replaceAll("あ", "<br>"); %>

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

0

こんにちわ。

ご提示のプログラムの問題というよりは、
パラメータbefor_descriptionの与え方に問題があるような気がします。

befor_description=おはよう\nございます

を、

befor_description=%e3%81%8a%e3%81%af%e3%82%88%e3%81%86%0a%e3%81%94%e3%81%96%e3%81%84%e3%81%be%e3%81%99

に変更してみてはどうでしょう?
(パラメータをUTF-8でURLエンコードしました)

ご存知でしたらすみません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/26 12:27

    cromに貼り付けた時に、\nが入っていてはいけないようですね。これが入っていると例外になる?(そんなことで例外になるとはおもえませんが、事実、例外になっています)。
    ご教授ありがとうございました。

    キャンセル

  • 2015/10/26 12:31

    こんにちわ。

    >行コードが\nでは、だめとういとでしょうか?
    >\nではなく、%0aを使うということでしょうか?

    そうですね、URLにパラメータをセットする際にはURLの規則に
    則った形で記述する必要がありますので、そういうことになります。

    >あっても、なくても、おなじように、

    ここの部分はどうしてその様な挙動になるのか、ちょっとわからないです。
    ごめんなさい。

    キャンセル

  • 2015/10/26 13:09

    いえいえ、こちらこそ、多々のお手数をおかけして申し訳ありませんでした。
    ありがとうございました。

    キャンセル

0

提示いただいているソースコードで正しく改行コード(LF)を<BR>タグに変換できるようです。
GETパラメータではなく、固定文字で検証するとreplaceAll()は正しく動作していることがわかります。

<%@ page language='java' contentType="text/html;charset=UTF-8" session="true" %>
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>商品システム</title>
</head>
<body>
商品システム<br>
<hr />
<tr>
  <td><b>ご説明</b></td>
      <%
          //String strBefor_description = request.getParameter("befor_description");
          String strBefor_description = "Hello world!\nhoge.";
          strBefor_description = strBefor_description.replaceAll("\n", "<br>");
      %>
  <td><%= strBefor_description %></td>
</tr>
</BODY>
</HTML>

GETパラメータで送信されている「改行コード」が本当に改行コードであるか確認すると解決しそうです。


以下、蛇足となりますがソースコードで気になった点を挙げさせていただきます。

  • <table>タグがない
<tr>タグはありますが、それを囲う<table>タグがありません。

  • befor_discriptionがGETパラメータとして指定されなかった場合、NullPointerExceptionが発生する
本JSPが呼び出される場合、befor_discriptionが指定されない場合、NullPointerExceptionが発生してエラーが面となってしまいます。変換処理の前にstrBefor_discriptionがNullでないかどうかチェックするとよいかと思います。


追記です。


以下のようなHTMLを準備し、テキストエリアに改行コード付きの文字を入力後に送信ボタンをクリックすることでどのようなURLになるか確認できます。
<form>タグのaction属性は実際のJSPへのパスに書き換えるとJSPと連動して検証できるかと思います。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSPサンプル</title>
</head>
<body>
<form method="GET" action="index.jsp">
<textarea name="befor_description"></textarea>
<input type="submit" value="送信" />
</form>
</body>
</html>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/26 11:38

    ご回答ありがとうございます。
    ソースの抜粋なので、タグが抜けたりしています。申し訳ありません。
    改行コードは、"\n"がJSPを呼ぶ時のURLに含まれていますが、ご指摘の通り、\nが、改行コードでない可能性を調査していみます(\tはタブですし、\rや他も試してみます)。そのままHTMLに\nと表示されるので。<br>に変換されずに。

    キャンセル

  • 2015/10/26 13:08

    PS.固定文字で、\nを指定しても変換されませんが、"お"などは、変換されます。

    キャンセル

  • 2015/10/26 13:54

    記載したJSPソースコードを適当なJSPとして保存して実行させて「Hello world!」と「hoge.」の間で改行されないでしょうか?


    javaのStringでは改行コード(LF)を"¥n"で表します。
    「¥n」という文字を表したい場合、「¥」マークをエスケープさせるため"¥¥n"と表します。
    "¥t"はタブ文字、"¥¥t"は「¥t」という文字となります。

    キャンセル

  • 2015/10/26 16:54

    はい、やってみます。ありがとうございます。

    キャンセル

0

URLパラメタに設定した日本語文字列が文字化けしてしまって
改行コードの「\n」が読み取れなくなっているんではないかなと思います。

URLパラメタを扱うやり方が色々とまとめてあるサイトを見つけたので、ご参考まで。
フォームのGETパラメータがjspで文字化けする問題

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/26 13:49 編集

    上記については、40行目と41行目で同一のstrBefor_descriptionを定義してしまっているのが原因ではないでしょうか?
    すみません、PS.読んでませんでした。
    このコメントは無視してください。

    キャンセル

  • 2015/10/26 14:19 編集

    Stringで直接JSP上に定義している方は純粋なJavaで考えていいと思います。
    Javaのみで試してみたところ、
    replaceAll() の第1引数は「"\\n"」ではなく「"\n"」でいけたので、
    そこが違うのではないでしょうか?

    ちなみに、例外の部分は、String strBefor_description を2回宣言しているからですね。

    キャンセル

  • 2015/10/26 16:53

    はい、申し訳ありません。2度読んでいるところは、完全なプログラムミスです。
    ちなみに、最初は、\nだったですが、変換できなかったので、\\nにしてみました。
    再度、\nにしてみます。
    お手数をおかけしました。ありがとうございました。

    キャンセル

check解決した方法

-7

どうやっても、同じソースのところで、再現できなくなったので、クローズさせていただきます。
原因追及したかったのですが...、残念です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る