Jsf 使用会话中存储的值更改标签值

Jsf 使用会话中存储的值更改标签值,jsf,oracle-adf,session-scope,Jsf,Oracle Adf,Session Scope,我有两个jsf页面(home.jsf和employees.jsf), 主页上有一个按钮,可以导航到员工页面, 导航时,我将值存储在会话范围中 at(托管bean) 我想根据使用以下groovy表达式在会话中存储的值,从UIHitts选项卡更改employees viewObject的标签 adf.context.sessionScope.key 并将trustMode更改为trusted,但引发以下异常 oracle.jbo.script.ExprScriptException: JBO-29

我有两个jsf页面(home.jsf和employees.jsf), 主页上有一个按钮,可以导航到员工页面, 导航时,我将值存储在会话范围中 at(托管bean)

我想根据使用以下groovy表达式在会话中存储的值,从UIHitts选项卡更改employees viewObject的标签

adf.context.sessionScope.key
并将trustMode更改为trusted,但引发以下异常

oracle.jbo.script.ExprScriptException: JBO-29114 ADFContext is not setup to process messages for this exception. Use the exception stack trace and error code to investigate the root cause of this exception. Root cause error code is JBO-25188. Error message parameters are {0=Employees.FirstName, 1=, 2=oracle.jbo.script.ExprSecurityException}
at oracle.jbo.script.ExprScriptException.throwException(ExprScriptException.java:316)
at oracle.jbo.script.ExprScriptException.throwExceptionWithExprDef(ExprScriptException.java:387)
at oracle.jbo.ExprEval.processScriptException(ExprEval.java:599)
at oracle.jbo.ExprEval.doEvaluate(ExprEval.java:697)
at oracle.jbo.ExprEval.evaluate(ExprEval.java:508)
at oracle.jbo.ExprEval.evaluate(ExprEval.java:487)
at oracle.jbo.common.NamedObjectImpl.resolvePropertyRaw(NamedObjectImpl.java:680)
at oracle.jbo.server.DefObject.resolvePropertyRaw(DefObject.java:366)

在VO UIHint属性标签级别执行此操作的一种方法是programmaticaly,方法如下:

  • 在VO中,转到java选项卡并添加RowImpl java类
  • 在VORowImpl中添加以下函数

    public String getMySessionLabel() {     
        return (String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("key");
    }
    
  • 在标签中添加以下EL表达式:

    adf.object.getMySessionLabel()
    
例如,如果您想做的不仅仅是从会话中获取信息,那么这种技术允许您比纯EL进行更多的控制。在你的情况下,纯EL,正如你所做的,也应该起作用。(需要检查一下你的电脑有什么问题,可能只是错过了

        #{adf.context.sessionScope.key}

如果您试图从viewRowImpl中的方法获取标签,那么每行至少执行一次。我认为此解决方案不适合您的情况

总之,ADF作为一个框架在EL中添加了强大的策略和验证,尤其是在12.2.x版本中

您的案例解决方案如下:

  • 在扩展oracle.jbo.script.ExprSecurityPolicy类的模型层中创建新类
  • 重写checkProperty方法

    @Override
    public boolean checkProperty(Object object, String string, Boolean b) {
        if (object.getClass().getName().equals("oracle.adf.share.http.ServletADFContext") && string.equals("sessionScope")) {
            return true;
        }
        return super.checkProperty(object, string, b);
    }
    
  • 打开adf-config.xml源代码,并在启动标记中设置类ExprSecurityPolicy属性

  • 比如:

    <startup ExprSecurityPolicy="model.CustomExprSecurityPolicy">
    
    
    
    为什么不将bean链接到RequestScope中的home.jsf,这样您就可以从bean而不是会话中获取employee.jsf中的值。(图21-3作用域和页面流之间的关系:)。如果不是针对与用户相关的非关键数据,则必须避免在会话中存储。您确定在会话中存储是正确的方法吗?是的,我希望数据存储在会话中。它与用户相关。我可以使用表达式#{sessionScope.key}从页面属性更改它,但在需要从viewObject处理它们一次的每个页面上更改它们都需要时间
    <startup ExprSecurityPolicy="model.CustomExprSecurityPolicy">