Jsf 以编程方式获取facelets参数(变量)的表达式值

Jsf 以编程方式获取facelets参数(变量)的表达式值,jsf,facelets,el,converter,Jsf,Facelets,El,Converter,以下java代码允许从faces上下文访问任何对象或变量: ELContext elCtx = facesContext.getELContext(); ExpressionFactory exprFac = facesContext.getApplication().getExpressionFactory(); MyProperty myProperty = (MyProperty) exprFac.createValueExpression(elCtx, "#{somebean.somea

以下java代码允许从faces上下文访问任何对象或变量:

ELContext elCtx = facesContext.getELContext();
ExpressionFactory exprFac = facesContext.getApplication().getExpressionFactory();
MyProperty myProperty = (MyProperty) exprFac.createValueExpression(elCtx, "#{somebean.someattr.someproperty}", MyProperty.class).getValue(elCtx);
我使用自定义转换器中的代码从上下文中读取其他转换参数

如果在JSF上下文中将
#{somebean}
定义为正常的支持bean,则代码可以正常工作

Facelets允许创建JSF表达式的“快捷方式”。例如:

<ui:param name="shortcut" value="#{somebean.someattr.someproperty}" />
<div>#{somebean.someattr.someproperty} equals #{shortcut}</div>

有没有办法访问facelets上下文并读取当前JSF页面上定义的“快捷方式”参数值?

上下文中似乎不存在facelets快捷方式,我尝试在其中访问它们

我做了以下变通:在放置输入元素的JSF页面上,我添加了一个
元素作为我的转换器输入的子元素

<h:inputText id="myid" value="#{action.myinput}">
     <f:converter converterId="myConverter" />
     <f:param name="converterParameters" shortcut="#{somebean.someattr.someproperty}"/>
</h:inputText>

我遇到了同样的问题,并选择了以下方法:

/**
     * Führt eine Expression im aktuellen Faces EL Context 
     * UND im Facelets El Context aus.
     * 
     * @param facesContext
     * @param expression
     * @return object
     */
    private static Object executeExpressionInUIContext (final FacesContext facesContext, final String expression) {
        final ELContext elContext = facesContext.getELContext();
        final Application application = facesContext.getApplication();

        Object result = executeExpressionInElContext(application, elContext, expression);
        if (null == result) {
            FaceletContext faceletElContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
            result = executeExpressionInElContext(application, faceletElContext, expression);
        }
        return result;
    }

    private static Object executeExpressionInElContext (Application application, ELContext elContext, String expression) {
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        ValueExpression exp = expressionFactory.createValueExpression(elContext, expression, Object.class);
        return exp.getValue(elContext);
    }
“ui:param”是Facelet视图处理技术的一部分。Facelets扩展了JSF。 这两种技术在存储变量时都使用自己的上下文。 在Faces El上下文旁边有一个Facelet El上下文(FaceletContext)


所述方法在两种上下文中计算表达式。请注意,如果在每个上下文中以相同的名称存储两个值,这将不起作用。

上下文中不存储
ui:param
的映射,它位于每个
ValueExpression
VariableMapper
中。 因此,如果您需要依靠另一个
ValueExpression
的varMapper以编程方式创建
ValueExpression
,您可以执行以下操作:

VariableMapper varMapper = new DefaultVariableMapper();
varMapper.setVariable(mappingName, component.getValueExpression(mappedAttributeName));
return new ValueExpressionImpl(expression, null, null, varMapper, expectedType);

非常感谢。不幸的是,它似乎只适用于JSF2.0。方法
getAttributes()
目前在我的项目中不可用。我们必须升级到最新的JSF版本。
/**
     * Führt eine Expression im aktuellen Faces EL Context 
     * UND im Facelets El Context aus.
     * 
     * @param facesContext
     * @param expression
     * @return object
     */
    private static Object executeExpressionInUIContext (final FacesContext facesContext, final String expression) {
        final ELContext elContext = facesContext.getELContext();
        final Application application = facesContext.getApplication();

        Object result = executeExpressionInElContext(application, elContext, expression);
        if (null == result) {
            FaceletContext faceletElContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
            result = executeExpressionInElContext(application, faceletElContext, expression);
        }
        return result;
    }

    private static Object executeExpressionInElContext (Application application, ELContext elContext, String expression) {
        ExpressionFactory expressionFactory = application.getExpressionFactory();
        ValueExpression exp = expressionFactory.createValueExpression(elContext, expression, Object.class);
        return exp.getValue(elContext);
    }
VariableMapper varMapper = new DefaultVariableMapper();
varMapper.setVariable(mappingName, component.getValueExpression(mappedAttributeName));
return new ValueExpressionImpl(expression, null, null, varMapper, expectedType);