2011-11-17 13 views
8

私はこの振る舞いを持っている私は本当に比較文字列やブール

${someVar} 
${someVar.class.name}  
${someVar == 'error'} 

出力それはexlpainedすることができますどのように

false 
java.lang.Boolean 
true 
  1. を理解していませんか?
  2. 2つの「もの」が同じタイプで、その値が同じであるかどうかを最初にテストするために、テストを書き込む正しい方法は何ですか?
+1

を出力

<c:set var="strsomeVar">${someVar}</c:set> //${someVar} //${someVar.class} //${someVar == 'error'} 

。 – Paolo

+0

もっと良い ':)' –

答えて

13

EL specificationで定義されたように、これは、言語の挙動である:

A {==、=、EQ、NE!} B

  • 他のルールが
  • が省略さAまたはBがAおよびBの両方をブール値に強制する場合、演算子を適用する

強制Aをブール

  • Aがnullまたは "" である場合、Aは文字列で、Boolean.valueOf(A)がない場合、Aがブールであれば、そうでない場合
  • を返し、そうでない場合はfalse
  • を返します例外をスローしない、それを

ので、文字列リテラルはBoolean.valueOf("error")経由ブールに強制変換されそうでなければ

  • 、エラーを返しますwhich returns false。ポイント2

    <c:set var="errorString" value="${'error'}" /> 
    ${someVar.class == errorString.class} 
    

    については

  • 6

    EL両側の一方がBoolean(又はboolean)であり、他方側がStringある場合、Stringは、そのjavadoc以下を言うBoolean#valueOf()によってBooleanに解析される。

    Booleanを、指定された文字列で表される値で返します。 Booleanは、文字列引数がnullでない場合にはtrueの値を表し、文字列 "true"と大文字と小文字を区別しません。

    したがって、falseを返します。これは実際にfalseに相当します。

    EL式は、型がブール値と文字列の両方になることを考慮して書き直す必要があります。単一の型に固執し、単一の型で型を混同しないようにする必要があります。

    0

    は、2つの「もの」は、同じクラスのインスタンスであることを確認します。

    someVarをstringに変換してから2つの文字列を比較する方が良いかもしれません。少なくとも私の場合はsomeVarがStringまたはBooleanであることが保証されていないので、 Stringに変換できます。古いテストケースと交換しwithaよりコンパクトで簡単なものを削除し

    //false 
    //class java.lang.String 
    //false