所以,我看到这个问题,但我会再多一点代码:
在a之前放置代码以初始化模型的最佳位置在哪里 页面渲染。我知道五种选择,但你通常把它放在哪里 这种类型的初始化?
在页面渲染之前,我想用我的bean / model设置数据 某些属性可能只针对该页面。
我认为有五种选择。
在构造函数中添加初始化逻辑。这可能有用,但我 不知道是否为每个页面调用调用构造函数(例如,何时 页面被反序列化。)
在onBeforeRender中添加init逻辑。这是有效的,它呼吁每一个 请求?但它是最好的地方吗?还是onconfigure? onInitialize。
然后,你用更新的值调用setDefaultModel / setDefaultObject吗?
在“load”或“getmodel”方法中添加init逻辑 LoadableDetachableModel类?
在onSubmit方法或onEvent的前一页中添加init。 (的onSubmit() {initBeanInSession(); setResponsePage(); }
将模型传递给面板或页面构造函数(使用pageparameters?)
是否有这些最佳做法或优先于其他做法。
(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.
}
答案 0 :(得分:4)
1在构造函数中添加初始化逻辑。这可能有效,但我不知道是否为每个页面调用调用构造函数(例如,当反序列化页面时)。
只有在调用new
时才会调用构造函数。反序列化会绕过对象的正常构造(它只分配足够的内存,然后直接加载数据 - 前提是您没有为序列化/反序列化创建任何特殊代码)。使用调试器可以轻松检查这些假设。
因此,如果您想为模型对象的每个请求做一些事情,那么构造函数是错误的。
2在onBeforeRender中添加init逻辑。这有效,它需要每个请求吗?但它是最好的地方吗?还是onconfigure? onInitialize。
onBeforeRender
仅针对可见组件(针对每个请求)进行调用。每个请求都会为所有组件(无论可见性)调用新的onConfigure
事件。只有在将组件添加到其父组件(即仅一次)后才会调用onInitialize
。
您的问题的答案很难给出,因为您不清楚是否打算覆盖用户已在其输入字段中提供的值。如果是,那么您可以在load
的{{1}}方法中执行此操作。如果没有,那么您应该在LoadableDetachableModel
中执行此操作,或者可能在onInitialize
对象的构造函数中设置这些默认值。
这种设计问题没有金锤 - 它始终取决于。
答案 1 :(得分:1)
我通常将其放在load()
的{{1}}方法中。此方法专门用于包含初始化逻辑。
但问题确实是为什么你需要为每个页面渲染启动它。我承认在某些情况下没有其他选择,但通常都有。