【问题标题】:JSP bean tag for property that might not exist可能不存在的属性的 JSP bean 标记
【发布时间】:2010-09-20 06:19:27
【问题描述】:

在 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 中解决这个问题?

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

【问题讨论】:

    标签: java jsp jsp-tags javabeans


    【解决方案1】:

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

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

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

    【讨论】:

    • 知道有一个更简单的方法... DOH!
    • 使用 Tomcat 5.5,如果该属性实际上不存在于对象上,如上例所示,则会引发异常。
    • 已确认,如果此人没有薪水财产,则此方法无效。
    • 我为我的粗心道歉。我不想这么说,但您可能必须为此使用 c:catch 标记。
    • +1 也为我工作。我想知道 ${pageContext["errorData"] 的存在,而 catch 确实是防止空指针异常的唯一方法。我对 EL 的期望会更好,但我们到了。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这正是我想要的!我使用 标记和类的 simpleName 属性,并且可以显示每个子类的唯一字段。
    【解决方案3】:

    简洁,但未经检查。

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        你总是可以有一个类型字段。

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

        【讨论】:

          猜你喜欢
          • 2011-09-05
          • 2015-06-29
          • 1970-01-01
          • 2015-06-02
          • 2021-02-24
          • 2012-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多