在JSP EL中session和sessionScope是否相同?

时间:2013-07-11 10:07:53

标签: jsp el session-scope

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

我的问题:

  1. 会话,请求,申请是否与EL中的sessionScoperequestScopeapplicationScope相同?
  2. ActionContextrequest(requestScope)之间的关系是什么?
  3. P.S:

    我测试${request == requestScope}这是真的,这意味着它们是一样的吗?

5 个答案:

答案 0 :(得分: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 objectsessionScope is map (key, value) of Attribute and its value

  • 如果你说${session.sessionAttr}它指的是会话对象 可用于JSP页面。

  • 如果你说${sessionScope.sessionAttr}它指的是IMPLICIT 会话对象可用于EL。

  • 或者,如果您只是说{attrName},它将在从页面到应用程序范围的所有范围内搜索attrName。

答案 1 :(得分:21)

使用表达式语言(EL),范围项是它们引用的对象中属性的值映射。例如,requestScope是请求对象中值的映射表示。在此页面上非常详细地解释了这一点:Java Servlet and JSP。如果您仔细阅读EL部分,您会注意到有关请求与请求范围的关联点:The requestScope is NOT request object

我建议您阅读此页面,以便更好地了解servlet / jsp。

至于ActionContext如何与这些项相关,它实际上是struts用来封装servlet的包装器。您可以在此处阅读有关它的更多细节:Accessing application, session, request objects

这里给出了一些隐含值的引用,但我觉得只是说隐含的内容并不能解释得太多。当您使用EL访问servlet变量时,您可以显式声明要引用的范围,例如:

 ${requestScope.myVariable}

您也可以通过省略范围隐式引用它:

 ${myVariable}

现在,这里可能出现的问题是具有相同名称的变量可能会导致冲突。 EL将按特定顺序检查隐式值:pageScope,requestScope,sessionScope和applicationScope,param,paramValues,header,headervalues,initParam,cookie,pageContext。这意味着,如果请求范围中的变量与会话或应用程序范围中的变量具有相同的名称,则将引用请求范围的值。

答案 2 :(得分:3)

  1. 会话,请求,应用程序实际上是HttpSessionHttpServletRequestServletContext个对象,而sessionScope, requestScope and applicationScope提供对所有会话,请求和应用程序范围属性的访问权。
  2. 你可以说applicationScope> sessionScope> requestScope。

    • 可以访问所有会话的applicationScope属性,以及Web应用程序中的所有请求。只要应用程序处于活动状态,这些属性就会保持活动
    • 当前HttpSession中的所有请求都可以访问sessionScope属性。只要会话处于活动状态,这些属性就会保持活动
    • requestScope属性只能从当前请求中访问。一旦响应完成,它们就会消失。

答案 3 :(得分:2)

ActionContext是一个Struts2的东西,它是在框架处理的每个请求中创建的。在创建框架时,框架会将其与servlet内容一起填充,并使用它自己的requestsessionapplicaton实现。在应用程序中使用它的地方,这些对象被引用。要访问servlet内容,请使用有助于检索适当资源的ServletActionContext。 Struts2还包装ServletRequest以提供对EL表达式的动作属性和valueStack的访问。 {EL}表达式使用sessionScoperequestScopeapplicationScope来评估servlet stuff属性。这就是差异。

答案 4 :(得分: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>
Prasad和Captain在使用EL时所说的${sessionScope}中的

只会将会话范围的变量名称映射到它们的值。

如果您想获取客户端的会话对象,请使用pageContext.session

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

${request == requestScope}提供false,因为当requestScope导致request搜索EL名称为request的对象时,scopes是客户的请求对象各种true。但在你的情况下,由于struts2

,它是{{1}}