jsp - struts 2 tutorial
Struts2 Tiles configurando var a un atributo de mosaicos como cadena (2)
Yo uso struts 2.3.16 y tiles 2.0.6.
Una definición de mosaicos con un atributo vacío (entre otros):
<put-attribute name="pageSidePanel" value="" />
Algunas otras definiciones lo amplían y pueden elegir completar el valor:
<put-attribute name="pageSidePanel" value="/panels/greenPanel.jsp" />
o déjalo vacío también.
Traté de probar si este atributo está vacío utilizando una etiqueta struts "set" y alguna lógica básica if / else. Por ejemplo:
<s:set var="sidePanelName"><tiles:getAsString name=''pageSidePanel''/></s:set>
<s:if test=''%{#sidePanelName.isEmpty()}''>TRUE</s:if><s:else>FALSE</s:else>
Los resultados no fueron los que esperaba. Realicé 11 pruebas lógicas, en dos variaciones: 11 pruebas usaron el hashtag y las otras 11 no:
#sidePanelName vs sidePanelName
Hice las pruebas con 2 páginas JSP diferentes, una que realmente ha puesto un valor en las fichas y otra que no. Entonces, en total hay 44 pruebas lógicas:
- 11 pruebas con # en una página donde el atributo de los mosaicos está vacío
- 11 pruebas que no usan # en una página donde el atributo de los mosaicos está vacío
- 11 pruebas con # en una página donde el atributo de mosaicos se completa con un valor
- 11 pruebas que no usan # en una página donde el atributo de mosaicos se completa con un valor
SOLO la situación 3 era correcta. Toda la otra situación dio resultados incorrectos. Por ejemplo, en la situación 1, si #var == null
, obtengo el resultado falso, pero si #var == null
var == null
(sin el hashtag), i
hago verdadero. Entonces, hay dos cosas que necesito aclarar:
- ¿Cuál es el efecto de usar # o no?
- ¿Cuál es el efecto de que el atributo de los mosaicos tenga un valor o no? ¿Struts var lo considera nulo o como cadena vacía o depende de si he usado # o no?
Como referencia, aquí están todas las pruebas:
<s:set var="sidePanelName"><tiles:getAsString name=''pageSidePanel''/></s:set>
<s:if test=''#sidePanelName != ""''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="#sidePanelName != ''''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''#sidePanelName == ""''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="#sidePanelName == ''''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{!#sidePanelName.isEmpty()}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{#sidePanelName.length() > 0}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{#sidePanelName.length() == 0}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{#sidePanelName.equals("")}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{#sidePanelName.equalsIgnoreCase("")}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''#sidePanelName == null''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''#sidePanelName != null''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''sidePanelName != ""''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="sidePanelName != ''''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''sidePanelName == ""''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test="sidePanelName == ''''">TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{!sidePanelName.isEmpty()}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{sidePanelName.length() > 0}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{sidePanelName.length() == 0}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{sidePanelName.equals("")}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''%{sidePanelName.equalsIgnoreCase("")}''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''sidePanelName == null''>TRUE</s:if><s:else>FALSE</s:else>
<s:if test=''sidePanelName != null''>TRUE</s:if><s:else>FALSE</s:else>
La etiqueta <tiles:getAsString>
devolverá una cadena vacía si no ha definido su valor en la definición de teselas. Entonces tu código
<s:set var="sidePanelName"><tiles:getAsString name=''pageSidePanel''/></s:set>
será lo mismo que una etiqueta <s:set>
vacía.
<s:set var="sidePanelName"></s:set>
Y un atributo vacio <s:set>
tag w / o value
asignará el top
a una variable (en la mayoría de los casos sería la instancia de acción actual).
Intente imprimir su valor con <s:property value="#sidePanelName"/>
. Probablemente verá algo como your_package.YourClass@hash
.
No puede invocar métodos en un objeto null
...
Entonces
-
isEmpty()
ylength()
son incallables, porque se invocan en el objeto en sí, mientras - para las comparaciones con
equals()
yequalsIgnoreCase()
, se pueden llamar sin generar NPE si se invoca en el objeto conocido, como"".equalsIgnoreCase(#sidePanelName)
.
Por cierto, si el objeto es nulo, también "".equalsIgnoreCase(#sidePanelName)
dará falso, porque no es igual a una cadena vacía, es simplemente nulo ...
PD: presta atención a tu descripción, que es engañosa:
Tengo un atributo de mosaicos que NO es de tipo cadena
[...]
Los resultados son CORRECTOS cuando la cadena no está vacía / está llena / tiene al menos una caracterización-