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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top