javaの初心者です。フレームワークはSpringを使って開発しています。
Javaで改行の入った文字列をjspファイルでJava scriptでメッセージボックスに表示させたいのですが、「1行目\n2行目」と表示されてしまい、改行されません。
ソースを抜粋したものは、下記のとおりです。


コントローラ
@RequestMapping(value = "/pm", params = "nyuko", produces = "text/plain;charset=UTF-8", method = RequestMethod.POST)
public String nyuko(@ModelAttribute FormNyuko formNyuko, Model model, HttpServletRequest request,
HttpServletResponse response, HttpSession session, Map<String, String> map)
throws ServletException, IOException {

   String CRLF = "\n";
   ErrorMessage = "1行目" + CRLF
ErrorMessage = ErrorMessage + "2行目"
   map.put("ErrorMessage", ErrorMessage);
}


JSPファイル

<SCRIPT type="text/javascript">
function onLoad(){
if("${ErrorMessage}" != ""){
alert("${ErrorMessage}");
}
}
</script>

</head>
<body onLoad="onLoad()" bgcolor="#FFDAB9">


うまく改行させる方法を、どなかたご教授いただければ幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

No.1です。



一応、

<html>
<head>
<title>alear test</title>
<SCRIPT type="text/javascript">
function onLoad(){
if ("1行目\n2行目" != "") {
alert("1行目\n2行目");
}
}
</script>
</head>
<body onLoad="onLoad()" bgcolor="#FFDAB9">
body
</body>
</html>

という内容のhtmlファイルを作って、ブラウザで表示してみて大丈夫だったので、回答してしまったのですが、よく考えてみると、サーブレット側で
String CRLF = "\n";
とすると、function onLoadの部分が、

function onLoad(){
if ("1行目
2行目" != "") {
alert("1行目
2行目");
}
}

となってしまうかも知れませんね。
これは、改行がほんとの改行になってしまって、改行文字(\n)の指定にならなくなってしまうからです。

なので、
String CRLF = "\\n";
としてみてください。
これで、"\n"が"\n"のまま出力されます。
    • good
    • 0
この回答へのお礼

度重なる質問に対して、丁寧にご回答いただき、ありがとうございます!
とてもよく理解でき、解決することができました。
3日程職場でずっと悩んでいたので、助かりました。
ありがとうございました!

お礼日時:2017/04/19 14:09

これって、まさかと思うけど、"\n"を全角のバックスラッシュにしていませんか?



ここで質問するために、あえて全角のバックスラッシュ(\)にしているだけならいいのですが、本番では半角のバックスラッシュ(\:環境によっては半角の円記号になる)にしないと改行されませんよ。
String CRLF = "\n";
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
実は、半角のバックスラッシュにもしてみました("\n"となりました)が、
それだと、メッセージボックスすら出ないのです。
ちなみに、エラーの画面にもなりません。
やはり、本来は"\n"だとすると、Java script内にバグがあるのでしょうか。

お礼日時:2017/04/19 11:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QMap Hash = new Hash

Map<String, String> Hash = new HashMap<String, String>();

このjavaのハッシュマップの初期化の方法を教えてください。

Aベストアンサー

2回目?
1回目と同じですよ。

Map<String, String> Hash = new HashMap<String, String>(); //1回目
Hash = new HashMap<String, String>(); //2回目
Hash = new HashMap<String, String>(); //3回目
Hash = new HashMap<String, String>(); //4回目
//このあとも好きなだけどうぞ・・

なにか質問の意味を勘違いしてますかね?

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

QString a = "a"; と String b = new String ("b"); の違い

String a = "a";
String b = new String ("b");

お伺いしたいのですが、
b は String のインスタンスを作ってると思いますが、
a はどんなことをしてるのでしょうか?

Aベストアンサー

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その初期化に使った無名のStringインスタンスの3つがメモリ上に存在することになります。
if(b1 != b2) System.out.print("b1とは違うインスタンス");
の結果でもわかると思います。

したがって、
String b = new String ("b"); というのは、Integerに例えると
Integer i = new Integer(new Integer(1)); という処理を
していることになり、ひとつ無駄なインスタンス生成となります。

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その...続きを読む

Q と window.onload

JavaScriptのonload処理についての質問です。

現在Java、JSP、JavaScript等でWebアプリケーションを作成しているのですが、
bodyタグ中のonloadに記載したファンクションが時々呼ばれないという問題が起きています。
(こんな感じで記述
 <body onload="hoge();hogehoge();">
 hogehoge()がたまに呼ばれないことがある・・・)

これを回避する方法として、「onload処理をwindow.onloadに記述すれば良い」
という話を聞きました。
(こんな感じで記述
 <script>
   window.onload = function(){ hoge();hogehoge(); }
 </script>


「bodyタグ中に記述するとたまに呼ばれないものが、window.onloadに記述すると確実に呼ばれる」
なんてことがあるのでしょうか?
「2つめのファンクションが呼ばれない」という現象がたまにしか発生しないので、
window.onloadに記述する方法で確実に呼ばれるようになったという保証がとれません。
知識として知っている方がいれば是非教えていただきたいです。
よろしくお願い致します。

※ブラウザはIEを使用
 バージョンは IE → 6.0
     JavaScript → 1.1 です。
 

JavaScriptのonload処理についての質問です。

現在Java、JSP、JavaScript等でWebアプリケーションを作成しているのですが、
bodyタグ中のonloadに記載したファンクションが時々呼ばれないという問題が起きています。
(こんな感じで記述
 <body onload="hoge();hogehoge();">
 hogehoge()がたまに呼ばれないことがある・・・)

これを回避する方法として、「onload処理をwindow.onloadに記述すれば良い」
という話を聞きました。
(こんな感じで記述
 <script>
   window.onload = function(...続きを読む

Aベストアンサー

><body onload="hoge();hogehoge();">
hoge()に処理を中断するような内容が書かれている可能性もあります。
そうなると、なにをやってもhogehoge()は実行されません。

また、タグにメソッドを書き込むのはHTMLとJavascriptの分離という
視点でもあまりスマートではありません。
意識してwindow.onloadを使った方がきれいなソースになります


人気Q&Aランキング

おすすめ情報