tutorial jsp struts2 tiles2

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:

  1. 11 pruebas con # en una página donde el atributo de los mosaicos está vacío
  2. 11 pruebas que no usan # en una página donde el atributo de los mosaicos está vacío
  3. 11 pruebas con # en una página donde el atributo de mosaicos se completa con un valor
  4. 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:

  1. ¿Cuál es el efecto de usar # o no?
  2. ¿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() y length() son incallables, porque se invocan en el objeto en sí, mientras
  • para las comparaciones con equals() y equalsIgnoreCase() , 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-