21
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"にアプリケーションを入れました。JSP では、「ユーザー」プロパティを使用して参照できます。と参考までに。"user""tip"ActionContext${session.user}${sessionScope.user}${request.tip}${requestScope.tip}tip

私の質問:

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

PS:

どちらが正しいかをテスト${request == requestScope}します。これは、それらが同じであることを意味しますか?

4

5 に答える 5

28

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

サーブレット/jsp 全般について理解を深めるために、このページを一読することをお勧めします。

ActionContext がこれらの項目にどのように関連するかという限りでは、実際にはストラットがサーブレットをカプセル化するために使用するラッパーです。ここで詳細を読むことができます: Accessing application, session, request objects

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

 ${requestScope.myVariable}

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

 ${myVariable}

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

于 2013-07-11T13:13:14.503 に答える
24

デフォルトでpage, request, session and application scopeは、オブジェクトは 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 objectsessionScope is map (key, value) of Attribute and its value.

  • ${session.sessionAttr}いわばJSPページで利用可能なセッションオブジェクトを指します。
  • ${sessionScope.sessionAttr}ELで利用可能なIMPLICITセッションオブジェクトを指していると言えば。
  • ${attrName}または、ページからアプリケーションスコープまでのすべてのスコープでattrNameを検索すると言うだけです。
于 2013-07-11T11:51:45.400 に答える
4
  1. session、request、application は実際にはHttpSessionHttpServletRequestおよびServletContextオブジェクトでありsessionScope, requestScope and applicationScope、すべての session、request、および application スコープの属性へのアクセスを提供します。

applicationScope > sessionScope > requestScope と言えます。

  • applicationScope 属性は、すべてのセッション、Web アプリケーション全体のすべての要求からアクセスできます。これらの属性は、アプリケーションが存続している限り存続します
  • sessionScope 属性は、現在の HttpSession 全体ですべてのリクエストにアクセスできます。これらの属性は、セッションが存続している限り存続します
  • requestScope 属性は、現在のリクエストからのみアクセスできます。応答が完了すると、それらはなくなります。
于 2013-07-11T10:12:05.693 に答える
2

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

于 2013-07-11T17:44:11.383 に答える
1

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

<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}、セッションスコープの変数名のみがそれらの値にマップされます。

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

ただし、 を使用すると、セッション名にマップされた属性が順番${session}に検索されます。範囲は左から右に始まります。elpage->request->session->application

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

于 2013-07-11T13:30:40.623 に答える