2009-09-11 20 views
1

私はうまく動作するプロジェクトを持っています。 bookstore example JSPの変数をどこで初期化するのか分かりませんでしたか?豆はありません。私たちが持っているのはJavaクラスだけです。 JSPはjavaクラスの変数を呼び出しますが、どのようにしますか?私はすべての設定ファイルを検索しましたが、何も見つかりませんでした。ここJSPはどこで初期化されますか?

public class Bookstore {  
    private final Map<String, Item> items = new TreeMap<String, Item>(); 

    private String name; 

    public Bookstore() { 
     setName("Otel Sheriton"); 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

は私のJSPファイルです:

..... 
<body> 

    <h1>${it.name}</h1> 
...... 

</body> 

$ {it.name}意味:どこでどのように私は識別することができ、そこで、本屋
のオブジェクトのいずれかから変数 'name' を取得します$ {it}

答えて

1

スクリプトレット(古い< %% >タグ)にコードを入れると、それらはJSPコンパイラによって_jspService()メソッドに変換されます。このメソッドは、JSPページがクライアントから直接アクセスされるか、サーバー側フォワードまたはインクルードを使用してコンテナ内でアクセスされるたびに呼び出されます。

_jspService()メソッドはオーバーライドできません。 JSPコンパイラは、JSPページにコードが表示されるのと同じ順序でサービスメソッドの本体を作成します。したがって、変数はローカル変数として作成され、サービスメソッドが呼び出されるたびに初期化されます。

古いものを使用する場合は、<%! %>タグまたは新しいjsp:declarationタグを使用してメソッドを定義すると、変数は宣言されたメソッドの実行時に作成され、初期化されます。

ところで、すべての暗黙の変数はコンテナによって初期化されます。

この現象の詳細は、JSP SpecificationおよびJspPage javadocに記載されています。

JspPageクラスとHttpJspPageクラスが初期化され、コンテナによってどのように使用されているか知りたい場合は、コンテナのソースコードを調べる必要があります。ただし、JSP仕様(JSPコンテナ契約の第11章)では、JSPコンテナがJSPページをどのように初期化して作成するかが定義されています。通常、ページクラス自体の初期化は1回しか行われません。この時点で、jspInit()が呼び出されます。通常、アプリケーションまたはコンテナのシャットダウン時にページが破棄されると、ページが破棄される前にjspDestroy()メソッドが呼び出されます。

更新

EL式は、最終的resolve the variable in the page, request, session and application scopesに試みることによって、Beanを見つけます。使用される変数は、適切なスコープで宣言され、初期化されている必要があります。 JavaBeanコンポーネントは、jsp:useBean tagを使用して初期化できます。他のオブジェクトは、サーブレットまたはスクリプトレットで宣言され、初期化されている必要があります。

+1

<%! %>タグを使用してJSPで変数を宣言すると、スレッドセーフではないため、問題が発生する可能性があります。 JSPはクライアント間で共有されるServletに変換され、この宣言は_jspService()にローカル変数を作成せず、Servletオブジェクトのフィールドを作成します。 –

+0

はい、<%! %>タグの変数を宣言するのは悪い習慣です。 –

+0

例を挙げることができますか?私はクラスの本とStringの著者がそのクラスの変数である場合、どのように私はjspに使用するauthにこの著者を初期化することができます – Iguramu

1

$ {it.name}という名前の属性それとして求めることができるオブジェクトからプロパティを得ることを意味します。

これは、例として、またはセッション中に表示されます。これは基本的に

((Bookstore) pageContext.findAttribute("it")).getName() 

として翻訳これは、順番にページ、要求、セッション(有効な場合)、およびアプリケーション・スコープ(複数可)で指定された属性を検索し、関連する値はnullを返します。

だからあなたは、あなたがあなたのJSPに行く前に、必要な範囲にオブジェクトを配置する

request.setAttribute("it", bookStoreObj) 

のようなものを持っている私は、あなたがMVCを使用すると仮定していますので、前のスコープでこれを配置するために、コントローラの仕事ですJSPを選択します。

0

あなたが知っているJSPは、サーブレットにコンパイルされます。 JSPで定義された変数は、コンパイルされたサーブレット・クラスに送られます。 使用しているサーバーのドキュメントをチェックし、コンパイルされたサーブレットクラスを確認する必要があります。その.classファイルの場合は、逆コンパイルとチェックを行うことができます。

関連する問題