java - 嵌套 JSF 表达式字符串

标签 java jsf-2 el

我想使用值表达式的动态参数来实现这一点:

<h:dataTable value="#{someBean.someValue}" var="field">
    <h:column>#{anotherBean[field]}</h:column>
</h:dataTable>

其中 field'user.name''location.address.zip' 或...

这可能吗?

请注意,这是一个简单的示例,我对 ValueExpression 感兴趣,而不是对 dataTable 组件感兴趣。

更新 现在的问题是:如何替换标准的 BeanELResolver?

查看 ELUtils:

    ...
    composite.addRootELResolver(IMPLICIT_RESOLVER);
    composite.add(FLASH_RESOLVER);
    composite.addPropertyELResolver(COMPOSITE_COMPONENT_ATTRIBUTES_EL_RESOLVER);
    addELResolvers(composite, associate.getELResolversFromFacesConfig());
    addVariableResolvers(composite, FacesCompositeELResolver.ELResolverChainType.Faces,
            associate);
    addPropertyResolvers(composite, associate);
    composite.add(associate.getApplicationELResolvers());
    composite.addRootELResolver(MANAGED_BEAN_RESOLVER);
    composite.addPropertyELResolver(RESOURCE_RESOLVER);
    composite.addPropertyELResolver(BUNDLE_RESOLVER);
    ...

但我还没有完全理解解析器链...所以我会去学习:)

更新 2

此代码有效;)

public class ExtendedBeanELResolver extends BeanELResolver
{
    @Override
    public Object getValue(ELContext context, Object base, Object property) throws NullPointerException, PropertyNotFoundException, ELException
    {
        try
        {
            return super.getValue(context, base, property);
        }
        catch(PropertyNotFoundException e)
        {
            try
            {
                Object value = base;

                for(String part : property.toString().split("\\."))
                {
                    value = super.getValue(context, value, part);
                }

                return value;
            }
            catch(PropertyNotFoundException e1)
            {
                context.setPropertyResolved(false);
            }
        }

        return null;
    }
}

最佳答案

这是默认不支持的。您需要一个自定义 ELResolver 在这里。最简单的是扩展现有的 BeanELResolver .

这是一个启动示例:

public class ExtendedBeanELResolver extends BeanELResolver {

    @Override
    public Object getValue(ELContext context, Object base, Object property)
        throws NullPointerException, PropertyNotFoundException, ELException
    {
        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;

            for (String propertyPart : propertyString.split("\\.")) {
                value = super.getValue(context, value, propertyPart);
            }

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

}

要让它运行,请按如下方式在 faces-config.xml 中注册它:

<application>
    <el-resolver>com.example.ExtendedBeanELResolver</el-resolver>
</application>

关于java - 嵌套 JSF 表达式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694311/

相关文章:

java - 这个类应该位于 JSP Web 应用程序的 ServletContext 或 session 范围内吗?

java - 在具有相同密度的不同 Android 设备上不同的 throw (滑动)速度

jsf-2 - 如何从服务器端执行javascript方法?

jsf - 如何在 JSF 验证器中传递第二个值?

jsf - jsf中#{expr}和${expr}有什么区别?是否有我们应该更喜欢 ${expr} 的情况?

java - 使用java创建CSV文件

javascript - JSF .xhtml 页面中的谷歌地址自动完成 - 有什么例子吗?

java - foreach 标签中的单独项目 (jSTL)

jsp - JSP 中未计算 EL 表达式

java - 在 JVM 启动时从 .jar 中的 .properties 文件设置属性