可能不存在的属性的JSP bean标记

时间:2008-10-31 19:55:18

标签: java jsp jsp-tags javabeans

在JSP中,我可以使用标记来引用bean的属性 $ {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 个答案:

答案 0 :(得分:7)

如果它是一个范围属性,只需使用EL空运算符,不幸的是,你必须使用employee.salary和&lt; c:catch&gt;来围绕你的表达式:

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

如果您确实需要 instanceof ,则可以考虑自定义标记。

答案 1 :(得分:4)

如果您想要课程,请使用${person.class}。您也可以使用${person.class.name eq 'my.package.PersonClass'}

你也可以在c:out。上使用“默认”。

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

答案 2 :(得分:3)

简洁但未经检查。

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

是否有JSP标记语言检查实例?

不是写这篇文章的那一刻。我在某地读过他们保留了它,EL中的 instanceof 关键字可能是为了将来。此外,还有一个具有此特定标签的库。在决定为自己创建一些自定义标记之前,请先查看。这是链接Unstandard Tag Library

答案 3 :(得分:1)

一种方法是创建自定义标记库并在其中使用多态来处理Person 是-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>

答案 4 :(得分: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()'方法。