Jsf 以编程方式获取facelets参数(变量)的表达式值
以下java代码允许从faces上下文访问任何对象或变量: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
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);