Oracle-ADF inlineFrame初始化视图作用域bean两次

时间:2015-04-30 11:47:07

标签: jsf jsf-2 oracle-adf

Oracle ADF 12.1.2,Java 1.7,Oracle WebLogic 12.1.2

我面临与af:inlineFrame组件相关的奇怪问题。尝试在af:popup组件中的af:inlineFrame内显示/呈现ADF页面。奇怪的是弹出窗口显示;查看scoped bean的@PostConstruct方法,调用两次。这意味着bean初始化两次。但是,它需要初始化一次,因为bean将从将要显示在af:inlineFrame内的页面中引用。

正确的流程必须是:

  1. 点击按钮openPopup()方法。
  2. openPopup()设置URI然后打开弹出窗口。
  3. inlineFrame source已设置属性,因为它将显示framePage.jspx
  4. JSF扫描framePage.jspx代码,发现FrameBean内有af:outputLabel
  5. 的引用
  6. 构建FrameBean,然后调用@PostConstruct方法。
  7. 调用适当的getter和render页面。
  8. 在我的案例中会发生什么:

    1. 点击按钮openPopup()方法。
    2. openPopup()设置URI打开弹出窗口。
    3. inlineFrame source已设置属性,因为它将显示framePage.jspx
    4. JSF扫描framePage.jspx代码,发现FrameBean内有af:outputLabel
    5. 的引用
    6. 构建FrameBean,然后调用@PostConstruct方法。
    7. 调用适当的getter和render页面。
    8. 构建FrameBean,然后调用@PostConstruct方法。
    9. 调用适当的getter和render页面。
    10. Popup位于:

      <af:popup id="mainPopup" binding="#{mainBean.mainPopup}">
          <af:dialog id="mainDialog">
              <af:inlineFrame source="#{mainBean.URI}">
              </af:inlineFrame>
          </af:dialog>
      </af:popup>
      

      通过af:button action="#{mainBean.openPopup}"显示弹出窗口:

      public void openPopup() {
          this.setURI("http://localhost:7001/app/framePage.jspx");
          RichPopup.PopupHints hints = new RichPopup.PopupHints();
          this.getMainPopup().show(hints);
      }
      

      framePage.jspx:

      <?xml version='1.0' encoding='UTF-8'?>
      <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
      <meta http-equiv="X-UA-Compatible" content="IE=edge" />
      <jsp:directive.page contentType="text/html;charset=UTF-8" />
          <f:view>
              <af:document title="Frame Demo" id="demoDocument">
                  <af:form id="demoForm">
                      <af:outputLabel value="HELLO Common user!"></af:outputLabel>
                      <af:outputLabel value="#{frameBean.commonId}">   </af:outputLabel>
                  </af:form>
              </af:document>
          </f:view>
      </jsp:root>
      

      FrameBean:

      @ManagedBean
      @ViewScoped
      public class FrameBean {
          private String commonId;
      
          @PostConstruct
          public void afterInit() {
      
          }
      
          public String getCommonId() {
              return commonId;
          }
      
          public void setCommonId(String commonId) {
              this.commonId = commonId;
          }
      }
      

      FrameBean @SessionScoped解决此问题,因为bean与会话保持在一起,但我不想将其保留在会话中。同时在jspx中将source af:inlineFrame属性设置为硬编码而不解决问题。

1 个答案:

答案 0 :(得分:2)

我不知道如何深入&#39; CDI使用ADF进行了测试,但肯定不是使用ADF最常用的方式 - 至少所有ADF文档都采用旧式方式。我尝试在我的一个项目中启用CDI,但是通过关注此博客我遇到了错误:

http://www.jobinesh.com/2014/08/enabling-cdi-in-adf-applications.html

此外, 你正在使用内联框架,这是另一个未知的领域。从设计最佳实践角度来看,您应该在页面流中思考,因此您可以使用包含framePage.jspx的任务流程打开对话框,而不是使用内联框架。 。更多相关信息,请点击此处:https://blogs.oracle.com/DavidGiammona/entry/task_flow_call_activity_run_as

我知道这并不直接回答您的问题,请将其作为一般性说明。