Primefaces动态表属性

时间:2013-05-22 07:52:38

标签: jsf jsf-2 primefaces

如何到达变量的subClass属性。正如你可以看到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>

2 个答案:

答案 0 :(得分:1)

您可以根据需要修改this BalusC answer

基本上,当您将其用于EL解析器时,您可以扩展SpringBeanFacesELResolver。但是,EL解析器正在寻找Spring Context中的Spring Bean。 Source code非常了解SpringBenFacesELResolver的用途。

其次,您需要javax.el.BeanELResolver来访问BalusC答案中描述的托管bean值。我为此目的使用Java Reflections。可以在运行时动态地在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);
    }

}

}

P.S。我使用PrimeFaces showcase中的示例尝试了代码。我将String color更改为Color color,其中Color是我的案例的用户定义类,只有字符串比例。我通过将color.color添加到列列表来访问这些值。

private String columnTemplate = "model manufacturer year color.color";

答案 1 :(得分:0)

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

<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>

不要忘记在TableBeanManufacturerColor课程中创建合适的getter和setter(因为您的课程名称不同)。