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?

È stato utile?

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 '&nbsp;'
   }
%>
<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 () '.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top