java - Wicket 口中的业务逻辑,其中有一些推荐的放置逻辑的位置(加载逻辑)

标签 java wicket

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

在什么地方放置初始化模型的代码的最佳位置 页面呈现。我知道有五个选项,但是你通常把它放在哪里 这种类型的初始化?

在页面呈现之前,我想在我的 bean/model 中设置数据 某些属性可能仅特定于该页面。

我认为有五个选择。

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

  2. 在onBeforeRender中添加初始化逻辑。这很有效,并且需要每个人 要求?但这是最好的地方吗?或者配置上? onInitialize。

然后,您是否使用更新后的值调用 setDefaultModel/setDefaultObject?

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

  2. 在上一页的onSubmit方法或onEvent上添加init。 (onSubmit() { initBeanInSession();设置响应页面(); }

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

这些最佳实践中是否有任何一个比另一个更受青睐?

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

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.

    }

最佳答案

1 Add initialization logic in the constructor. This may work, but I don't know if the constructor is called for every page call (E.g. when the page is deserialized).

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

因此,如果您想使用模型对象为每个请求执行操作,那么构造函数是错误的位置。

2 Add init logic in onBeforeRender. This works and it called for every request? But is it the best place? Or onconfigure? onInitialize.

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

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

对于此类设计问题没有金锤子——它总是取决于

关于java - Wicket 口中的业务逻辑,其中有一些推荐的放置逻辑的位置(加载逻辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5176751/

相关文章:

javascript - 在 wicket 应用程序中包含元标记

java - SLF4J/JPA/JAX-RS 如何找到它们的实现?

java - C3P0 创建过多的线程和定时器

Java 如何在同一行获取 scanner.nextLine()?

java - 在 DataView 之间共享 Wicket DataProvider 时出现问题

html - 阻止 Wicket 为容器元素生成 HTML?

Java 图形基础知识 : Creating Collison Area From Image

java - 双哈希java

java - 如何隐藏 Wicket 口中的现有页面

java - wicket HTML 生成器的改进,是否可以删除 wicketpath?