2

我怎样才能达到变量的子类属性。正如您所看到的 Primefaces 示例,我可以访问 Car.color、Car.shape 等属性,但我想要的是“Car.PriceInformations.Price”。我试过 car[column.property][column.subproperty] 但它没有用。我必须使用子表还是有更好的解决方案?

<p:dataTable id="cars" var="car" value="#{tableBean.carsSmall}" filteredValue="#{tableBean.filteredCars}">                      
    <p:columns value="#{tableBean.columns}" var="column" columnIndexVar="colIndex"   
                sortBy="#{car[column.property]}" filterBy="#{car[column.property]}">  
        <f:facet name="header">  
            #{column.header}  
        </f:facet>  

        #{car[column.property]}  
    </p:columns>  

</p:dataTable>
4

2 回答 2

1

您可以根据需要修改此 BalusC 答案。

基本上,您可以在将SpringBeanFacesELResolver其用于 EL 解析器时进行扩展。但是,EL 解析器正在 Spring 上下文中寻找 Spring Bean。源代码很好地理解了 SpringBenFacesELResolver 的作用。

其次,您需要javax.el.BeanELResolver访问 BalusC 答案中描述的托管 bean 值。为此,我使用 Java 反射。javax.el.BeanELResolver可以SpringBeanFacesELResolver在运行时动态加载,然后调用SpringBeanFacesELResolver#getValue嵌套属性,就像在引用的答案中一样。

这是代码:

public class ExtendedSpringELResolver extends SpringBeanFacesELResolver {

@Override
public Object getValue(ELContext context, Object base, Object property)
{
    if (property == null || base == null || base instanceof ResourceBundle || base instanceof Map || base instanceof Collection) {
        return null;
    }

    String propertyString = property.toString();

    if (propertyString.contains(".")) {
        Object value = base;
        Class []params=  new Class[]{ELContext.class,Object.class,Object.class};
        for (String propertyPart : propertyString.split("\\.")) {

            Class aClass = BeanELResolver.class;

            try {
                Method getValueMethod = aClass.getDeclaredMethod("getValue",params );
                value = getValueMethod.invoke(aClass.newInstance(), context, value, propertyPart);
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        return value;
    }
    else {
        return super.getValue(context, base, property);
    }

}

}

PS我用PrimeFaces 展示中的示例尝试了代码。我更改String colorColor colorwhere Coloris a user defined class for my case,它只有一个 String 比例。我通过添加color.color到列列表来访问这些值。

private String columnTemplate = "model manufacturer year color.color";
于 2013-05-22T13:59:33.270 回答
0

如果您的表 bean 中的唯一集合是TableBean#carsSmall,那么不要<p:columns>在您的 JSF 页面中使用。

<p:dataTable var="car" value="#{tableBean.carsSmall}>
   <p:column headerText="Car brand">
      <h:outputText value="#{car.manufacturer.name}" />
   </p:column>
   <p:column headerText="Color">
      <h:outputText value="#{car.color.name}" />
      <h:outputText value="#{car.color.code}" />
   </p:column>
</p:dataTable>

并且不要忘记在您的TableBean,ManufacturerColor类中创建正确的 getter 和 setter(因为您的类将具有不同的名称)。

于 2013-05-22T08:14:22.897 回答