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
。
我的问题:
sessionScope
,requestScope
,applicationScope
相同?ActionContext
和request(requestScope)
之间的关系是什么?P.S:
我测试${request == requestScope}
这是真的,这意味着它们是一样的吗?
答案 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 object
和sessionScope is map (key, value) of Attribute and its value
。
如果你说${session.sessionAttr}
它指的是会话对象
可用于JSP页面。
如果你说${sessionScope.sessionAttr}
它指的是IMPLICIT
会话对象可用于EL。
答案 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)
HttpSession
,HttpServletRequest
和ServletContext
个对象,而sessionScope, requestScope and applicationScope
提供对所有会话,请求和应用程序范围属性的访问权。你可以说applicationScope> sessionScope> requestScope。
答案 3 :(得分:2)
ActionContext
是一个Struts2的东西,它是在框架处理的每个请求中创建的。在创建框架时,框架会将其与servlet内容一起填充,并使用它自己的request
,session
和applicaton
实现。在应用程序中使用它的地方,这些对象被引用。要访问servlet内容,请使用有助于检索适当资源的ServletActionContext
。 Struts2还包装ServletRequest
以提供对EL表达式的动作属性和valueStack
的访问。 {EL}表达式使用sessionScope
,requestScope
和applicationScope
来评估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