2010-03-19 13 views
6

Tengo un problema en el que ciertos atributos de los archivos de etiquetas se conservan para la próxima vez que se usa la etiqueta.cómo evitar que se reutilicen las etiquetas jsp después de haber sido clasificadas

Creo que esto se debe a que la clase Tag se está cargando, y luego esa misma instancia se reutiliza para cada invocación. ¡Así que los atributos que no configuro en invocaciones posteriores no son nulos como esperaría que fueran, y contienen valores obsoletos!

Quiero que esto no vuelva a ocurrir. ¿Alguien sabe qué configuración controla eso en Tomcat 6?

+0

¿Puedes dar un ejemplo? Por ejemplo, ¿un caso de prueba con falla mínima? –

+0

¿Qué implicaría este ejemplo? mi tomcat config + jsp + etiqueta personalizada? parece el tamaño prohibitivo – mkoryak

Respuesta

7

Tomcat 7.0 utiliza la etiqueta puesta en común:

http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html

JSP Tag personalizada Pooling - Los objetos instanciados java para JSP etiquetas personalizadas ahora pueden ser agrupados y reutilizados. Esto aumenta significativamente el rendimiento de las páginas JSP que usan etiquetas personalizadas.

Esa página también dice que web.xml puede contener una opción "enablePooling" para eso, y que su valor predeterminado es verdadero.

Así que yo diría que desactivar la reutilización de etiquetas no es una buena idea, ya que daría lugar a una pérdida de rendimiento.

Tomcat 7,0 garantiza que el estado de la voluntad clase etiqueta no cambia entre un doStartTag() y doEndTag():

http://tomcat.apache.org/tomcat-7.0-doc/jspapi/javax/servlet/jsp/tagext/Tag.html

doStartTag y doEndTag métodos pueden ser invocados en el controlador de etiqueta. Entre estas invocaciones, el controlador de etiqueta se supone para mantener un estado que debe ser preservado

Pero el mismo párrafo se dice entre paréntesis que Se espera que el objeto tenga sus propiedades retenida después:

Después de la invocación doEndTag, el controlador de etiquetas está disponible para otras invocaciones (y se espera que haya conservado sus propiedades).

Entonces, lo que hago es restablecer todas las variables locales a su valor predeterminado justo antes de que regrese doEndTag(). No encontré ninguna explicación sobre cómo se implementa la agrupación y reutilización de etiquetas Tomcat (TagHandlerPool.java, supongo), así que creo que es la opción más segura.

+0

La garantía que mencionaste no solo está relacionada con Tomcat sino con todos los contenedores servlet (el javadoc que has vinculado forma parte de la especificación) – MRalwasser

1

De hecho, solo se ha creado una instancia de etiqueta cada vez. Tal vez usted declaró los atributos static?

+0

no, no hice una cosa tan loca =) – mkoryak

2

Debe borrar el estado de la etiqueta entre las llamadas. Debería hacerlo en el método doEndTag() de su clase, justo antes de regresar. En ese punto, debe establecer todas las variables de estado en null.

+0

¿me puede apuntar a un javadoc o algo que dice que tengo que hacer esto? parece un poco loco que esta sea la norma en lugar de la excepción – mkoryak

+0

Una cosa que encontré es la implementación específica de Apache Tomcat, pero de todos modos, aquí está: http://tomcat.apache.org/tomcat-5.5-doc/ jasper-howto.html –

+0

Roland, puede que esté en el camino correcto aquí. intentaré esa configuración y veré si soluciona las cosas – mkoryak

1

Tal vez un poco tarde, pero tuve el mismo problema. Se levanta cuando establezco una Etiqueta-atributos con un valor nulo a un valor. Cambiar un valor no proporciona ningún error, solo seteo.

Creo que la implementación de la reutilización de etiquetas hace algo así como recordar qué atributos se establecieron y deshacerlos una vez que la etiqueta terminó su trabajo. Si configura ese atributo en su código de etiqueta, el grupo de etiquetas no sabe restablecer el valor de attrbiute y conserva su valor.

No estoy seguro de si es cierto, pero se ajusta a mis observaciones

Cuestiones relacionadas