Struts 2 中的 session 和 JSP EL 中的 sessionScope 相同吗?

问题描述 投票:0回答:5
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. session
    request
    application
    与EL中的
    sessionScope
    requestScope
    applicationScope
    一样吗?
  2. ActionContext
    request(requestScope)
    有什么关系?

附注:

我测试

${request == requestScope}
这是真的。这是否意味着它们是相同的?

jsp session struts2 el session-scope
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。这意味着,如果请求范围中的变量与会话或应用程序范围中的变量同名,则将引用请求范围的值。


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。

4
投票
  1. 会话、请求、应用程序实际上是
    HttpSession
    HttpServletRequest
    ServletContext
    对象,而
    sessionScope, requestScope and applicationScope
    提供对所有会话、请求和应用程序范围属性的访问。

你可以说 applicationScope > sessionScope > requestScope。

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

2
投票

ActionContext
是 Struts2 的一个东西,它是在框架处理的每个请求中创建的。创建后,框架将其与 servlet 内容一起填充,并使用它自己的
request
session
applicaton
实现。当您在应用程序中使用它时,会引用这些对象。要访问 servlet 内容,请使用有助于检索适当资源的
ServletActionContext
。 Struts2 还包装了
ServletRequest
以提供对操作属性的访问,并从 EL 表达式访问
valueStack
sessionScope
requestScope
applicationScope
与 EL 表达式一起使用来计算 servlet stuff 属性。这就是差异。


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
中,如 Prasad 和 Captain 所说,当您使用
${sessionScope}
时,它仅将会话范围的变量名称映射到它们的值。

如果你想获取客户端的会话对象,那么你应该使用

pageContext.session

但是当您使用

${session}
时,
el
按顺序搜索与会话名称映射的属性:
page->request->session->application
范围从左到右开始。

${request == requestScope}
给出
false
,因为
requestScope
是客户端的请求对象,当
request
会导致
EL
在各种
request
中搜索与
scopes
名称映射的对象。但就你而言,它是
true
因为
struts2

© www.soinside.com 2019 - 2024. All rights reserved.