wicket中的业务逻辑,其中有一些推荐放置逻辑的位置(在加载逻辑上)

时间:2011-03-03 04:45:48

标签: java wicket

所以,我看到这个问题,但我会再多一点代码:

在a之前放置代码以初始化模型的最佳位置在哪里 页面渲染。我知道五种选择,但你通常把它放在哪里 这种类型的初始化?

在页面渲染之前,我想用我的bean / model设置数据 某些属性可能只针对该页面。

我认为有五种选择。

  1. 在构造函数中添加初始化逻辑。这可能有用,但我 不知道是否为每个页面调用调用构造函数(例如,何时 页面被反序列化。)

  2. 在onBeforeRender中添加init逻辑。这是有效的,它呼吁每一个 请求?但它是最好的地方吗?还是onconfigure? onInitialize。

  3. 然后,你用更新的值调用setDefaultModel / setDefaultObject吗?

    1. 在“load”或“getmodel”方法中添加init逻辑 LoadableDetachableModel类?

    2. 在onSubmit方法或onEvent的前一页中添加init。 (的onSubmit() {initBeanInSession(); setResponsePage(); }

    3. 将模型传递给面板或页面构造函数(使用pageparameters?)

    4. 是否有这些最佳做法或优先于其他做法。

      (a)具有可装载可拆卸模型的页面构造函数代码:

      MyPage.java: 
      ... 
      final Form form = new Form(FORM, new 
      CompoundPropertyModel(new LoadableDetachableModel() { 
      
      private static final long serialVersionUID = 1L; 
      @Override 
      protected MyBean load() { 
      final MyBean app = (MyBean) Session.get().getApp(); 
      
      ????????????? 
      ????????????? 
      initialize here??????? 
      ????????????? 
      return app; 
      } 
      }; 
      }); 
      
      ??? 
      onBeforeRender() { 
      ?? Add initiailize here 
      final MyBean app = (MyBean) Session.get().getApp(); 
      app.setData(doSomeBusinessLogicHere) 
      
      } 
      

      或initModel?

      /**    
       * Called once per request on components before they are about to be rendered. 
       * This method should be used to configure such things as visibility and enabled flags.
       */
          @Override
          protected void onConfigure() {     
              super.onConfigure();
      
              // Call business logic and properly set email address.
      
          }
      

2 个答案:

答案 0 :(得分:4)

  

1在构造函数中添加初始化逻辑。这可能有效,但我不知道是否为每个页面调用调用构造函数(例如,当反序列化页面时)。

只有在调用new时才会调用构造函数。反序列化会绕过对象的正常构造(它只分配足够的内存,然后直接加载数据 - 前提是您没有为序列化/反序列化创建任何特殊代码)。使用调试器可以轻松检查这些假设。

因此,如果您想为模型对象的每个请求做一些事情,那么构造函数是错误的。

  

2在onBeforeRender中添加init逻辑。这有效,它需要每个请求吗?但它是最好的地方吗?还是onconfigure? onInitialize。

onBeforeRender仅针对可见组件(针对每个请求)进行调用。每个请求都会为所有组件(无论可见性)调用新的onConfigure事件。只有在将组件添加到其父组件(即仅一次)后才会调用onInitialize

您的问题的答案很难给出,因为您不清楚是否打算覆盖用户已在其输入字段中提供的值。如果是,那么您可以在load的{​​{1}}方法中执行此操作。如果没有,那么您应该在LoadableDetachableModel中执行此操作,或者可能在onInitialize对象的构造函数中设置这些默认值。

这种设计问题没有金锤 - 它始终取决于

答案 1 :(得分:1)

我通常将其放在load()的{​​{1}}方法中。此方法专门用于包含初始化逻辑。

但问题确实是为什么你需要为每个页面渲染启动它。我承认在某些情况下没有其他选择,但通常都有。