【问题标题】:change label value using value stored at session使用存储在会话中的值更改标签值
【发布时间】:2018-03-06 17:18:39
【问题描述】:

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

    public void putSessionAL(ActionEvent actionEvent) {
    FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("key","value");
}

public String navigate() {
    return "employees";
}

我想根据使用以下 groovy 表达式在会话中存储的值从 UIHints 选项卡更改员工 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)

【问题讨论】:

  • 为什么不在 RequestScope 中将 bean 链接到 home.jsf,这样您就可以从 bean 而不是从会话中获取employee.jsf 中的值。 (图 21-3 范围和页面流之间的关系:docs.oracle.com/cd/E15051_01/web.1111/b31974/…)。如果不是与用户相关的非关键数据,则必须避免在会话中存储。您确定在会话中存储是正确的方法吗?
  • 是的,我希望将数据存储在 session 中。它与用户有关。我可以使用表达式#{sessionScope.key} 从页面属性中更改它,但是在我需要从 viewObject 处理一次的每个页面上更改它们需要时间

标签: jsf oracle-adf session-scope


【解决方案1】:

如果您尝试从 viewRowImpl 中的方法获取标签。所以这将对每一行至少执行一次。我认为这个解决方案不适合你的情况。

无论如何,ADF 作为一个框架,通常在 EL 中添加了强大的策略和验证,尤其是在 12.2.x 版本中。

您的解决方案如下:

  1. 在扩展 oracle.jbo.script.ExprSecurityPolicy 类的模型层中创建新类
  2. 重写 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);
    }
    
  3. 打开 adf-config.xml 源并在启动标记中设置您的类 ExprSecurityPolicy 属性。

喜欢:

<startup ExprSecurityPolicy="model.CustomExprSecurityPolicy">

【讨论】:

    【解决方案2】:

    在 VO UIHint 属性标签级别执行此操作的一种方法将通过以下方式以编程方式进行:

    • 在您的 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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-24
      • 2015-03-12
      • 2019-05-02
      • 2011-01-20
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 2014-07-11
      相关资源
      最近更新 更多