language jsp el session-scope

expression language jsp



¿Sesión y sessionScope son iguales en JSP EL? (5)

  1. session, request, application son en realidad los HttpSession , HttpServletRequest y ServletContext , mientras que sessionScope, requestScope and applicationScope proporcionan acceso a todos los atributos de sesión, solicitud y ámbito de aplicación.

Puede decir que applicationScope> sessionScope> requestScope.

  • Los atributos de applicationScope estarán disponibles para todas las sesiones, todas las solicitudes en las aplicaciones web. Estos atributos permanecen vivos mientras la aplicación esté viva.
  • Los atributos de sessionScope estarán disponibles para todas las solicitudes a través de la HttpSession actual. Estos atributos permanecen vivos mientras la sesión esté viva.
  • A los atributos de requestScope solo se podrá acceder desde la solicitud actual. Una vez que se completa la respuesta, se han ido.

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; } } }

Puse "counter" en la aplicación "user" en la sesión y "tip" en ActionContext . En JSP puedo usar ${session.user} y ${sessionScope.user} para hacer referencia a la propiedad "usuario". ${request.tip} y ${requestScope.tip} para hacer referencia a la tip .

Mis preguntas:

  1. ¿Sesión, solicitud, aplicación es lo mismo que sessionScope , requestScope , applicationScope en EL?
  2. ¿Cuál es la relación entre ActionContext y request(requestScope) ?

PD:

Pruebo ${request == requestScope} que es verdadero, esto significa que son los mismos?


Con el lenguaje de expresión (EL), los elementos de alcance son mapas de valor de atributos en los objetos a los que hacen referencia. Por ejemplo, requestScope es una representación de mapa de valores en el objeto de solicitud. Esto se explica con bastante detalle en esta página: Java Servlet y JSP . Si lees las secciones de EL, verás un punto sobre el alcance de la solicitud frente a la solicitud aquí: el requestScope NO es un objeto de solicitud .

Recomendaría leer esta página para comprender mejor el servlet / jsp en general.

En cuanto a cómo ActionContext se relaciona con estos elementos, es realmente un envoltorio utilizado por puntales para encapsular el servlet. Puede leer más detalles al respecto aquí: Acceso a la aplicación, sesión, solicitud de objetos .

Aquí se han dado algunas referencias a valores implícitos, pero siento que decir que es implícito no explica mucho. Cuando está utilizando EL para acceder a las variables de servlet, puede declarar explícitamente a qué ámbito desea hacer referencia, como por ejemplo:

${requestScope.myVariable}

También puede hacer referencia implícitamente al omitir el alcance:

${myVariable}

Ahora, el problema que puede surgir aquí es que las variables con el mismo nombre pueden causar colisión. EL comprobará los valores implícitos en un orden específico: pageScope, requestScope, sessionScope y applicationScope, param, paramValues, header, headervalues, initParam, cookie, pageContext. Lo que esto significa es que si tiene una variable en el ámbito de la solicitud con el mismo nombre que una variable en la sesión o el ámbito de la aplicación, por ejemplo, se hará referencia al valor del ámbito de la solicitud.


De forma predeterminada page, request, session and application objetos de page, request, session and application están disponibles para las páginas JSP. Así que puedes acceder y luego usar la sintaxis EL.

Y la siguiente tabla muestra los objetos IMPLICITOS disponibles para 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

Por lo tanto, session y sessionScope son iguales pero difieren en el contexto en que se usan. Más específicamente, session is object y sessionScope is map (key, value) of Attribute and its value .

  • Si dice ${session.sessionAttr} se refiere al objeto de sesión disponible para la página JSP.

  • Si dice ${sessionScope.sessionAttr} se refiere al objeto de sesión IMPLICIT disponible para EL.

  • O si simplemente dice {attrName}, buscará attrName en todos los ámbitos, desde la página hasta el ámbito de la aplicación.

Echa un vistazo por debajo del código dado que probé.

<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>

en EL según lo establecido por Prasad y Captain cuando usa ${sessionScope} , solo asigna nombres de variables de ámbito de sesión a sus valores.

Si desea obtener el objeto de sesión del cliente debe utilizar pageContext.session

pero cuando usa ${session} , el busca el atributo mapeado con el nombre de la sesión en orden: page->request->session->application ámbitos de page->request->session->application comenzando de izquierda a derecha.

${request == requestScope} da false porque requestScope es el objeto de solicitud del cliente cuando la request hará que EL busque el objeto mapeado con el nombre de la request en varios scopes . Pero en tu caso es true debido a struts2


El ActionContext es una cosa de Struts2, y se crea en cada solicitud que maneja el marco. Cuando se crea, el marco lo rellena junto con las cosas del servlet con sus propias implementaciones de request , session y applicaton . Y donde lo usas en la aplicación, se hace referencia a estos objetos. Para acceder a las cosas del servlet use el ServletActionContext que ayuda a recuperar los recursos apropiados. Struts2 también envuelve ServletRequest para proporcionar acceso a las propiedades de acción y valueStack desde las expresiones EL. sessionScope , requestScope y applicationScope utilizan con expresiones EL para evaluar los atributos de cosas del servlet. Esa son las diferencias.