Pregunta

En JSP puedo hacer referencia a la propiedad de un bean utilizando la etiqueta $ {object.property}

¿Hay alguna forma de lidiar con propiedades que podrían 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. La fila HTML podría verse así:

<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 salario y se produce un error. ¿Cómo resolvería esto en JSP?

Editar: ¿Hay una instancia de verificación en el lenguaje de etiqueta JSP?

¿Fue útil?

Solución

Simplemente use el operador vacío EL SI fue un atributo de ámbito, desafortunadamente tendrá que ir alrededor de su expresión usando employee.salary con < c: catch > ;:

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

Si realmente necesita instanceof , puede considerar una etiqueta personalizada.

Otros consejos

Si quieres la clase, solo usa ${person.class}. También puedes usar ${person.class.name eq 'my.package.PersonClass'}

También puede usar " default " en c: fuera.

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

Conciso, pero sin marcar.

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

¿Hay alguna instancia de verificación en el lenguaje de etiqueta JSP?

No en el momento de escribir esto. Leí en alguna parte que lo han reservado, la palabra clave instanceof , en EL, puede ser para el futuro. Además, hay una biblioteca disponible que tiene esta etiqueta específica. Investigue eso antes de decidir crear una etiqueta personalizada para usted. Aquí está el enlace, Biblioteca de etiquetas no estándar .

Un método sería crear una biblioteca de etiquetas personalizada y usar el polimorfismo dentro de ella para manejar el caso donde un Person es-a Employee.

No he hecho esto desde hace tiempo para JSP, pero frecuentemente uso una técnica similar en GSP (Groovy / Grails Server Pages).

De lo contrario, podría poner algo de lógica en el JSP (no ideal) para probar <=> - ness:

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

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()
}

Tu JSP se vería así

<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 Class ya tiene esto ...

<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 el método `isEmployee () '.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top