6 votes

balise JSP bean pour une propriété qui pourrait ne pas exister

En JSP, je peux faire référence à une propriété d'un bean en utilisant le tag ${objet.propriété}

Existe-t-il un moyen de gérer des propriétés qui peuvent ne pas exister ? J'ai une page JSP qui doit traiter différents types de propriétés. Par exemple :

public class Person {
    public String getName()
}
public class Employee extends Person {
    public float getSalary()
}

En JSP, je veux afficher un tableau de personnes avec des colonnes de nom et de salaire. Si la personne n'est pas un employé, le salaire doit être vide. La ligne HTML pourrait ressembler à ceci :

<tr>
    <td><c:out value="${person.name}"></td>
    <td><c:out value="${person.salary}"></td>
</tr>

Malheureusement, si la personne n'est pas un employé, il ne peut pas trouver le salaire et une erreur se produit. Comment puis-je résoudre ce problème en JSP ?

Edit : Existe-t-il un instanceof vérifier dans le langage des balises JSP ?

7voto

Eric Wendelin Points 13805

Il suffit d'utiliser l'opérateur EL empty S'il s'agissait d'un attribut scopé, malheureusement, vous devrez entourer votre expression utilisant employee.salary avec <c:catch> :

<c:catch var="err">
    <c:out value="${employee.salary}"/>
</c:catch>

Si vous avez vraiment besoin instanceof vous pourriez envisager une étiquette personnalisée.

4voto

James Schek Points 11070

Si vous voulez la classe, utilisez simplement ${person.class} . Vous pouvez également utiliser ${person.class.name eq 'my.package.PersonClass'}

Vous pouvez également utiliser le "défaut" sur c:out.

 <c:out value='${person.salary}' default="Null Value" />

3voto

Adeel Ansari Points 24434

Concis, mais non vérifié.

<tr>
    <td>${person.name}</td>    
    <td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td>
</tr>

Existe-t-il une vérification d'instanceof dans le langage de balises JSP ?

Pas au moment où nous écrivons ces lignes. J'ai lu quelque part qu'ils l'ont réservé, instanceof mot-clé, dans EL, peut être pour l'avenir. De plus, il existe une bibliothèque disponible qui possède ce tag spécifique. Consultez-la avant de décider de créer une balise personnalisée pour vous-même. Voici le lien, Bibliothèque de balises non standard .

1voto

Ken Gentle Points 10162

Une méthode consisterait à créer une bibliothèque de balises personnalisée et à utiliser le polymorphisme au sein de celle-ci pour gérer le cas où une balise de type Person est un Employee .

Je n'ai pas fait cela depuis longtemps pour JSP, mais j'utilise fréquemment une technique similaire dans GSP (Groovy/Grails Server Pages).

Sinon, vous pourriez mettre de la logique dans le JSP (pas idéal) pour tester Employee -ness :

<% 
   String salary
   if (person instanceof Employee) {
       salary = person.salary
   } else {
       salary = "" // or '&nbsp;'
   }
%>
<td><c:out value="${salary}"></td>

0voto

sblundy Points 27163

Vous pouvez toujours avoir un champ de type.

public class Person {
    public String getType() { return "Person"; }
    public String getName()
}
public class Employee extends Person {
    public String getType() { return "Employee"; }
    public float getSalary()
}

Votre JSP ressemblerait à

<tr>
    <td><c:out value="${person.name}"></td>
    <td><c:if test="'Employee' eq person.type"><c:out value="${person.salary}"></c:if></td>
</tr>

Bien sûr, la classe a déjà cela...

<tr>
    <td><c:out value="${person.name}"></td>
    <td><c:if test="'Employee' eq person.class.simpleName"><c:out value="${person.salary}"></c:if></td>
</tr>

Vous pourriez aussi avoir la méthode "isEmployee()".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X