Тег bean-компонента JSP для свойства, которое может не существовать
Вопрос
В JSP я могу ссылаться на свойство компонента с помощью тега $ {Object.property}
Есть ли способ справиться со свойствами, которые могут не существовать? У меня есть страница JSP, которая должна иметь дело с различными типами. Пример: р>
public class Person {
public String getName()
}
public class Employee extends Person {
public float getSalary()
}
В JSP я хочу отобразить таблицу людей со столбцами имени и зарплаты. Если человек не работник, то зарплата должна быть пустой. Строка HTML может выглядеть следующим образом:
<tr>
<td><c:out value="${person.name}"></td>
<td><c:out value="${person.salary}"></td>
</tr>
К сожалению, если человек не является сотрудником, он не может найти зарплату, и возникает ошибка. Как бы я решить эту проблему в JSP?
Изменить: есть ли проверка instanceof на языке тегов JSP?
Решение
Просто используйте пустой оператор EL, если это был атрибут scoped, к сожалению, вам придется ограничить выражение, используя employee.salary с помощью < c: catch >:
<c:catch var="err">
<c:out value="${employee.salary}"/>
</c:catch>
Если вам действительно нужен instanceof , вы можете рассмотреть пользовательский тег.
Другие советы
Если вам нужен класс, просто используйте ${person.class}
. Вы также можете использовать ${person.class.name eq 'my.package.PersonClass'}
Вы также можете использовать " default " на c: out.
<c:out value='${person.salary}' default="Null Value" />
Кратко, но не проверено.
<tr>
<td>${person.name}</td>
<td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td>
</tr>
Есть ли экземпляр проверки на языке тегов JSP?
Не на момент написания этой статьи. Я где-то читал, что они зарезервировали его, ключевое слово instanceof в EL может быть на будущее. Кроме того, есть библиотека, которая имеет этот специальный тег. Посмотрите на это, прежде чем создать собственный тег для себя. Вот ссылка, Библиотека нестандартных тегов . Р>
Один из методов - создать собственную библиотеку тегов и использовать в ней полиморфизм для обработки случая, когда Person
is-a Employee
.
Я давно не делал этого для JSP, но часто использую подобную технику в GSP (Groovy / Grails Server Pages).
В противном случае вы можете поместить некоторую логику в JSP
(не идеально) для проверки на <=> - ness:
<%
String salary
if (person instanceof Employee) {
salary = person.salary
} else {
salary = "" // or ' '
}
%>
<td><c:out value="${salary}"></td>
У вас всегда может быть поле типа.
public class Person {
public String getType() { return "Person"; }
public String getName()
}
public class Employee extends Person {
public String getType() { return "Employee"; }
public float getSalary()
}
Ваш JSP будет выглядеть так
<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>
Конечно, класс Class уже имеет это ...
<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>
Вы также можете использовать метод isEmployee (). Р>