expression language jsp
¿Sesión y sessionScope son iguales en JSP EL? (5)
- session, request, application son en realidad los
HttpSession
,HttpServletRequest
yServletContext
, mientras quesessionScope, 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:
- ¿Sesión, solicitud, aplicación es lo mismo que
sessionScope
,requestScope
,applicationScope
en EL? - ¿Cuál es la relación entre
ActionContext
yrequest(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.