2017-01-16 23 views
1

のJSPアクションタグがどのくらい正確に理解していますか。私の理解では、scopeは、Beanの場所(リクエスト、セッション、アプリケーションなど)を示すために使用されていますが、いくつかのテストの後、私は興味深い状況に遭遇しました。次のJSPコードを考慮してください(私はscripletsここだけ)簡単のために:jsp:useBeanスコープ属性はどのように機能しますか?

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1" import="package2JSP.User" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<title>Title</title> 
</head> 

<body> 
    <% 
     User user1 = new User("id1","name1"); 
     User user2 = new User("id2","name2"); 
     request.setAttribute("user", user1); 
     session.setAttribute("user", user2); 
    %> 
    <%-- Here I expect to create user bean that represents user2 from session scope--%> 
    <jsp:useBean id="user" class="package2JSP.User" scope="session"/> 

    <%-- Here I expect user name to be name2 but it is name1 instead--%> 
    <jsp:getProperty property="name" name="user"/> 
</body> 
</html> 

だから、基本的に、ここで私は2つのユーザーオブジェクトを作成し、私は「セッション」から「ユーザー」を取得しようとしたときに、「ユーザー」は、要求とセッションスコープの属性として、それらを設定しますスコープはjsp:useBeanを使用しているように、「要求」スコープの「ユーザー」が検索されたようです。

なぜ起こったのか教えていただけますか?そして、jsp:useBeanを通常通り指定されたスコープから属性を選択するのではなく、このように動作させる開発の理由は何ですか?

ここで、JSTL/ELを使用して必要な値、すなわち<c:out value="${sessionScope.user.name}" />を取得することができますが、私はちょうどjsp:useBeanの仕組みを知りたいと思っています。

  • のjsp:useBeanの
  • のjsp:getPropertyメソッド

のjsp:useBeanの

よるSpecification - CHAPTER JSP.5 - JSP.5.1 <jsp:useBean>へ:

この状況で

答えて

0

は関与2個のタグです

JSP:useBean操作関連付けインスタンス所与の範囲と同じIDの新たに宣言されたスクリプト変数と 与えられたIDを持つ利用可能な内で定義 言語オブジェクトをプログラムのJava。 アクションがスクリプトレスページ、または スクリプトレスコンテキスト(そのように指定されたアクションの本文のように)で使用される場合、 にはJavaスクリプト変数は作成されませんが、EL変数は です。

コンパイルされたJavaコードは次のとおりです。

 package2JSP.User user = null; 
     synchronized (session) { 
     user = (package2JSP.User) _jspx_page_context.getAttribute("user", PageContext.SESSION_SCOPE); 
     if (user == null){ 
      try { 
      user = (package2JSP.User) java.beans.Beans.instantiate(this.getClass().getClassLoader(), "package2JSP.User"); 
      } catch (ClassNotFoundException exc) { 
      throw new InstantiationException(exc.getMessage()); 
      } catch (Exception exc) { 
      throw new ServletException("Cannot create bean of class " + "package2JSP.User", exc); 
      } 
      _jspx_page_context.setAttribute("user", user, PageContext.SESSION_SCOPE); 
     } 
     } 

あなたはスクリプトレットを使用することができ、このユーザオブジェクト(表現)<%=user.getName()%>

JSPにアクセスする場合:

getPropertyメソッドをSpecification - CHAPTER JSP.5 - JSP.5.3 <jsp:getProperty>によると:

jsp:setPropertyおよびjsp:getPropertyのname属性の値は、 がfindContentオブジェクトのfindAttribute メソッドによって取得されるオブジェクトを参照します。

JSPコンパイラはfindAttribute()jsp:getPropertyタグの呼び出しから行います

out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString(
    (((package2JSP.User)_jspx_page_context.findAttribute("user")).getName()))); 

findAttribute()
ページ内の名前付き属性を検索し、要求、セッション(有効な場合)、 とアプリケーションスコープを順番に返し、関連する値、つまり を返します。

基本的に最初の一致が返されます。

useBeangetPropertyを使用することは悪い方法です。
JSTL/ELを使用する方が属性を扱うより良い方法です。

+0

ありがとうございます。これは、 'jsp:getProperty'が' findAttribute'を使って値を取得すると、論理的に ' 'のために" name1 "を取得する必要があります。セッションスコープ –

+0

私はこれをしようとしたときに私はおそらく 'getProperty'を使うときには' jsp:useBean'でBeanを定義しなければならないという例外があります。あなたが示唆したように '<%= user.getName()%>'を使って正しい値を取得しようとしましたが、うまくいきましたので、ここではjsp:getProperty'は 'jsp:useBean'ではありません。 –

関連する問題