Тег bean-компонента JSP для свойства, которое может не существовать - PullRequest
6 голосов
/ 31 октября 2008

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

Ответы [ 5 ]

7 голосов
/ 31 октября 2008

Просто используйте пустой оператор EL, если это был атрибут scoped, к сожалению, вам придется ограничить выражение, используя employee.salary с :

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

Если вам действительно нужно instanceof , вы можете рассмотреть пользовательский тег.

4 голосов
/ 01 ноября 2008

Если вы хотите класс, просто используйте ${person.class}. Вы также можете использовать ${person.class.name eq 'my.package.PersonClass'}

Вы также можете использовать «по умолчанию» на c: out.

 <c:out value='${person.salary}' default="Null Value" />
3 голосов
/ 10 декабря 2008

Кратко, но не проверено.

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

Есть ли экземпляр проверки на языке тегов JSP?

Не на момент написания этой статьи. Я где-то читал, что они зарезервировали его, ключевое слово instanceof в EL может быть на будущее. Кроме того, есть библиотека, которая имеет этот специальный тег. Посмотрите на это, прежде чем создать собственный тег для себя. Вот ссылка, Библиотека нестандартных тегов .

1 голос
/ 31 октября 2008

Один из методов - создать собственную библиотеку тегов и использовать в ней полиморфизм для обработки случая, когда Person is-a Employee.

Я давно не делал этого для JSP, но часто использую подобную технику в GSP (Groovy / Grails Server Pages).

В противном случае вы можете поместить некоторую логику в JSP (не идеально), чтобы проверить Employee -ness:

<% 
   String salary
   if (person instanceof Employee) {
       salary = person.salary
   } else {
       salary = "" // or '&nbsp;'
   }
%>
<td><c:out value="${salary}"></td>
0 голосов
/ 31 октября 2008

Вы всегда можете иметь поле типа.

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

...