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""user"session和"tip". ActionContext在 JSP 中,我可以使用${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 和 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。这意味着如果您在请求范围内有一个变量与会话或应用程序范围内的变量同名,例如,将引用请求范围内的值。

于 2013-07-11T13:13:14.503 回答
24

默认情况下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。
于 2013-07-11T11:51:45.400 回答
4
  1. session、request、application 是实际HttpSessionHttpServletRequestServletContext对象,同时sessionScope, requestScope and applicationScope提供对所有 session、request 和 application 范围属性的访问。

你可以说applicationScope > sessionScope > requestScope。

  • applicationScope 属性将可供所有会话、跨 Web 应用程序的所有请求访问。只要应用程序还活着,这些属性就会一直存在
  • 当前 HttpSession 中的所有请求都可以访问 sessionScope 属性。只要会话还活着,这些属性就会保持活跃
  • requestScope 属性只能从当前请求访问。一旦响应完成,它们就消失了。
于 2013-07-11T10:12:05.693 回答
2

ActionContext是一个 Struts2 的东西,它是在框架处理的每个请求中创建的。当它被创建时,框架用它自己的requestsessionapplicaton. 以及您在应用程序中使用它的位置,这些对象被引用。要访问 servlet 内容,请使用ServletActionContext有助于检索适当资源的 。Struts2 还包装了ServletRequest以提供对动作属性和valueStack来自 EL 表达式的访问。sessionScope, requestScope, 并applicationScope与 EL 表达式一起使用以评估 servlet 的东西属性。这就是差异。

于 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>

正如ELPrasad 和 Captain 所说,当您使用${sessionScope}它时,它只会将会话范围的变量名称映射到它们的值。

如果您想获取客户端的会话对象而不是您应该使用pageContext.session

但是当您使用时${session}el会按顺序搜索与会话名称映射的属性:page->request->session->application范围从左到右。

${request == requestScope}false因为requestScope是客户端的请求对象,所以会request导致在各种. 但在你的情况下,这是因为ELrequestscopestruestruts2

于 2013-07-11T13:30:40.623 回答