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
放入会话中,将 tip
放入 ActionContext
中。在 JSP 中,我可以使用 ${session.user}
和 ${sessionScope.user}
来引用 user
属性。 ${request.tip}
和 ${requestScope.tip}
参考 tip
。
我的问题:
session
、request
、application
与EL中的sessionScope
、requestScope
、applicationScope
一样吗?ActionContext
和request(requestScope)
有什么关系?附注:
我测试
${request == requestScope}
这是真的。这是否意味着它们是相同的?
使用表达式语言 (EL),范围项是它们引用的对象中的属性的值映射。例如,requestScope 是请求对象中值的映射表示。此页面对此进行了非常清晰的详细解释:Java Servlet 和 JSP。如果您通读 EL 部分,您会注意到这里关于请求与请求范围的一点:requestScope 不是请求对象。
我建议阅读此页面,以便更好地了解 servlet/jsp 的总体情况。
就ActionContext与这些项的关系而言,它实际上是struts用来封装servlet的一个包装器。您可以在此处阅读有关它的更多详细信息:访问应用程序、会话、请求对象。
这里给出了一些对隐式值的引用,但我觉得仅仅说它是隐式的并不能真正解释太多。当你使用 EL 访问 servlet 变量时,你可以显式声明你想要引用哪个作用域,如:
${requestScope.myVariable}
您还可以通过省略范围来隐式引用它:
${myVariable}
现在,这里可能出现的问题是同名变量可能会导致冲突。 EL 将按特定顺序检查隐式值:pageScope、requestScope、sessionScope 和 applicationScope、param、paramValues、header、headervalues、initParam、cookie、pageContext。这意味着,如果请求范围中的变量与会话或应用程序范围中的变量同名,则将引用请求范围的值。
默认情况下,
page, request, session and application scope
对象可用于 JSP 页面。
所以你可以使用 EL 语法访问。
下表显示了 EL 可用的隐式对象。
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 可用的会话对象。${attrName}
,它将在从页面到应用程序范围的所有范围内搜索 attrName。HttpSession
、HttpServletRequest
和 ServletContext
对象,而 sessionScope, requestScope and applicationScope
提供对所有会话、请求和应用程序范围属性的访问。你可以说 applicationScope > sessionScope > requestScope。
ActionContext
是 Struts2 的一个东西,它是在框架处理的每个请求中创建的。创建后,框架将其与 servlet 内容一起填充,并使用它自己的 request
、session
和 applicaton
实现。当您在应用程序中使用它时,会引用这些对象。要访问 servlet 内容,请使用有助于检索适当资源的 ServletActionContext
。 Struts2 还包装了 ServletRequest
以提供对操作属性的访问,并从 EL 表达式访问 valueStack
。 sessionScope
、requestScope
和 applicationScope
与 EL 表达式一起使用来计算 servlet stuff 属性。这就是差异。
看看下面我尝试过的给定代码。
<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
中,如 Prasad 和 Captain 所说,当您使用 ${sessionScope}
时,它仅将会话范围的变量名称映射到它们的值。
如果你想获取客户端的会话对象,那么你应该使用
pageContext.session
但是当您使用
${session}
时,el
按顺序搜索与会话名称映射的属性: page->request->session->application
范围从左到右开始。
${request == requestScope}
给出false
,因为requestScope
是客户端的请求对象,当request
会导致EL
在各种request
中搜索与scopes
名称映射的对象。但就你而言,它是 true
因为 struts2