tag de feijão JSP para propriedade que talvez não exista
Pergunta
Em JSP I pode fazer referência a propriedade de um bean usando a tag $ {Object.property}
Existe alguma maneira de lidar com propriedades que pode não existir? Eu tenho uma página JSP que precisa lidar com diferentes tipos. Exemplo:
public class Person {
public String getName()
}
public class Employee extends Person {
public float getSalary()
}
Em JSP eu quero exibir uma tabela de pessoas com colunas de nome e salário. Se a pessoa não é um empregado, em seguida, o salário deve estar em branco. O HTML linha pode parecer:
<tr>
<td><c:out value="${person.name}"></td>
<td><c:out value="${person.salary}"></td>
</tr>
Infelizmente, se pessoa não é um empregado, então ele pode não encontrar salário e ocorre um erro. Como eu iria resolver isso em JSP?
Edit:? Existe um instanceof check in JSP linguagem tag
Solução
Basta usar o operador vazio EL se fosse um atributo de escopo, infelizmente você vai ter que ir com ao redor de sua expressão usando EMPREGADOS.SALÁRIO com
<c:catch var="err">
<c:out value="${employee.salary}"/>
</c:catch>
Se você realmente precisa instanceof , você pode considerar uma marca personalizada.
Outras dicas
Se você quer a classe, é só usar ${person.class}
. Você também pode usar ${person.class.name eq 'my.package.PersonClass'}
Você também pode usar o "default" em c:. Out
<c:out value='${person.salary}' default="Null Value" />
Concise, mas desmarcada.
<tr>
<td>${person.name}</td>
<td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td>
</tr>
Existe uma verificação de instanceof em JSP linguagem tag?
Não no momento da redação deste texto. Eu li em algum lugar que eles têm reservado-lo, instanceof palavra-chave, em EL, pode ser para o futuro. Além disso, há uma disponível biblioteca que tem essa marca específica. Olhar para isso antes de decidir criar alguma marca personalizada para si mesmo. Aqui está o link, Unstandard Tag Biblioteca .
Um método seria a criação de uma biblioteca de marcas personalizadas e polimorfismo uso dentro dele para lidar com o caso em que um Person
é-um Employee
.
Eu não tenho feito isso em um tempo para JSP, mas frequentemente usam uma técnica semelhante no SGP (Server Pages Groovy / Grails).
Caso contrário, você poderia colocar alguma lógica na JSP
(não ideal) para testar Employee
-ness:
<%
String salary
if (person instanceof Employee) {
salary = person.salary
} else {
salary = "" // or ' '
}
%>
<td><c:out value="${salary}"></td>
Você pode sempre ter um 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()
}
Seu JSP seria parecido
<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>
É claro que a classe Classe já tem essa ...
<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>
Você também pode ter método `isEmployee ()'.