• ベストアンサー

Strutsタグの<%@ page>について

Strutsのタグの<%@ page> のimport=""で importしたいクラスを指定すると思うのですが ここにinner class(内部クラス、ネストクラス)を 指定することは出来ますでしょうか? また、その指定方法をご存知のかたは教えてください。 よろしくお願いいたします。

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

  • ベストアンサー
noname#49664
noname#49664
回答No.3

Pageディレクティブでimportに内部クラスを指定できるか?というのは、そもそも「内部クラスを外部からimportして使えるか?」ということとほぼ同じ意味になるかと思います。・・どうでしょう、Javaではできるんでしょうかね?? ちょっと試してみたんですが、どうもできないように思えるんですが・・。 class A { public class B { public void doB(){ System.out.println("Do B!"); } } } 例えばこんな具合になっていたとして、外部からクラスBにアクセスする方法があるか?というと、どうも思いつきません。importはあくまでパッケージを指定するものですから、import A.Bは無効です。また、new A.B()でもnewA$B()でもインスタンスは作れません。 基本的に「内部クラス」というのが何のためにあるかといえば、それは「クラスのメンバとしてクラスを定義する」ためのものであり、そうである以上、内部クラスは必ずそれが含まれているクラスのメンバと何らかの形でつながりがあるわけです。である以上、(それが含まれているクラスなしに)内部クラスだけが動くということはまず考えられません。  また、他のメンバとは一切関係はないというなら、そもそもそれは内部クラスでなく普通のクラスとして定義すべきものであるわけです。 ですので、クラス内のメンバとしてクラスを定義するためにわざわざ拡張された内部クラスを、外部からアクセスするということ自体を想定していないんじゃないでしょうか。「だったら内部クラスにするな」ってことでは?

relax7777
質問者

お礼

回答ありがとうございます! 内部クラスの事をよく理解出来ていなかったようです。とても勉強になりました。 結果ですが、上記の例ですと <%@ page import="A" %> として 使用するときは A.B と指定すれば出来ました。

その他の回答 (4)

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.5

以下、内部クラスとネストクラスは厳密に区別してますので、そこの用語の使い方に注意です。 ネストクラスは普通にインポートできるし、 たまに利用することもあるでしょう。たとえば import="java.util.Map.Entry" とすれば Map.Entry が Entry という名前で使えます。 内部クラスも実は同様のインポートができます。 No3の方の例をお借りしますが、 (無名パッケージではインポートできないので、 Aの属するパッケージ名を pac とします。) import pac.A.B; は実は有効です。JSPなら、 <% @page import="pac.A.B" %> そして、内部クラスBを無理矢理外部で使いたければ、 A a = new A(); B b = a.new B(); と、Aのインスタンスに対して new をかけるという、 変なコードでできなくはないですが、 だから何、という感じではあります。普通こんなことしません。

relax7777
質問者

お礼

ありがとうございました!

  • deadlock
  • ベストアンサー率67% (59/87)
回答No.4

できませんか?下記のコードがコンパイルを通るので、 そのまま「foo.Foo.Bar」と書けばいいと思うのですが…。 ひょっとしたら「foo.Foo$Bar」かも知れません。 IDEの種類などによってはエディタ上ではエラーになるかも知れませんが、一度動かしてみては? ======= 内部クラスを持つクラス。 package foo; public class Foo { public class Bar { } } ====== 内部クラスを使うクラス。 package foo.out; import foo.Foo.Bar; /** * * @author t.baba */ public class OutherPackage { public static void main(String[] args) { System.out.println(Bar.class.getName()); } }

relax7777
質問者

お礼

回答ありがとうございます。 とても参考になりました。 <bean:define />でtypeを指定する場合 上記の例ですとtype="foo.Foo$Bar"で指定できました。 実はこちらの方の解決策も探していたので お教えいただいてラッキーでした。 ありがとうございました!

  • covachan
  • ベストアンサー率38% (46/120)
回答No.2

申し訳ありません。質問を勘違いしておりました。

  • covachan
  • ベストアンサー率38% (46/120)
回答No.1

クラスを宣言したいんですよね? <%!  class TestClass{   public String getString(){    return "Hello";   }  } %>

関連するQ&A