2011-03-03 63 views
2

所以,我认为这个问题问,但我会多一点点代码:业务逻辑,其中有一些推荐的地方放置逻辑(上载逻辑)

哪里是把代码的最佳场所在 页面呈现之前初始化模型。我知道有五种选择,但您通常在哪里放置 这种类型的初始化?

在页面呈现之前,我想在我的bean /模型中设置数据,其中的 某些属性可能只针对该页面。

我想有五种选择。

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

  2. 在onBeforeRender中添加init逻辑。这工作,它要求每个 请求?但这是最好的地方吗?还是配置? onInitialize。

然后,您是否使用更新的值调用setDefaultModel/setDefaultObject?在 LoadableDetachableModel类 “负载” 或 “getmodel” 方法

  1. 添加初始化逻辑?

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

  3. 传递一个模型到面板或页面构造(使用pageparameters)

是否有任何的这些最佳做法或优于?其他

(一)页的构造码可装入可拆卸的模型:?

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. 

    } 

回答

4

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

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

所以,如果你想用你的模型对象做每个请求的事情,构造函数是错误的地方。

2在onBeforeRender中添加init逻辑。这工作,它呼吁每一个请求?但这是最好的地方吗?还是配置? onInitialize。

onBeforeRender仅要求(为每一个请求)可见组件。每个请求都会为所有组件(不管可见性)调用新的onConfigure事件。 onInitialize仅在将组件添加到其父组件后才被调用(即,仅一次)。

您的问题的答案很难给出,因为不清楚您是否打算覆盖用户已经在其输入字段中提供的值。如果是这样,那么你可以在LoadableDetachableModelload方法中做到这一点。如果不是,那么你应该在onInitialize中执行它,或者可能在你的App对象的构造函数中设置这些默认值。

这样的设计问题没有金锤 - 总是取决于

+0

我在邮件列表上问过这个问题。我很高兴你们在stackoverflow上。谢谢 – 2011-03-13 05:37:51

+0

@Martijn Dashorst我们可以从LoadableDetachableModel的load()方法抛出Exception吗?我在处理'load()'方法中引发的异常时遇到了一些问题。 – Jay 2013-02-18 16:09:36

1

我通常把它放在LoadableDetachableModelload()方法中。该方法专门用于包含初始化逻辑。

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