【问题标题】:evaluate EL expression within String value评估字符串值内的 EL 表达式
【发布时间】:2013-07-17 23:36:52
【问题描述】:

是否可以评估保存在字符串值中的 el 表达式,例如托管 bean 变量中?

简而言之:是否可以进行双重评估?

@ManagedBean(name = "bean")
@ViewScoped
public class Bean 
{
    private final String name = "bar";
    private final String nameEl = "foo #{bean.name} foo #{bean.name}";

    public String getName()
    {
        return this.name;
    }

    public String getNameEl()
    {
        return this.nameEl;
    }
}

<h:outputText value="#{bean.nameEl}" escape="false"/>

输出是:foo #{bean.name} foo #{bean.name}

希望的输出应该是:foo bar foo bar

想法:

el 函数可以解决这个问题。

【问题讨论】:

    标签: jsf el


    【解决方案1】:

    您可以使用Application#evaluateExpressionGet() 将字符串作为EL 表达式求值并获取结果。

    FacesContext context = FacesContext.getCurrentInstance();
    Object result = context.getApplication().evaluateExpressionGet(context, nameEL, Object.class);
    // ...
    

    在 OmniFaces 中,这在 Faces 类中也可用。

    Object result = Faces.evaluateExpressionGet(nameEL);
    // ...
    

    【讨论】:

    • 这对于el表达式和它们之间的其他文本内容的多次出现也是可能的吗?抱歉,我的示例对于用例来说不够好。将编辑问题。
    • 不知道这个想法是为了用单个 el 表达式检索单个实例。感谢您的快速回答。我的想法是将 CDN 资源库 url 保存到具有丰富 html 内容的数据库描述列中。但这可能是一个安全风险,即使它不是公开的,因为可以调用函数。但这些信息仍然很值得了解。
    • 如果nameEL 可以被最终用户操作,安全风险确实很高。它将允许最终用户执行任意 EL 表达式。
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2022-01-17
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多