Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.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 JSF和表达式语言:仅当存在时绑定属性_Java_Jsf_El - Fatal编程技术网

Java JSF和表达式语言:仅当存在时绑定属性

Java JSF和表达式语言:仅当存在时绑定属性,java,jsf,el,Java,Jsf,El,将datacolumn绑定到数据源中可能存在或不存在的属性的最佳方法是什么 例如,当您有一个类层次结构,其中一些子类可能属于具有该属性的子类型时,就会发生这种情况。数据源包含各种子类类型 <DataColumn outputText="#{item.property}" /> 当某个子类中不存在属性时,始终生成PropertyNotFoundException。我不想在基类中包含属性,因为根据业务规则,它不应该在基类中 如何解决这个问题?为什么不使用基类的布尔属性来告诉您在子类

将datacolumn绑定到数据源中可能存在或不存在的属性的最佳方法是什么

例如,当您有一个类层次结构,其中一些子类可能属于具有该属性的子类型时,就会发生这种情况。数据源包含各种子类类型

<DataColumn outputText="#{item.property}" />

当某个子类中不存在属性时,始终生成PropertyNotFoundException。我不想在基类中包含属性,因为根据业务规则,它不应该在基类中


如何解决这个问题?

为什么不使用基类的布尔属性来告诉您在子类中是否具有实际属性。这样,您可以在EL表达式中轻松使用三元运算符,如下所示:

<DataColumn outputText="#{item.hasProperty ? item.property : 'I don't have this property.'}" />


如果EL惰性地计算表达式,这可能会起作用,但我不确定,现在无法检查它。但无论如何,这是一个开始的想法。

在不更改类的情况下,最好的办法是在EL中执行某种类型的
实例。您可以通过检查由and then或EL获得的(简单)类名来实现这一点

假设具有该属性的类具有完整的限定名
com.example.SubItem
,下面是一个示例:

<h:outputText value="#{item.property}" rendered="#{item.class.name == 'com.example.SubItem'}" />


根据您的模型,我认为您可能希望在支持bean中做更多的工作,而不是尝试在实际的JSF页面上工作

您只需将表绑定到bean即可

<h:dataTable binding="#{myBean.dataTable}" />

//BEAN
HtmlDataTable dataTable;

public DataTable getDataTable()
{
  dataTable = new HtmlDataTable(); //etc...
  //add the columns here based on the logic in code
}

//豆子
HtmlDataTable数据表;
公共数据表getDataTable()
{
dataTable=新的HtmlDataTable();//等等。。。
//根据代码中的逻辑在此处添加列
}
然后通过动态添加组件等方式在bean内部进行渲染。。。如果您希望分离模型,并且需要页面成为一个非常受控制的bean,那么上面的答案实际上是您所追求的


或者,按照建议,只需使用rendered属性并检查类名(注意空指针)。我经常都这样做,这实际上取决于实际JSF中的布尔逻辑有多复杂。

我认为在这种情况下,最好的方法是为视图层创建一个带有所有必要字段的自定义实体,并将要显示的项转换为它。

作为在EL中提供
instanceof
功能的替代方法,您可以考虑在<代码>应用程序范围> <代码> bean中添加一个<代码> ISStIsNoFF()/Case>方法。我用的是:

@ManagedBean( name="app" )
@ApplicationScoped
public class ApplicationController implements Serializable {
    public boolean isInstanceOf( Object o, String className ) throws ClassNotFoundException {
        return Class.forName( className ).isInstance( o );
    }
}
然后我从EL开始称之为:

<... rendered="#{app.isInstanceOf( someObject, 'java.lang.Object' )}">


通过一些调整,这个想法可以被推广,以便于从EL调用任何静态方法。

我在尝试使用#{item.class}时遇到了一个问题,但是可以很好地处理#{item.getClass()}如果事先不知道这个类,你知道怎么做吗?
<... rendered="#{app.isInstanceOf( someObject, 'java.lang.Object' )}">