- ベストアンサー
JSPでimportを行う時の、変数の使用有無
初めまして、etsuki_genと申します。 こちらの掲示板ではいつもお世話になっております。 初の質問です。よろしくお願いいたします。 サーブレットとJSPを使用して現在仕事をしております。 サーブレットのコード内でjspファイルを指定し、 JSPにて出力したいと考えております。 詳細は以下に記述させていただきました。 【詳細】 ■現在のJSPでのimport方法↓ <%@include file="aaa.jsp"%> 上記の"aaa.jsp"の部分を変数に変更し、 以下のように記述したい。 ■変更したいimport方法↓ サーブレット側 a.putData("javaData","aaa.jsp"); JSP側 <% String strData=a.getData("javaData");%> <%@include file=strData%> 変数を指定して、インクルードをしようとすると 「引用符が必要です」とエラー表記されてしまいます。 また、 <%@include file="<%=strData%>"%> と記述しても、「<%=strData%>ファイルが見当たりません」と言われてしまいます。 JSPでimportを行う時に、importするファイル名を 変数で使用する方法はないものでしょうか? 過去ログにも見当たらなかった為、質問させていただきました。 よろしければご回答お願いいたします。 また、何かございましたらご指摘の程よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず最初に#2の参考URL読みました? それから#3の変換されたサーブレットの中身を見ました? #3の補足を見る限りではサイトを見た、中身を見たということが感じられないのですが…。 小言は置いておいて エラー内容からさっするに… たんにJSPの記述ミスだと思われるのですが… 自分が試したJSPだと「引用符がどうの」というメッセージは表示されませんでした。 <body>タグの中に書いています。 で「動的にインクルード先を変えること」についてですが、結論から言うとできました。 インクルードするJSP名をセットしたHashMapを 「リクエストに格納」 してたのですが、これだとJSPではリクエストから格納されたHashMapを取得できませんでした。 (nullが返ってくる) 次に 「セッションに格納」 してみました。これだとJSPでセッションから格納されたHashMapを取得できました。 なんでリクエストじゃだめなのかが不明なので、気持ち悪いですが、とりあえず、サンプルを載せておきます。 (もしかしたらお作法的によい方法じゃないかもしれません。) サーブレット HashMap map = new HashMap(); map.put("jspname","include2.jsp"); req.getSession().setAttribute("map",map); JSP <% HashMap map = (HashMap)(request.getSession()).getAttribute("map"); String jspname = ""; if(map != null){ jspname = (String)map.get("jspname"); } %> <jsp:include page="<%=jspname%>" flush="true" />
その他の回答 (3)
- pcbeginner
- ベストアンサー率46% (261/560)
調べてはみたのですが… どうも分からず… エラーはページコンパイルで出ていますか? そうであればjspから変換されたjavaファイルの中身を見てみるのもいいかと思います。
補足
わざわざ調べていただきありがとうございます。(><) エラーは以下のようになっておりました。 doForward : javax.servlet.ServletException Error in JSP : /jsp/home.jsp org.apache.jasper.JasperException: /jsp/home.jsp(96,19) 引用符が必要です ※home.jspとは、aaa.jspを呼び出すjspファイルです。 質問させていただいたimportは<body>~</body>タグの中に記述してあります。それが原因とは思えないのですが・・・。 尚、htmlファイルだと正常にimportされるので、もしかしたらjspファイルは<body>~</body>タグの中の記述だと読み込めないのでしょうか?
- pcbeginner
- ベストアンサー率46% (261/560)
インクルードディレクティブを使用すると、 JSPをサーブレットに変換する前に、 インクルードするファイルを読みに行きます。 ですので <% String strData=a.getData("javaData");%> <%@include file=strData%> としても、 <%@include file=strData%> ↑で実際にインクルードするのはサーブレットの変換前、つまりページコンパイルもサーブレットが実行もされてもいないので、 <% String strData=a.getData("javaData");%> ↑の部分は実行されいません。 ですので、strDataというファイルがありませんよ。 となってしまうのです。 なぜインクルードするファイルを変数にしたいのか? ということに対しての答えが 「インクルードするファイルを動的に変えたいから」 ということなら インクルードアクション(<jsp:include>) を使用してはいかがでしょうか? 参考URLにインクルードディレクティブとインクルードアクションの違いが載っています。 途中の図を見る限り動的にインクルードできると思います。 (試していないので間違っているかもしれません。)
補足
早速のご回答ありがとうございます。 >なぜインクルードするファイルを変数にしたいのか? >ということに対しての答えが >「インクルードするファイルを動的に変えたいから」 >ということなら >インクルードアクション(<jsp:include>) >を使用してはいかがでしょうか? まさにその通りなのです! そこで、いただいた回答を元に下記のように行ってみたのですが、「引用符が必要です」と言われてしまい、正常に動作いたしませんでした。 <jsp:include page="<%=cstrData%>" flush="true" /> もし、間違い等ございましたらご指摘願えませんでしょうか?
実際に試してないのでヒント程度ですが・・。 ちょっとベタな方法ですが、 <% if (××){ %> <%@include ・・> <% } else { %> <%@include ・・> <% } %> みたいな形で変更するわけにはいきませんか? 後は、<jsp:include>でもダメでしょうか。 あるいは、式言語を使って、page="${××}"という形でもだめでしょうか。 ・・ぱっと思いつくのはそれぐらいでしょうか。
お礼
ご回答ありがとうございます。 返信が遅くなり、申し訳ございません。 Kyon2_PaPaさんのいう「ベタ」な方法は以前使用していた やり方です。(汗) 現在ファイルの種類が多くなってしまったため、 動的にインクルードする方法を探していました。 >後は、<jsp:include>でもダメでしょうか こちらは試してみたのですがうまくいきませんでした。jspファイルを読み込めないようです。 もう少し考えてみます。教えてくださりありがとうございました。
お礼
詳細な説明をありがとうございます。 変換されたサーブレットですが、変換される前に落ちてしまうため見ることができませんでした。 また、#2の参考URLは読ませていただいてます。 自分の理解不足、詳細不足より、小言を言われてしまっても仕方ないと思います。 セッションは、ご教授いただいて申し訳ないのですが、 仕事の関係上使用できないのです・・・。 また時間の関係上、今回はhtmlファイルにて行うことにさせていただきました。 ここまでお付き合いいただき、ありがとうございました! 今回ご教授いただいた内容は、今後生かしていきたいと思います。