_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
を参照します。
私の質問:
sessionScope
、requestScope
、applicationScope
と同じですか?ActionContext
とrequest(requestScope)
の関係は何ですか?P.S.:
私は_${request == requestScope}
_をテストしますが、これは同じです。つまり、それらは同じですか?
式言語(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の特定の順序で暗黙的な値をチェックします。つまり、セッションスコープまたはアプリケーションスコープの変数と同じ名前のリクエストスコープの変数がある場合、リクエストスコープの値が参照されます。
デフォルトでは、_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セッションオブジェクトを指します。
HttpSession
、HttpServletRequest
およびServletContext
オブジェクトですが、sessionScope, requestScope and applicationScope
すべてのセッション、リクエスト、およびアプリケーションスコープの属性へのアクセスを提供します。ApplicationScope> sessionScope> requestScopeと言うことができます。
ActionContext
はStruts2のものであり、フレームワークによって処理されるすべてのリクエストで作成されます。作成されると、フレームワークは、request
、session
、およびapplicaton
の独自の実装で、サーブレットのものと一緒にフレームワークを読み込みます。また、アプリケーションで使用する場合、これらのオブジェクトが参照されます。サーブレットにアクセスするには、適切なリソースを取得するのに役立つServletActionContext
を使用します。 Struts2はServletRequest
もラップして、アクションプロパティとEL式からのvalueStack
へのアクセスを提供します。 sessionScope
、requestScope
、およびapplicationScope
はEL表現で使用され、サーブレットスタッフ属性を評価します。それが違いです。
私が試したコードを下に見てください。
<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}
は、false
がrequestScope
でマップされたオブジェクトを検索するときにrequest
によりEL
がクライアントの要求オブジェクトであるため、request
を返します。さまざまなscopes
の名前。しかし、あなたの場合はstruts2
のためにtrue
です