web-dev-qa-db-ja.com

セッションとsessionScopeはJSP ELで同じですか?

_public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    @Override
    public String execute() throws Exception {
        ActionContext ctx = ActionContext.getContext();
        Integer counter = (Integer)ctx.getApplication().get("counter");
        // put counter into application 
        ctx.getApplication().put("counter", counter);
        // put username into session
        ctx.getSession().put("user", username);
        if (getUsername().equals("crazyit.org")
                && getPassword().equals("leegang")) {
            ctx.put("tip", "Login Success! ");
            return SUCCESS;
        }
        else {
            ctx.put("tip", "Login Falied!");
            return ERROR;
        }        
    }
}
_

セッションに_"counter"_をアプリケーション_"user"_に、ActionContextに_"tip"_を配置します。 JSPでは、_${session.user}_および_${sessionScope.user}_を使用して「user」プロパティを参照できます。 _${request.tip}_および_${requestScope.tip}_は、tipを参照します。

私の質問:

  1. セッション、リクエスト、アプリケーションはELのsessionScoperequestScopeapplicationScopeと同じですか?
  2. ActionContextrequest(requestScope)の関係は何ですか?

P.S.:

私は_${request == requestScope}_をテストしますが、これは同じです。つまり、それらは同じですか?

17
StrikeW

式言語(EL)の場合、スコープ項目は、参照するオブジェクトの属性の値マップです。たとえば、requestScopeはリクエストオブジェクトの値のマップ表現です。これは、このページで非常に明確に詳細に説明されています: Java Servlet and JSP 。 ELセクションを読み通すと、リクエストとリクエストスコープについてのポイントに気付くでしょう: requestScopeはリクエストオブジェクトではありません

このページを読んで、サーブレット/ jspの一般的な理解を深めることをお勧めします。

ActionContextがこれらのアイテムにどのように関係するかについては、実際にStrutsがサーブレットをカプセル化するために使用するラッパーです。詳細については、こちらをご覧ください: アプリケーション、セッション、リクエストオブジェクトへのアクセス

ここで暗示的な値への参照がいくつかありましたが、私はそれが暗示的であると言っているだけではあまり説明しません。 ELを使用してサーブレット変数にアクセスする場合、次のように、参照するスコープを明示的に宣言できます。

 ${requestScope.myVariable}

スコープを省略することで暗黙的に参照することもできます:

 ${myVariable}

ここで発生する可能性がある問題は、同じ名前の変数が衝突を引き起こす可能性があることです。 ELは、pageScope、requestScope、sessionScope、およびapplicationScope、param、paramValues、header、headervalues、initParam、cookie、pageContextの特定の順序で暗黙的な値をチェックします。つまり、セッションスコープまたはアプリケーションスコープの変数と同じ名前のリクエストスコープの変数がある場合、リクエストスコープの値が参照されます。

21

デフォルトでは、_page, request, session and application_オブジェクトはJSPページで使用できます。そのため、EL構文を使用してアクセスできます。

次の表は、ELで使用可能なIMPLICITオブジェクトを示しています。

_       Implicit object            Description
1.     pageScope        Scoped variables from page scope
2.     requestScope     Scoped variables from request scope
3.     sessionScope     Scoped variables from session scope
4.     applicationScope Scoped variables from application scope
5.     param            Request parameters as strings
6.     paramValues      Request parameters as collections of strings
7.     header           HTTP request headers as strings
8.     headerValues     HTTP request headers as collections of strings
9.     initParam        Context-initialization parameters
10.    cookie           Cookie values
11.    pageContext      The JSP PageContext object for the current page
_

したがって、sessionとsessionScopeは同じですが、使用されるコンテキストが異なります。具体的には_session is object_およびsessionScope is map (key, value) of Attribute and its value

  • _${session.sessionAttr}_と言うと、JSPページで利用可能なセッションオブジェクトを指します。

  • _${sessionScope.sessionAttr}_と言う場合、ELで利用可能なIMPLICITセッションオブジェクトを指します。

  • または、単に{attrName}と言うと、ページからアプリケーションスコープまでのすべてのスコープでattrNameを検索します。
21
Dipak Ingole
  1. セッション、リクエスト、アプリケーションは実際にはHttpSessionHttpServletRequestおよびServletContextオブジェクトですが、sessionScope, requestScope and applicationScopeすべてのセッション、リクエスト、およびアプリケーションスコープの属性へのアクセスを提供します。

ApplicationScope> sessionScope> requestScopeと言うことができます。

  • applicationScope属性は、すべてのセッション、Webアプリケーション全体のすべてのリクエストにアクセスできます。これらの属性は、アプリケーションが生きている限り生き続けます
  • sessionScope属性は、現在のHttpSession全体のすべての要求にアクセスできます。セッションが生きている限り、これらの属性は生き続けます
  • requestScope属性は、現在のリクエストからのみアクセスできます。応答が完了すると、それらは消えます。
3
Prasad Kharkar

ActionContextはStruts2のものであり、フレームワークによって処理されるすべてのリクエストで作成されます。作成されると、フレームワークは、requestsession、およびapplicatonの独自の実装で、サーブレットのものと一緒にフレームワークを読み込みます。また、アプリケーションで使用する場合、これらのオブジェクトが参照されます。サーブレットにアクセスするには、適切なリソースを取得するのに役立つServletActionContextを使用します。 Struts2はServletRequestもラップして、アクションプロパティとEL式からのvalueStackへのアクセスを提供します。 sessionScoperequestScope、およびapplicationScopeはEL表現で使用され、サーブレットスタッフ属性を評価します。それが違いです。

2
Roman C

私が試したコードを下に見てください。

<body>
<%
FirstServlet first=new FirstServlet();  // it has a fileName property and getter setter for it
%>
<%
session.setMaxInactiveInterval(10); //jsp's implicit session object
request.setAttribute("session", first); //jsp's implicit request object
session.setAttribute("hello", "this worked!");
pageContext.getSession().setAttribute("hello", "now this also worked!");%> // same as above

${pageContext.session.maxInactiveInterval } // client's session object
${sessionScope.maxInactiveInterval}
${session.fileName } // FirstServlet Object and gives the fileName I gave.
${sessionScope.hello } // OP: "now this also worked!
${session==sessionScope } // gives false. If using struts2 than true
${request==requestScope } // gives false. If using struts2 than true
</body>

ELでは、${sessionScope}を使用するときにPrasadとCaptainが述べたように、セッションスコープの変数名のみをそれらの値にマッピングします。

クライアントのセッションオブジェクトを取得する場合は、pageContext.sessionを使用する必要があります

ただし、${session}を使用する場合、elは、セッション名でマップされた属性をpage->request->session->applicationスコープの順に左から右に検索します。

${request == requestScope}は、falserequestScopeでマップされたオブジェクトを検索するときにrequestによりELがクライアントの要求オブジェクトであるため、requestを返します。さまざまなscopesの名前。しかし、あなたの場合はstruts2のためにtrueです

1
Kartik73