• ベストアンサー

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するファイル名を 変数で使用する方法はないものでしょうか? 過去ログにも見当たらなかった為、質問させていただきました。 よろしければご回答お願いいたします。 また、何かございましたらご指摘の程よろしくお願いいたします。

  • Java
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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" />

etsuki_gen
質問者

お礼

詳細な説明をありがとうございます。 変換されたサーブレットですが、変換される前に落ちてしまうため見ることができませんでした。 また、#2の参考URLは読ませていただいてます。 自分の理解不足、詳細不足より、小言を言われてしまっても仕方ないと思います。 セッションは、ご教授いただいて申し訳ないのですが、 仕事の関係上使用できないのです・・・。 また時間の関係上、今回はhtmlファイルにて行うことにさせていただきました。 ここまでお付き合いいただき、ありがとうございました! 今回ご教授いただいた内容は、今後生かしていきたいと思います。

その他の回答 (3)

回答No.3

調べてはみたのですが… どうも分からず… エラーはページコンパイルで出ていますか? そうであればjspから変換されたjavaファイルの中身を見てみるのもいいかと思います。

etsuki_gen
質問者

補足

わざわざ調べていただきありがとうございます。(><) エラーは以下のようになっておりました。 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>タグの中の記述だと読み込めないのでしょうか?

回答No.2

インクルードディレクティブを使用すると、 JSPをサーブレットに変換する前に、 インクルードするファイルを読みに行きます。 ですので <% String strData=a.getData("javaData");%> <%@include file=strData%> としても、 <%@include file=strData%> ↑で実際にインクルードするのはサーブレットの変換前、つまりページコンパイルもサーブレットが実行もされてもいないので、 <% String strData=a.getData("javaData");%> ↑の部分は実行されいません。 ですので、strDataというファイルがありませんよ。 となってしまうのです。 なぜインクルードするファイルを変数にしたいのか? ということに対しての答えが 「インクルードするファイルを動的に変えたいから」 ということなら インクルードアクション(<jsp:include>) を使用してはいかがでしょうか? 参考URLにインクルードディレクティブとインクルードアクションの違いが載っています。 途中の図を見る限り動的にインクルードできると思います。 (試していないので間違っているかもしれません。)

参考URL:
http://www.atmarkit.co.jp/fjava/rensai/jsp05/jsp05.html
etsuki_gen
質問者

補足

早速のご回答ありがとうございます。 >なぜインクルードするファイルを変数にしたいのか? >ということに対しての答えが >「インクルードするファイルを動的に変えたいから」 >ということなら >インクルードアクション(<jsp:include>) >を使用してはいかがでしょうか? まさにその通りなのです! そこで、いただいた回答を元に下記のように行ってみたのですが、「引用符が必要です」と言われてしまい、正常に動作いたしませんでした。 <jsp:include page="<%=cstrData%>" flush="true" /> もし、間違い等ございましたらご指摘願えませんでしょうか?

noname#49664
noname#49664
回答No.1

実際に試してないのでヒント程度ですが・・。 ちょっとベタな方法ですが、 <% if (××){ %> <%@include ・・> <% } else { %> <%@include ・・> <% } %> みたいな形で変更するわけにはいきませんか? 後は、<jsp:include>でもダメでしょうか。 あるいは、式言語を使って、page="${××}"という形でもだめでしょうか。 ・・ぱっと思いつくのはそれぐらいでしょうか。

etsuki_gen
質問者

お礼

ご回答ありがとうございます。 返信が遅くなり、申し訳ございません。 Kyon2_PaPaさんのいう「ベタ」な方法は以前使用していた やり方です。(汗) 現在ファイルの種類が多くなってしまったため、 動的にインクルードする方法を探していました。 >後は、<jsp:include>でもダメでしょうか こちらは試してみたのですがうまくいきませんでした。jspファイルを読み込めないようです。 もう少し考えてみます。教えてくださりありがとうございました。

関連するQ&A

  • JavaでStrutsを使用してJSP画面のインクルードを行う場合について

    JavaでStrutsを使用してJSP画面のインクルードを行う場合について 改修を行いたい画面では現在、他の画面をインクルードディレクティブを使用して呼んでいます。 今回、呼んでいる先の表示項目が固定でなく、条件により変更されるように変更したいと思っています。 しかし、インクルードディレクティブを使用すると、呼んでいる先の画面の表示項目に変数を使用できないときいたため、以下の修正を行い、変更後の画面を見たところ、呼んでいる先の画面が表示されていませんでした。 ・インクルードアクションを使用して呼ぶように変更 (AAA.jspは呼んでいる先のJSP名)) 変更前 (<%@ include file="AAA.jsp"%> 変更後 <jsp:include page="AAA.jsp" flush="true"> <jsp:param name="count" value="<%= count1 %>" /> <jsp:param name="count" value="<%= count2 %>" /> </jsp:include> ※count1,count2は、JSP内で定義している変数が設定されています。 と、変数を2つ使用しています。 、画面にエラーメッセージは表示されないため、原因について、記述内容を考えたのですが、改修を行った画面と呼んでいる先の画面は、同一フォルダ内にあるため、問題ないと考えています。 インクルードディレクティブからインクルードアクションに変更したのみで、ページのインクルードができなくなることってあるのでしょうか? それとも、インクルードディレクティブとインクルードアクションの違いは <%@ include file="AAA.jsp"%> と <jsp:include page="AAA.jsp" flush="true" /> だけではなく、別のところでも設定変更が必要なのでしょうか? 素人な質問で申し訳ありませんが、 ・インクルードディレクティブからインクルードアクションに変更するときに画面が表示されなくなった理由 ・インクルードディレクティブを使用して、呼んでいる先の画面から変数を取得する方法 のどちらかがわかる方いらっしゃいましたら教えてください。 ちなみに、 <jsp:include file="AAA.jsp" flush="true" /> だったとか、そういうミスはしていません。

    • ベストアンサー
    • Java
  • JSPの変数受け渡しについて教えてください。

    index.jspファイルにinclude.jspをインクルードします。 そのときにindex.jsp内の変数にアクセスしたいのですがどのように行えばよろしいでしょうか。(index.jsp内の変数の値を変えたい) ■index.jsp <% String hensu = "aaa"; %> <jsp:include include.jsp /> <html> <body> <%= hensu %> </body> </html> ↑この時点でinclude.jspによって代入された値が bbb に変化して表示されればよいのですが・・・。 ■include.jsp <% String hensu = "bbb"; %> この方法が無理であれば、beanを使用しようと考えていますが、なるべくjspで実現したいと思っています。 まったくの初心者で申し訳ないですが誰かお助けお願いします。

    • ベストアンサー
    • Java
  • JSPでインポート

    WEB-INF \ classes \ abc \ def \ghi.java jsp \ hoge.jsp WEB-INFとjspは同じ場所にあります。 jspファイルにimportを記述して上のabc.def.*のパッケージをインポートしたいのですが、 <% page import = "abc.def.*" %> と入れても、「パッケージがありません」というエラーになってしまいました。 (eclipseの左側の×しるし) おそらくパッケージがどこから始まっているのか、という情報(どこにあるのか??) を与えてやら無いといけないとは思うのですが、それがどこなのか良くわかりません。 実はもともともwarアーカイブがあり、それを一気に配備すればエラーは出ません。 どのように構築して行ったのかを勉強しようとしたところ、このような壁にあたってしまったのです。 どこにどう書けばよいかを教えてください。

    • ベストアンサー
    • Java
  • JSPでの変数定義

    以下のようなJSPが2つあった場合にeclipseではTest2がエラーとなってしまいます。(Test2では変数Xが何者か判断できないため) なお実行時には変数の値が参照できるため通常に動作しますが、Test2でもTest1の1、2の記述をする必要があるのでしょうか? Test1.jsp  1.useBeanでBeanAを使用  2.BeanA.getValue()の値を変数にXに設定  3.Test2.jspのインクルード  4.変数Xの値を使用した処理 Test2.jsp  変数Xの値を使用した処理

  • サーブレットからJSPの呼び出しについて

    こんにちは。 JSPの呼び出しについて質問です。 サーブレットで RequestDispatcher dispatcher = req.getRequestDispatcher("/jsp/java.jsp"); dispatcher.include(req, res); としてJSPファイルを呼び出そうとしているのですが、うまくいきません。コンパイルは通ります。 dispatcher.include(req, res); の部分で例外処理にいってるのでそこがおかしいようですが。urlの指定もjspファイルの内容も何度も確認したのですがミスはないみたいで原因がわかりません。 またTomcatのログファイルlocalhost_logを見ると 2002-07-11 16:05:35 ApplicationDispatcher[/DB] サーブレット jsp のServlet.service()は例外を投げました という文が出力されています。

    • ベストアンサー
    • Java
  • <jsp: include>タグでサーブレット

    <jsp: include>タグでサーブレットを呼ぶことはできるでしょうか? あるJSPファイルが実行される前に先にサーブレットを呼びたい のですがわかりません。 どうすればいいのでしょうか?

    • ベストアンサー
    • Java
  • JSPでHashMap・配列の変数の値を扱う方法について

    サーブレット側でHashMap型の「map」に値をセットしてしています。 mapは配列となっています。 ■サーブレット -------------------------------------- HashMap map[] = new HashMap[10];  ・・省略・・ getRequest().setAttribute("map",map) -------------------------------------- 上記でセットした値をJSP側で値を参照したいと思っているのですが、 HashMap・配列の値をJSP側でどのように読み込む/記述したら良いのか 分かりません。 初歩的な質問で申し訳ございませんが、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • JSP、Servlet、設計について

    今回Webアプリの設計を行っていますが、そこで発生した疑問について質問させて頂きます。 このアプリは、大きく分けてログイン画面とメイン画面の二つがあり、各メイン画面ではフレーム部分と内側の部分が存在し、各メイン画面のフレーム部分のデザインは統一したいと思っています。 また、出来るだけMVCモデルを守り、スプリクトレットはできる限り用いず、カスタムタグは使用せず、JavaとServletが理解できれば全体が把握できるような形にしたいと思っています。 ○疑問1 メイン画面のデザインを統一させるためにどのような流れにするか? ・案1 サーブレット、フレーム部分のjsp、内側のjspのファイル、この3つをメイン画面の各機能分作る。 サーブレットで要求を受け、フレーム部分jspにフォワードし、フレーム部分jspから内側jspをインクルードする。 ・案2 サーブレット、フレーム部分のjsp、フレームからインクルードするファイルを決める分岐用サーブレット、この3つを一つづつ作り、内側のjspファイルを各機能分作る。 サーブレットで要求を受け、フレーム部分jspにフォワードし、フレーム部分jspから分岐用サーブレットをインクルードし、分岐用サーブレットから内側jspをインクルードする。 ・考察 案2では、フレーム部分jspを一つに限定できるのでそちらのほうが良いように思えますが、流れが若干複雑になります。案1ではシンプルですが、フレーム部分jspファイルが複数できてしまいます。 機能によっては、サーブレットとJSPがお互いを呼び出すような事が5回ぐらいネストされると思います。 このようなやり方が普通なのか、判断できません。 ○疑問2 ログイン情報を用いた動的メニューを、メイン画面で共通のフレームに追加したい。 ・案1 ViewHelperパターン?のような形にする 一例 <jsp:useBean id="menu" scope="request" class="MenuBean" /> <%= menu.getMenu() %> サーブレットでMenuBeanにログイン情報を設定し、JSPからメニューのHTMLを構成したStringを返してもらう。 ・案2 Servletにする <jsp:include page="MenuServlet" /> JSPからインクルードされたMenuサーブレットで、ログイン情報を取得してメニューのHTMLを構成し、out.printlnする。 ・考察 案1はサーブレットでMenuを作成しなくてはならず、一つ手間が増える。案2は、コントローラであるはずのServletでout.printlnしなくてはならないので何か違和感がある。(他のサーブレットでは、out.printlnする箇所は全くない) どちらが良いのか、または別の方法があるのか。 Servletで実現できるならViewHelperの用途とは何か? よろしくお願い致します。

  • JSPでincludeファイルの日本語が文字化けします。

    tomcat3.1を使用しています。 JSP本体でcharset=Shift_JISを設定し、SJISコードで記述した文字は正常に表示されますが、 <%@ include file="file.html" %>にて読み込んだfile.htmlに記述した日本語が文字化けします。 file.htmlが文字化けしないようにする方法を教えてください。

  • jspでXMLファイルの読み書きは?

    JavaのJSPで、XMLファイルを読み書きしたいと思っております。 サーブレットでは、「import javax.xml.parsers.*;」などを読み込んで処理してますが、 JSPでも、同じように Import してやればよいのでしょうか? また、JSPでも、「Try~catch 」のようなことは、できるのでしょうか? PHPでは、「simplexml_load_file」を使っていました。 Javaには、詳しくないので、お分かりになる方がいらっしゃいましたら、お教えください。

    • ベストアンサー
    • Java

専門家に質問してみよう