12
votes

Ne peut pas lire la propriété booléenne dans JSP el

Si une propriété d'objet est déclarée comme de type booléen (non primitive booléen), il semble y avoir un problème dans el reconnaissant!

Dites que vous avez l'objet suivant P>

<td>Object is ${case.valid ? "Valid":"Invalid"} </td>


8 commentaires

Je suis un utilisateur noob jsp, mais le privé dans votre valide déclaration de variable d'objet signifie que vous ne pouvez pas y accéder directement?


Oui, cela est vrai dans Java World, mais avec el, vous pouvez accéder à des propriétés d'objet à l'aide de style Javabean (objet.propertyname) à condition que vous avez fourni un getter (isvalid dans ce cas). Alors, quand vous dites cas.valid, vous appelez effectivement cas.isvalid (). Vous pouvez voir que si je change booléen à Boolean, cela fonctionne bien.


Donc, si vous appelez la méthode isvalid () , cela ne fonctionne pas aussi bien?


Vous ne pouvez pas appeler Isvalid () en El, comme je l'ai dit, vous utilisez l'objet de style JavaBean Accessing Occre.PropertyName.


Donc, je suppose que ma prochaine question est, si vous modifiez cette déclaration au public, cela ne fonctionne pas? (juste vérifier)


Non, vous n'accédez pas directement à la propriété directement, vous y accédez via cas.isvalid (0 mais le moyen de le faire à El est en disant cas.valid.


Je te prendrai au mot. Je ne sais pas assez près de cela pour le faire valoir, merci d'avoir pris le temps d'expliquer.


Pas tout à fait certain ici, mais je suppose que si vous ajoutez un getvalid () méthode qui déléguette à isvalid () , il devrait fonctionner.


3 Réponses :


20
votes

Tous les exemples que j'ai jamais vus parler de Boolean Les propriétés permettent aux getters du formulaire isproperty () en plus de getProperty () et jamais booléen s.

Je ne trouve aucune référence "officielle" à ce comportement, mais Ce blog post semble décrire ce que je soupçonnais quand j'ai commenté initialement - un boolean est un objet alors qu'un booléen est une primitive et tandis que Java a automatiquement Boxe, el ignorera le isproperty () getter qui renvoie un booléen et va plutôt chercher un getProperty () méthode.

Je soupçonne donc que, dans votre exemple, si vous avez changé le type de retour de isvalid () à booléen au lieu de booléen (mais Laissez le type de champ comme booléen ), votre expression EL fonctionnera comme vous vous attendez.


2 commentaires

Le poteau de blog n'existe pas.


Excellente pensée, à propos de Boolean / Boolean et est / get. Cela m'a vraiment aidé. +1 ici et +1 sur une autre réponse de la tienne. Mais le blog mentionné n'existe plus et qui sait où pouvons-nous avoir une information complète, sur des variantes avec la fixation B / Boolean pour les champs et les fonctions et arguments, et le comportement peut être différent pour différents serveurs s'il n'est pas décrit dans les documents. .. BTW, selon mes expériences, Boolean pour Is ... n'a pas fonctionné, seulement booléen pour obtenir ... (JBoss)



5
votes

el traite booléen comme un objet (totalement correct) afin qu'il recherche getvalid () méthode. Ceci est cohérent avec la spécification JavaBeans.

Essayez de changer de propriété de Boolean Type de référence à Boolean Type primitif. Si cela n'est pas possible et que vous utilisez de nouveaux EL (c'est-à-dire 2.2 - Je ne suis pas sûr d'environ 2.1), vous pouvez appeler une méthode, donc $ {casvalid ()} serait un exemple d'une utilisation correcte de cette nouvelle fonctionnalité EL.


0 commentaires

0
votes

Certaines combinaisons de getters sont / getters, des champs booléens / booléens et des getters booléens / booléens sont autorisés ou interdits par JSP. Il est comme suit:

Combinaisons interdites: P>

private Boolean code_FMI = true, code_FmI = true, code_FMG = true, code_FmG = true;
private boolean code_fMI = true, code_fmI = true, code_fMG = true, code_fmG = true;

public Boolean isCode_FMI() {
    return code_FMI;
}

public boolean isCode_FmI() {
    return code_FmI;
}

public Boolean getCode_FMG() {
    return code_FMG;
}

public boolean getCode_FmG() {
    return code_FmG;
}

public Boolean isCode_fMI() {
    return code_fMI;
}

public boolean isCode_fmI() {
    return code_fmI;
}

public Boolean getCode_fMG() {
    return code_fMG;
}

public boolean getCode_fmG() {
    return code_fmG;
}


0 commentaires