2014-07-11 17 views
7

Desidero confrontare due diversi tipi nel tag <c:if> di JSP. In pratica uno è Number sempre ma quello giusto è una stringa e se quella stringa potrebbe essere analizzata a un numero non ricevo alcun errore ma se la stringa non può essere analizzata su un Number, ricevo javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long.Comportamento operatore confronto JSP

Praticamente:

$ {1 == ""} // funziona bene
$ {1 == "4"} // funziona bene
$ {1 == "Sì"} // attiva l'eccezione.

Ma anche il 3 ° confronto ha funzionato bene nelle versioni precedenti di JSP ma ora provoca eccezioni.

Il comportamento di == è cambiato nel periodo di tempo?

Tutti i suggerimenti sono molto apprezzati

+0

forse utilizza internamente un convertitore di numeri se si utilizza eq sicuro che non getti un excp. – ZaoTaoBao

+0

no. Anche eq lancia la stessa eccezione nelle nuove versioni JSP –

risposta

5

Comportamento dei == non è cambiato, ma il comportamento di {expr} è cambiato ...

Chi versioni:

Nella sezione retrocompatibilità di JSP Specification,

Se la versione speci fi cato è meno di 2.1, quindi la sintassi {expr} è semplicemente elaborata come valore letterale String.

Quindi, finché EL 2.0 tutto sarà trattato come una stringa letterale e confrontati con .equals come == saranno convertiti in equals internamente (Reference here), ma in 2.1 non sarà convertito in stringa e getteranno un'eccezione dicendo che javax.el.ELException: Cannot convert No of type class java.lang.String to class java.lang.Long

a proposito di: bilanciamento

In JSP specification JSP.2.3.5.7 di EL versione 2.1, si precisa quanto segue ...

01.235.
  1. Se A è nullo o B è nullo restituisce falso per == o eq, vero per!= O ne

  2. Se A o B è Byte, Corto, Carattere, Integer, o costringere a lungo sia A e B a Long, applicare all'operatore

così, In primo caso,

${1 =="" } // ans is false as second one is null as per 1st rule. 

, nel secondo caso,

${1 =="4" } // ans is false as both are different after coercing to Long as per 2nd rule. 

Entrambi saranno forzati a long in caso precedente con conversione di tipo interna.

Ma non nel terzo caso, ${1 =="Yes" } dove secondo è stringa non può essere convertito (costretto) a Long e java.el.ELException saranno gettati con il messaggio "impossibile convertire No del tipo di classe java.lang.String di classe Java. lang.Long".

+0

posso fare qualcosa per rendere i miei EL in JSP compatibili all'indietro? –

+0

Non penso ci sia alcuna disposizione del genere, a meno che non si degradi. –

1

Come di JSP 2.1, JSP utilizza il linguaggio unificato espressione (unificato EL), che rappresenta l'unione del linguaggio delle espressioni offerto da JSP 2.0 e il linguaggio delle espressioni creata per Tecnologia JavaServer Faces.

È molto probabile che il comportamento possa essere leggermente diverso.

Vedere la sezione 1.18 della specifica della lingua di espressione JavaServer Pages 2.1 (disponibile da here) per le regole complete di conversione dei tipi.