如何到达变量的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>
答案 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>
不要忘记在TableBean
,Manufacturer
和Color
课程中创建合适的getter和setter(因为您的课程名称不同)。