6

在 JSP 中,我可以使用标记 ${object.property} 来引用 bean 的属性

有没有办法处理可能不存在的属性?我有一个需要处理不同类型的 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 中解决这个问题?

编辑: JSP 标记语言中是否有instanceof检查?

4

5 回答 5

7

如果它是一个作用域属性,只需使用 EL 空运算符,不幸的是,您必须使用带有 <c:catch> 的employee.salary 来包围您的表达式:

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

如果您真的需要instanceof,您可以考虑使用自定义标签。

于 2008-10-31T20:11:55.397 回答
4

如果你想上课,只需使用${person.class}. 你也可以使用${person.class.name eq 'my.package.PersonClass'}

您还可以在 c:out 上使用“默认值”。

 <c:out value='${person.salary}' default="Null Value" />
于 2008-10-31T21:02:37.260 回答
3

简洁,但未经检查。

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

JSP标签语言中是否有instanceof检查?

在写这篇文章的时候还没有。我在某处读到他们已经保留了它, EL 中的instanceof关键字可能是为了将来。此外,还有一个具有此特定标签的库。在决定为自己创建一些自定义标签之前,请先调查一下。这是链接,非标准标签库

于 2008-12-10T13:46:44.310 回答
1

一种方法是创建一个自定义标签库并在其中使用多态性来处理 a 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>
于 2008-10-31T20:05:55.453 回答
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>

当然 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()' 方法。

于 2008-10-31T20:03:21.607 回答