Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 属性的JSP bean标记可能不存在_Java_Jsp_Jsp Tags_Javabeans - Fatal编程技术网

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

Java 属性的JSP bean标记可能不存在,java,jsp,jsp-tags,javabeans,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中,我想显示一个包含姓名和薪水列的人员表。如果此人不是员工,则工资应为空。行HTM

在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标记语言的实例?

您可以始终有一个类型字段

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>

当然班上已经有了这个

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

一种方法是创建一个自定义标记库,并在其中使用多态性来处理
人员
员工
的情况

我已经有一段时间没有为JSP做这项工作了,但经常在GSP(Groovy/Grails服务器页面)中使用类似的技术

否则,您可以在
JSP
(不理想)中放入一些逻辑来测试
员工的
-ness:

<% 
   String salary
   if (person instanceof Employee) {
       salary = person.salary
   } else {
       salary = "" // or '&nbsp;'
   }
%>
<td><c:out value="${salary}"></td>

如果EL empty运算符是作用域属性,则只需使用它,不幸的是,您将不得不使用employee.salary来包围表达式:



如果你真的需要实例,你可以考虑一个自定义标签。

< P>如果你想要这个类,只要使用<代码> ${No.class }。您还可以使用
${person.class.name eq'my.package.PersonClass'}

您还可以在c:out上使用“default”

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

简洁,但未选中

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

${person.name}
${person.class.simpleName=='Employee'?person.salary:'}
JSP标记语言中是否有check实例


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

我知道有一个更简单的方法。。。啊!使用Tomcat 5.5,如果对象上的属性实际不存在(如上图所示),则会引发异常。已确认,如果此人没有salary属性,则此操作不起作用。对于我的粗心大意,我深表歉意。我不想这么说,但是你可能不得不用c:catch标签来做这个。我想知道一个
${pageContext[“errorData”]
是否存在,而catch确实是防止空指针异常的唯一方法。我希望EL更好,但我们现在就在这里。这正是我想要的!我使用一个标记和类的simpleName属性,并且我可以显示我的每个子类的唯一字段。
<tr>
    <td>${person.name}</td>    
    <td>${person.class.simpleName == 'Employee' ? person.salary : ''}</td>
</tr>