Tag bean JSP per proprietà che potrebbero non esistere
Domanda
In JSP posso fare riferimento alla proprietà di un bean usando il tag $ {} Object.property
Esiste un modo per gestire proprietà che potrebbero non esistere? Ho una pagina JSP che deve occuparsi di diversi tipi. Esempio:
public class Person {
public String getName()
}
public class Employee extends Person {
public float getSalary()
}
In JSP voglio visualizzare una tabella di persone con colonne di nome e stipendio. Se la persona non è un dipendente, lo stipendio dovrebbe essere vuoto. La riga HTML potrebbe apparire come:
<tr>
<td><c:out value="${person.name}"></td>
<td><c:out value="${person.salary}"></td>
</tr>
Sfortunatamente se la persona non è un dipendente, non riesce a trovare lo stipendio e si verifica un errore. Come lo risolverei in JSP?
Modifica: esiste una istanza di verifica nella lingua dei tag JSP?
Soluzione
Basta usare l'operatore vuoto EL SE era un attributo con ambito, sfortunatamente dovrete andare a circondare la vostra espressione usando employee.salary con < c: catch > ;:
<c:catch var="err">
<c:out value="${employee.salary}"/>
</c:catch>
Se hai davvero bisogno di istanza di , potresti considerare un tag personalizzato.
Altri suggerimenti
Se vuoi la classe, usa ${person.class}
. Puoi anche utilizzare ${person.class.name eq 'my.package.PersonClass'}
Puoi anche usare " default " su c: out.
<c:out value='${person.salary}' default="Null Value" />
Conciso, ma non selezionato.
<tr>
<td>${person.name}</td>
<td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td>
</tr>
Esiste un'istanza di check nel linguaggio dei tag JSP?
Non al momento di questo scritto. Ho letto da qualche parte che l'hanno prenotato, la parola chiave instanceof , in EL, potrebbe essere per il futuro. Inoltre, è disponibile una libreria con questo tag specifico. Analizzalo prima di decidere di creare un tag personalizzato per te. Ecco il link Libreria tag non standard .
Un metodo sarebbe quello di creare una libreria di tag personalizzata e utilizzare il polimorfismo al suo interno per gestire il caso in cui un Person
è-a Employee
.
Non lo faccio da un po 'di tempo per JSP, ma uso spesso una tecnica simile in GSP (Groovy / Grails Server Pages).
Altrimenti, potresti mettere un po 'di logica in JSP
(non ideale) per testare <=> - ness:
<%
String salary
if (person instanceof Employee) {
salary = person.salary
} else {
salary = "" // or ' '
}
%>
<td><c:out value="${salary}"></td>
Potresti sempre avere un campo 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()
}
Il tuo JSP sarebbe simile
<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>
Naturalmente la classe Class ha già questo ...
<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>
Potresti anche avere il metodo `isEmployee () '.