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

StackOverflow https://stackoverflow.com/questions/254737

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top