2010-02-02 5 views
6

Ultimamente mi sono divertito con il tagliolo a forma di molla e ho trovato un fenomeno abbastanza inquietante.L'attributo disabled di taglib molla deve davvero essere risolto in una stringa?

<form:select path="whatever" disabled="${true}"> 

renderà un elemento di selezione che non sia disattivato

<form:select path="whatever" disabled="${'true'}"> 

renderà un elemento di selezione che è disattivato.

Questo mi indica che il tag si aspetta una stringa in quell'attributo e si rifiuta di forzare qualsiasi valore booleano (possibilmente controllando prima il tipo).

L'impatto è che non riesco a fare qualcosa come <form:select path="whatever" disabled="${someOtherfield.selectedId != -1}" /> che è qualcosa che accade abbastanza spesso nel nostro sistema.

Mi manca semplicemente qualche parte della funzionalità taglibs del modulo? È una decisione di design legittima? Un difetto?

+0

Stavo per suggerire sollevare questo sul forum primavera e/o JIRA, ma vedo che dispone già di un intero thread per se stessi e un problema di JIRA :) – skaffman

+0

Devo ancora avere una risposta a una qualsiasi delle mie domande sul forum di primavera, penso che sia su circa 10 thread o su un paio di anni. Quindi, mentre continuo a provare, lo postò solo perché ritengo sia il posto giusto. Non perché ritengo che possa dare qualche risposta. –

risposta

5

Ok, ho fatto un po 'di scavo intorno a questo uno, perché i work-around stavano cercando troppo brutto.

http://forum.springsource.org/showthread.php?t=84102

Il problema era che il JSP stava valutando la EL, e confrontando ciecamente il risultato di tale valutazione con .equals "veri"

Confrontando una stringa in un valore booleano utilizzando tale metodo restituirà sempre falso perché il tipo non corrisponde, quindi è sicuramente un difetto.

Fortunatamente il metodo isDisabled in fault è protetto da un solo liner, quindi sono stato in grado di aggirare il problema estendendo il tag di input 8 effettuato e scavalcando quel metodo per fare un confronto leggermente più robusto.

Quindi la risposta è, sì, è un difetto, e dai commenti di skaffman Sembra che sia un po 'un problema con una vecchia libreria non essere molto ben aggiornato come è stato implementato JSP EL.

Grazie per le vostre risposte ragazzi

1

Questo è un po 'strano, giusto. Il codice sorgente Spring indica che la proprietà disabled di SelectTag è String, non boolean. Questa non è chiaramente la cosa giusta da fare, ma sospetto che sia ancora così per motivi legacy (spring-form.tld pre-date JSP EL).

Questo lascia al runtime JSP di forzare un boolean in un String e apparentemente non lo farà. Sono meno sorpreso di questo, poiché JSP EL è notoriamente limitato.

Quindi sei preso tra due implementazioni semi-rotte. Dovrai solo assicurarti di passare i valori di stringa a quell'attributo.

+0

da quello che posso vedere il tld utilizza un meccanismo di eval di primavera che supporta sia JSP2 EL che JSP1 EL, quindi penso che sia solo un piccolo bug in un'implementazione che cerca di mantenere la retrocompatibilità piuttosto che un difetto di progettazione aberrante –

0

La causa di questo disegno è che hanno un codice di fallback speciale per forzare la valutazione di espressione EL quando il contenitore non lo valuta. Ad esempio, questo codice:

<%@ page isELIgnored = "true" %> 
... 
${'Simple text'} <spring:message text = "${'Message text'} />" 

produce ${'Simple text'} Message text

Probabilmente, è utile per alcune configurazioni del contenitore eredità strani.

Cioè, il seguente codice non funzionerebbe se fanno disabled attributo boolean:

<%@ page isELIgnored = "true" %> 
... 
<form:select ... disabled = "${true}" />  
Problemi correlati