0

home.jsp

<jsp:useBean id="username" class="java.lang.String" scope="application"/>

<%
      username="Jitendra";
%>

<jsp:include page="include.jsp"/>

include.jsp

<%=username%>

これにより、Bean のスコープがアプリケーションであるにもかかわらず、「ユーザー名」が include.jsp で定義されていないというエラーが発生します…</p>

4

3 に答える 3

15

あなたの問題に関しては、昔ながらのスクリプトレットを使用してローカルで宣言したものは、jsp:useBean. また、ローカル スクリプトレット変数を宣言しても、含まれているページには表示されないため、少なくともリクエスト スコープに明示的に配置する必要があります。スクリプトレットの使用は悪い習慣です。私はそれをまったく忘れることをお勧めします。

特定のケースでは、データを保持するための実際のJava Bean を作成するだけです。つまり、(暗黙の) デフォルト コンストラクターと、パブリック ゲッター/セッターによって公開されるプライベート プロパティを持つクラスです。基本的な例を次に示します。

public class User {

    private String name;

    public String getName() {
        return name;
    }

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

}

その後、サーブレット クラスを使用してリクエストを前処理できます。これにはサーブレットのdoGet()メソッドを使用できます。

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    User user = new User();
    user.setName("Jitendra");
    request.setAttribute("user", user); // Store in request scope.
    request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}

このサーブレットをたとえばweb.xmlにマップします。その後、このサーブレットにアクセスできるようになり、すぐに実行されます。url-pattern/showhttp://example.com/context/showdoGet()

show.jsp次に、次の行を使用して、直接アクセスを防止するために配置する JSP ファイルを変更/作成し/WEB-INFます (これにより、クライアントはそれにアクセスできなくなりますがhttp://example.com/context/show.jsp、サーブレットを呼び出すことを「強制」されます)。

<p>User name: ${user.name}</p>

${user}、任意の request/session/application 属性 key に関連付けられているオブジェクトを指しますuser。これは舞台裏で行われjspContext.findAttribute("user")ます。返されたUserインスタンスは javabean 仕様に準拠しているため、 はインスタンスでメソッド${user.name}を呼び出し、EL はその結果を表示します。getName()User

追加する必要がありますが、サーブレットは既に目的の Bean を作成してスコープに配置しているため、これは必要ありません。jsp:useBean

とはいえ、まともな JSP/サーブレットのチュートリアル/本から始めることをお勧めします。例:

お役に立てれば。

于 2009-12-06T14:48:51.340 に答える
1

java.lang.Stringaは実際には Bean ではないため、コードは「悪」です。重要なことに、テキストを変更するための「set」メソッドがありません (これは意図的なものであり、不変であることを意図しています)。

Bean にアクセスする方法は、Bean を宣言し、そのプロパティ (つまり、get() および set() メソッドの背後にある名前) を使用して変更することです。実際の Bean インスタンスを直接変更することはできず、その値のみを変更します。

于 2009-12-06T14:26:41.393 に答える
1

Tomcat 6 ではhome.jsp、サーブレット コードに変換されます。

java.lang.String username = null;
synchronized (application) {
  username = (java.lang.String) _jspx_page_context.getAttribute("username", 
                                                  PageContext.APPLICATION_SCOPE);
  if (username == null){
    username = new java.lang.String();
    _jspx_page_context.setAttribute("username", username,
                                                  PageContext.APPLICATION_SCOPE);
  }
}

username="Jitendra"; 

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, 
                                                 "include.jsp", out, false);

動作は同じですが、生成される正確なコードはアプリケーション サーバーの実装によって異なります。

ローカルusername変数のスコープは、 から生成されるサーブレットには拡張されませんinclude.jsp。値「Jitendra」をアプリケーション スコープに設定するのではなく、ローカル変数の値を設定するだけです。

他の人が指摘しているように、不変の String はあまり良い Bean にはなりません。

于 2009-12-06T15:20:47.373 に答える