2008-10-31 2 views
6

В JSP я могу ссылаться на свойства бина с помощью тега $ {} объект.свойствоJSP боб тег для имущества, которое не может существовать

Есть ли какой-нибудь способ иметь дело со свойствами, которые не могут существовать? У меня есть страница 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-тегов?

ответ

7

Просто используйте пустой оператор EL IF это был Scoped атрибут, к сожалению, вы будете иметь идти с окружающим ваше выражение с помощью employee.salary с < с: улов >:

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

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

+0

I _knew_ был более простой способ ... DOH! – 2008-10-31 20:16:29

+0

Используя Tomcat 5.5, это вызовет исключение, если свойство на самом деле не существует на объекте, как в примере, показанном выше. – laz 2008-10-31 20:51:06

0

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

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> 

Конечно класс класса уже есть это ...

<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() метод».

1

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

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

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

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

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

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

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

Краткое, но неконтролируемое.

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

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

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