- - PR -
includeディレクティブについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-12-14 10:36
はじめて書込みさせていただきます。
よろしくお願いいたします。 他のjspをインクルードするjspをEclipseで作成していたのですが、 インクルードディレクティブ <%@ include file="test.jsp"%>では、 「iは解決できません。 (in file: "test.jsp")」というエラーが出てしまいます。 インクルードアクション <jsp:include page="test.jsp" flush="true" />だとうまくいきました。 そもそもiとは何を指すのか分からずどうすればいいのか分からなかったのですが、 どのようにすれば静的インクルードを実現できるのでしょうか? ご教授いただければ、と思います。 | ||||
|
投稿日時: 2006-12-14 13:10
iは多分 test.jsp か includeした側のJSPの中で宣言されている変数名です。
JSPが最終的にJavaのソースコードに変換されて実行されるのは理解されていると 思いますが、 includeディレクティブの場合は、includeする側のjavaのソースの中にinclude対象の JSPのJavaソース変換結果がそのままベタで埋め込まれるので、 2つのJSPで変数名が重複していたりするとコンパイルエラーになってしまいます。 試しに問題のエラーになるJSPに実際にアクセスして Tomcat が変換した Javaソース (通常 test.jsp は test_jsp.java になります。明示して場所を指定していなければ Tomcat の work フォルダに出来ているはずです) を見てみるとどうなっているのか把握しやすいかもしれません。 | ||||
|
投稿日時: 2006-12-14 15:18
ひろ@ya様
ありがとうございます。 実はTomcatではなくてWebsphereApplicationServerを使っているのですが、 このご説明でたいへん分かりやすく理解できました。 Javaソースを確認してみたいと思います。 さて、インクルードに関して新たな疑問が出てきたのですが、 test1.jsp(<jsp:include page="test2.jsp" flush="true" />を記述するファイル)、 test2.jsp(test1.jspの中に埋め込むファイル)として、 test1.jspのhtmlソースを見ると ------------------------------------------- <html><head>ヘッダ</head> <body> <html><head>ヘッダ</head> <body>ボディ</body></html> </body></html> ------------------------------------------- このようにタグが重複してしまいます。 一応ブラウザでは問題なく見えるようですが、 こういう場合test2.jspは ボディ部のみを記述するべきなのでしょうか。 ただ、そうする場合test1、test2の両ファイルともに スタイルシートを効かせたいときに <meta http-equiv="Content-Style-Type" content="text/css" /> <link rel=stylesheet type="text/css" href="theme/master.css" /> こういったヘッダ部に記述するタグをどうすればいいのでしょうか…? またこの場合、静的インクルード(includeディレクティブ)と 動的インクルード(includeアクション)に違いがあったりするのでしょうか? 一応自分なりに検索をかけたりしてみましたが、 探し方が悪いのか良い資料が見つからず…。 連投で申し訳ありませんが教えていただけるとありがたいです。 よろしくお願いいたします。 (追記:test2.jspのヘッダを削除すると「タグのロケーションが正しくありません」と Eclipseに叱られてしまいました…う〜ん。) [ メッセージ編集済み 編集者: Oz 編集日時 2006-12-14 15:23 ] | ||||
|
投稿日時: 2006-12-14 15:53
最近のブラウザは頭がいいというか融通が効くのでよきに計らってくれますが、もちろんちゃんとしたHTMLが出力されるようにすべきです。
インクルードは「共通する部分を」外から取り込むものであって、ページ全体を取るのは使い方がおかしいです。 例えば新たにtest3.jspを作ってボディだけ追い出して、test2.jspもボディは記述せずに、その両方からtest3.jspをインクルードするとか。 本当にボディが全部共通なのかと、ちょっと疑問ですが。 ふたつのインクルードの違いは、検索すればすぐに分かるでしょう。 [ メッセージ編集済み 編集者: mio 編集日時 2006-12-14 15:54 ] | ||||
|
投稿日時: 2006-12-14 16:46
mio様、ありがとうございます。
静的インクルード・動的インクルードの根本の違い(読み込み処理のタイミングなど)については 理解しているつもりです。 上の質問のように、includeディレクティブで上手くいかずincludeアクションだと成功したような違いが あるのかが分かりにくかったものでして…。 >例えば新たにtest3.jspを作ってボディだけ追い出して、test2.jspもボディは記述せずに、その両方からtest3.jspをインクルードするとか。 Eclipseの「ロケーションが正しくありません」という警告は無視してもよいということでしょうか? 使用例が悪かったようで、 menu.jsp (頻繁に加減する目次的なリンクを記述、 全ページに目次を表示させたいが毎回全ページに追加・削除を行うと大変なので このjspで一括編集できるようにする) の中に<jsp:include page="<%=bean.getPage()%>" flush="true" />などと記述し、 ページの遷移はサーブレットやビーンによってcontents1.jsp、contents2.jspなどを読み込む場合、 contents1、contents2などにはボディ内部のみを記述したjspを使用すればよい、ということでしょうか。 その場合、Eclipseの警告は無視しても構わない、ということでしょうか? 理解が足りず恐縮です…。 | ||||
|
投稿日時: 2006-12-14 17:14
Eclipseの警告は無視していいと思います。
単体では不完全な JSP ですよ、って警告ではないでしょうか。 単体で呼ばれることがなく、include されることを意図したファイルであれば拡張子を .jsp.inc とか変更してしまえば警告はでなくなるかもしれません。 たぶん同時に補完も効かなくなりますが。 | ||||
|
投稿日時: 2006-12-14 20:08
includeディレクティブはJSPの場合とHTMLの様な生テキストの場合で動作が違うことに なっているので、拡張子を変えてしまうと警告も出ないかわりに、単なる生テキスト としてインクルードされてしまうかもしれません。 [ メッセージ編集済み 編集者: ひろ@ya 編集日時 2006-12-14 20:41 ] | ||||
|
投稿日時: 2006-12-14 20:27
includeでJSPファイル以外だとエンコーディングが指定できないにもかかわらず、
強制的にInputStreamReaderで処理されるので、文字化けが起こりやすいです。 (Tomcatだと) 私もjsファイルをサーバサイドでインクルードする必要があって、 非常に困った覚えがあります。 その時はファイルがUTF-8だったのですが、Javaの起動オプションに -Dfile.encoding=UTF-8を付けてOKでした。 ただ、これだとEclipseのコンソールで化けるので、 Eclipse自体も同じオプションを付けて起動して回避しました。 |