2010-03-19 8 views
6

Ho un problema in cui determinati attributi nei file di tag rimangono in attesa per la prossima volta che il tag viene utilizzato.come evitare che i tag jsp vengano riutilizzati dopo essere stati caricati in classe

Penso che questo sia dovuto al fatto che la classe Tag viene caricata in classe e quindi la stessa istanza viene riutilizzata per ogni chiamata. Quindi gli attributi che non ho impostato in invocazioni successive non sono nulli come mi aspetterei che fossero, e contengono valori stantii!

Voglio che questo non accada più. Qualcuno sa cosa controlli l'impostazione in Tomcat 6?

+0

Puoi fare un esempio? Ad esempio, un caso di prova insufficiente minimo? –

+0

cosa comporterebbe questo esempio? my tomcat config + jsp + tag personalizzato? sembra dimensioni proibitive – mkoryak

risposta

7

Tomcat 7.0 utilizza tag messa in comune:

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

JSP custom tag Pooling - Gli oggetti Java istanziati per JSP tag personalizzati possono ora essere riunite e riutilizzati. Ciò aumenta notevolmente le prestazioni delle pagine JSP che utilizzano tag personalizzati.

Quella pagina dice anche che web.xml può contenere un'opzione "enablePooling" e che il suo valore predefinito è true.

Quindi direi che disabilitare il riutilizzo dei tag non è una buona idea in quanto porterebbe a una perdita di prestazioni.

Tomcat 7.0 garantisce che lo stato della volontà di classe tag rimane invariato tra doStartTag() e doEndTag():

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

doStartTag e doEndTag metodi possono essere richiamati sul tag handler. Tra queste invocazioni, il tag handler si presume di tenere uno stato che deve essere preservata

Ma lo stesso paragrafo dice anche fra parentesi che l'oggetto si prevede di avere le sue proprietà mantenuto dopo:

Dopo la chiamata doEndTag, il gestore tag è disponibile per ulteriori invocazioni (e si prevede che abbia mantenuto le sue proprietà).

Quindi, ciò che faccio è ripristinare tutte le variabili locali al loro valore predefinito appena prima che doEndTag() restituisca. Non ho trovato alcuna spiegazione su come il pool di tag Tomcat e il riutilizzo siano implementati (TagHandlerPool.java credo), quindi penso che sia l'opzione più sicura.

+0

La garanzia che hai citato non è solo legata a Tomcat ma a tutti i contenitori servlet (il javadoc che hai collegato fa parte delle specifiche) – MRalwasser

1

Infatti, solo una istanza di tag è stata creata ogni volta. Forse hai dichiarato gli attributi static?

+0

no, non ho fatto una cosa così pazza =) – mkoryak

2

È necessario cancellare lo stato del tag tra le chiamate. Dovresti farlo nel metodo doEndTag() della tua classe, prima di tornare. A quel punto dovresti impostare tutte le variabili di stato su null.

+0

puoi indicarmi un javadoc o qualcosa che dice che ho bisogno di fare questo? sembra un po 'folle che questa sia la norma piuttosto che l'eccezione – mkoryak

+0

Una cosa che ho trovato è specifica per l'implementazione di Apache Tomcat, ma comunque, eccola: http://tomcat.apache.org/tomcat-5.5-doc/ jasper-howto.html –

+0

Roland, potresti essere sulla strada giusta qui. prova questa impostazione e verifica se risolve le cose – mkoryak

1

Forse un po 'in ritardo, ma ho avuto lo stesso problema. Si alza quando imposto un attributo Tag con valore null su un valore. La modifica di un valore non fornisce alcun errore, solo l'impostazione.

Quindi l'implementazione per il riutilizzo dei tag fa qualcosa di simile a ricordare quali attributi sono stati impostati e disassociato quelli dopo che il tag ha terminato il suo lavoro. Se imposti quell'attributo nel tuo codice-tag, il pool di tag non sa resettare taht attrbiute e mantiene il suo valore.

Non so se questo sia vero, ma si adatta alle mie osservazioni

Problemi correlati