在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标记语言?
答案 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 ' '
}
%>
<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()'方法。