Являются ли 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