2008-10-31 6 views
6

En JSP puedo hacer referencia a la propiedad de un frijol mediante el uso de las etiquetas $ {} Object.Propertyetiqueta de frijol JSP para la propiedad que podría no existir

¿Hay alguna manera de tratar con propiedades que podría no existir? Tengo una página JSP que necesita tratar con diferentes tipos. Ejemplo:

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

En JSP Quiero mostrar una tabla de personas con columnas de nombre y salario. Si la persona no es un empleado, entonces el salario debe estar en blanco. El HTML fila podría ser:

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

Desafortunadamente, si la persona no es un empleado entonces no puede encontrar el sueldo y se produce un error. ¿Cómo podría resolver esto en JSP?

Editar: ¿Hay una instancia de comprobar en el lenguaje de etiqueta JSP?

Respuesta

7

Sólo tiene que utilizar el operador vacía EL CASO era un atributo restringidos, por desgracia, que tendrá para ir con rodea su expresión usando employee.salary con < c: catch >:

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

Si realmente necesita instanceof, es posible que estafar sider una etiqueta personalizada.

+0

Yo _know_ había una manera más fácil ... ¡DOH! –

+0

Usando Tomcat 5.5 esto generará una excepción si la propiedad no existe realmente en el objeto como en el caso del ejemplo mostrado arriba. – laz

+0

Confirmado, esto no funciona si la persona no tiene una propiedad salarial. –

0

Siempre puede tener un campo de tipo.

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

su JSP se vería

<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> 

Por supuesto, la clase Clase ya tiene esta ...

<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> 

También podría tener isEmployee método `()'.

1

Un método sería la creación de una biblioteca de etiquetas personalizadas y utilizar el polimorfismo dentro de ella para manejar el caso en que un Persones un-Employee.

No he hecho esto por un tiempo para JSP, pero con frecuencia uso una técnica similar en GSP (Groovy/Grails Server Pages).

lo contrario, podría poner un poco de lógica en el JSP (no ideal) para la prueba de Employee -ness:

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

Si desea la clase, simplemente use ${person.class}. También puede usar ${person.class.name eq 'my.package.PersonClass'}

También puede usar "predeterminado" en c: out.

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

¡Esto es exactamente lo que estaba buscando! Uso una etiqueta y la propiedad 'simpleName' de clase y puedo mostrar cada uno de los campos únicos de mi subclase.

3

Conciso, pero desmarcado.

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

¿Hay un control de instanceof en el lenguaje de etiquetas JSP?

No en el momento de este escrito. Leí en algún lugar que lo han reservado, instancia de palabra clave, en EL, puede ser para el futuro. Además, hay una biblioteca disponible que tiene esta etiqueta específica. Míralo antes de decidir crear una etiqueta personalizada para ti. Aquí está el enlace, Unstandard Tag Library.

Cuestiones relacionadas