Para quien le pueda interesar, creo que he dado con la respuesta. El listado anterior no es la estructura del ValueStack sino el orden de búsqueda seguido para resolver una expresión OGNL. Eso sí, los puntos 1,2 y 3 suele ser la estructura del ValueStack, pero el punto 4 no, ya que los named object (#session, #request o los creados por el desarrollador) se almacenan en el ActionContext.
El ActionContext contiene lo siguientes elementos:
-ValueStack
- #session
- #params
- # application
- # attr
- # request
Si por ejemplo hacemos <s:set var="var1" scope="action"/>, var1 se almacenará en el ActionContext como #var1.
Si ejecutamos las dos lineas siguientes:
Código PHP:
<s:set var="var1" scope="action"/>
<s:property value="var1" />
La expresión value="var1" (que equivale a value="%{var1}"), se resolverá al llegar al punto 4 del orden de búsqueda, ya que se encontrará en el ActionContext con #var1.
Si en nuestro objeto Action tuvíeramos una propiedad como:
Código PHP:
private String var1;
entonces al ejecutar las dos líneas anteriores, la expresión value="var1" se resolvería contra la propiedad del Action (se queda pues en el punto 3). Y si quisiéramos evaluar la expresión value="#var1" entonces no le queda más remedio que resolverse en el punto 4.
Por tanto, volviendo a las líneas de código del mensaje principal:
Código PHP:
<s:set name="omega" value="username" scope="request"/>
<s:property value="%{omega}" />
la expresión value="%{omega}" no se resuelve ya que no encuentra ninguna propiedad que concuerde en los puntos 1,2 y 3 (ValueStack) , ni tampoco un named object llamado #omega en el punto 4 . La expresión se resolvería si fuera:
value="#request.omega".
Menuda rayada! Y qué de entresijos tiene Struts 2, aunque la idea es simple