Являются ли session и sessionScope одинаковыми в JSP EL?
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}
для ссылки на свойство "пользователь". ${request.tip}
и ${requestScope.tip}
для ссылки tip
.
Мои вопросы:
- Являются ли сеансы, запросы, приложения такими же, как
sessionScope
, requestScope
, applicationScope
в EL?
- Какая связь между
ActionContext
и request(requestScope)
?
P.S:.
Я тестирую ${request == requestScope}
, что верно, это означает, что они одинаковы?
Ответы
Ответ 1
С языком выражения (EL) элементы области являются картами значений атрибутов в объектах, на которые они ссылаются. Например, requestScope представляет собой представление карты значений в объекте запроса. Это объясняется довольно ясными деталями на этой странице: Java Servlet и JSP. Если вы прочитаете разделы EL, вы заметите точку вокруг области запроса и запроса: RequestScope не является объектом запроса.
Я бы рекомендовал прочитать эту страницу, чтобы лучше понять servlet/jsp вообще.
Что касается того, как ActionContext относится к этим элементам, это действительно оболочка, используемая struts для инкапсуляции сервлета. Подробнее об этом можно прочитать здесь: Доступ к приложениям, сеансу, объектам запроса.
Были некоторые ссылки на неявные значения, приведенные здесь, но я чувствую, что просто сказать, что это неявное, на самом деле мало объясняет. Когда вы используете EL для доступа к сервлет-переменным, вы можете явно объявить, какую область вы хотите ссылаться, например:
${requestScope.myVariable}
Вы также можете ссылаться на него неявно, опуская область действия:
${myVariable}
Теперь проблема, которая может возникнуть здесь, состоит в том, что переменные с тем же именем могут вызвать столкновение. EL проверяет неявные значения в определенном порядке: pageScope, requestScope, sessionScope и applicationScope, param, paramValues, заголовок, headervalues, initParam, cookie, pageContext. Это означает, что если у вас есть переменная в области запроса с тем же именем, что и переменная в области сеанса или приложения, на нее будет ссылаться значение области действия запроса.
Ответ 2
По умолчанию объекты page, request, session and application
доступны для страниц JSP.
Таким образом, вы можете получить доступ, используя синтаксис EL.
В следующей таблице показаны объекты IMPLICIT, доступные для 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
Таким образом, сеанс и sessionScope одинаковы, но отличаются в том контексте, в котором они используются. Более конкретно session is object
и sessionScope is map (key, value) of Attribute and its value
.
-
Если вы скажете ${session.sessionAttr}
, это относится к объекту сеанса
доступный на странице JSP.
-
Если вы скажете ${sessionScope.sessionAttr}
, это относится к IMPLICIT
доступ к элементу сеанса.
- Или, если вы просто скажете {attrName}, он будет искать attrName во всей области видимости от страницы до области приложения.
Ответ 3
- session, request, application - это фактически объекты
HttpSession
, HttpServletRequest
и ServletContext
, а sessionScope, requestScope and applicationScope
предоставляют доступ ко всем атрибутам сеанса, запроса и приложения.
Вы можете сказать, что applicationScope > sessionScope > requestScope.
- атрибуты applicationScope будут доступны для всех сеансов, всех запросов в веб-приложениях. Эти атрибуты остаются в живых до тех пор, пока приложение остается в живых.
- атрибуты sessionScope будут доступны для всех запросов по текущей HttpSession. Эти атрибуты остаются в живых, пока сеанс жив.
- requestScope атрибуты будут доступны только из текущего запроса. Как только ответ будет завершен, они исчезнут.
Ответ 4
ActionContext
- вещь Struts2, и она создается в каждом запросе, который обрабатывается инфраструктурой. Когда он создает структуру, он заполняет ее вместе с материалом сервлета с его собственными реализациями request
, session
и applicaton
. И где вы используете его в приложении, на эти объекты ссылаются. Чтобы получить доступ к материалам сервлета, используйте ServletActionContext
, который помогает извлекать соответствующие ресурсы. Struts2 также обертывает ServletRequest
, чтобы обеспечить доступ к свойствам действия и valueStack
из EL-выражений. sessionScope
, requestScope
и applicationScope
, используемые с выражениями EL для оценки атрибутов материала сервлета. Это различия.
Ответ 5
Посмотрите ниже приведенный код, который я пробовал.
<body>
<%
FirstServlet first=new FirstServlet(); // it has a fileName property and getter setter for it
%>
<%
session.setMaxInactiveInterval(10); //jsp implicit session object
request.setAttribute("session", first); //jsp implicit request object
session.setAttribute("hello", "this worked!");
pageContext.getSession().setAttribute("hello", "now this also worked!");%> // same as above
${pageContext.session.maxInactiveInterval } // client 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
, как указано Прасадом и Капитаном, когда вы используете ${sessionScope}
, он сопоставляет имена переменных с областью действия с привязкой к их значениям.
если вы хотите получить объект сеанса клиента, чем использовать pageContext.session
но когда вы используете ${session}
, EL
выполняет поиск атрибута, сопоставленного с именем сеанса, в порядке: page->request->session->application
области, начинающиеся слева направо.
${request == requestScope}
дает false
, потому что requestScope
является объектом запроса клиента, когда request
вызывает EL
для поиска объекта, сопоставленного с именем request
в различных scopes
. Но в вашем случае это true
из-за struts2