在VO中引用Controller层中的Session State的两种方法

http://blogs.oracle.com/smuenchadf/resource/examples中的第154个Example,Steven介绍了两种将Controller层中的值绑定给View Object中的变量的方法,其中的Session State可以理解为对应的一个Session值。

1,在adf.userSession.userData中保存Controller层传递过来的值,引用值的Groovy表达式为:adf.userSession.userData.FlavoriteColor。Steven推荐使用这种方法。

1)在Application Module中定义一个变量的Get/Set方法

    public String getSessionFavoriteColor() {
      return (String)getDBTransaction().getSession().getUserData().get(FAVORITE_COLOR);
        
    }
    public void setSessionFavoriteColor(String color) {
        String previousFavoriteColor = getSessionFavoriteColor();
        getDBTransaction().getSession().getUserData().put(FAVORITE_COLOR,color);
        if (valueChanged(previousFavoriteColor,color)) {
            getExampleVO().executeQuery();
        }
    }
2)AM中expose该Java方法


3)通过Action绑定在Managed Bean中调用

    public void onFavoriteColorChanged(ValueChangeEvent valueChangeEvent) {
      EL.setValueChangeEventComponentToNewValue(valueChangeEvent);

      invokeOperationBinding("setSessionFavoriteColor");

      invokeOperationBinding("Execute1");
    }
这种处理方法要求在创建新的AM instance的时候,要调用setSessionFavoriteColor给一个新值,否则favoriteColor只能取一个默认值。

2,在adf.context.securityContext中保存Controller层的值,引用值的Groovy表达式为:adf.context.sessionScope.UserInfo.favoriteColor。

1)定义Session Scope的managed bean

2)给Data Control定义新的Factory Class,该Factory Class创建一个CustomDCJboDataControl Factory Instance。在页面Request的时候,将Session中的值传递到AM中

    public void beginRequest(HashMap requestCtx) {
      String favoriteColor = EL.getAsString("#{UserInfo.favoriteColor}");
      super.beginRequest(requestCtx);
      if (favoriteColor != null) {
        ExampleModule am = (ExampleModule)getDataProvider();
        am.setSessionFavoriteColor(favoriteColor);
      }
    }

这种处理方法只保证每次创建AM instance的时候都取Session中保存的UserInfo对应的值。


State管理:

以上两种方法都涉及到AM的State管理,在AM钝化/激活的时候,处理AM中Controller层传递过来的值,AM State management相关的知识可以参考:Fusion Developer's Guide for Oracle Application Development:Application State Mangement

    @Override
    protected void passivateState(Document document, Element element) {
        System.out.println("passivate state: " + getSessionUserInfo());
        element.setAttribute(USER_INFO, getSessionUserInfo());
        super.passivateState(document, element);
    }

    @Override
    protected void activateState(Element element) {
        System.out.println("active state: " + element.getAttribute(USER_INFO));
        super.activateState(element);
        setSessionUserInfo(element.getAttribute(USER_INFO));
    }

拓展

在使用ADF Security的情况下,在Model层中可以使用 adf.context.securityContext来得到Login用户的信息。ADF Security的灵活性有限,不能动态的创建角色以及角色相关联的页面信息。这时,我们会开发用户管理功能,自定义的Login页面,在用户login后,用户信息可以保存在HttpSession中或Session Scope的managed bean中,如何传递到Model层,就可以使用上面介绍的两种方法。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值