在使用Wicket表单时,如何更好地处理Wicket模型的加载?

时间:2013-02-18 00:01:30

标签: java wicket wicket-1.6

我正在使用Apache Wicket编写表单。相同的页面/类用于向数据库添加新项目以及编辑数据库中的现有记录。当然,由于页面构造函数只被调用一次,因此模型总是设置为页面上最初加载的任何记录,如果我们不编辑现有记录,则设置为新记录。

我已经找到了许多动态加载数据的方法,但它们看起来很冗长,而且有点笨重。我怀疑有一个处理这种情况的最佳做法。

作为参考,这里有一些编辑过的代码:

public class JobManagement extends WebPage {

private static final long serialVersionUID = 1L;
private long jobId = 0;

protected void setJobId(long id) {
    this.jobId = id;
}

protected long getJobId() {
    return jobId;
}

public JobManagement() {
    LoadableDetachableModel<Job> jobModel = new LoadableDetachableModel<Job>() {

        private static final long serialVersionUID = 1L;

        @Override
        protected Job load() {
            Job job = (Job) EntityFactory.getInstance().getBean("job");

            // if we're editing an existing job, load the object
            if (jobId >= 1) {
                job.load(jobId);
            }

            return job;
        }

    };

    add(new FeedbackPanel("feedbackPanel"));

    Form<Job> jobForm = new Form<Job>("jobForm") {

        private static final long serialVersionUID = 1L;

        @Override
        public void onSubmit() {
            // Handles the form submit...

        }

    };

    add(jobForm);

    jobForm.setModel(new CompoundPropertyModel<Job>(jobModel));
    // SNIP ... All my form fields go here!
    jobForm.add(new Button("submit"));

}

}

我正在使用LoadableDetachableModel,但我不完全清楚如何在呈现页面时动态加载它。我试图加载一个Model的新实例,覆盖返回我的LoadableDetachableModel的getObject()类,但是有些东西感觉非常错误。任何输入将不胜感激。我一直试图通过在线文档专门感受我的方式,所以原谅我明显缺乏熟悉。

2 个答案:

答案 0 :(得分:0)

要回答我自己的问题,我遇到的问题是,每次返回页面时,绑定到表单的模型似乎都会持续存在。这让我相信问题在于我是如何管理模型的,但问题实际上与我如何链接到页面有关。

上面的页面链接如下:

Link<String> link = new BookmarkablePageLink<String>("addLink", MyAddClass.class);

虽然在某些情况下这是一种可接受的方法,但在这种特殊情况下,这不是正确的方法。应该发生的是:

Link<String> link = new Link<String>("addLink") {
    public void onClick() {
        setResponsePage(new MyAddClass());
    }
}

以这种方式动态处理链接时,我的应用程序按预期运行。感谢所有投入的人,帮助我通过我的链接了解这个根本问题。

答案 1 :(得分:0)

虽然链接方法(上一个答案)可能会产生问题并且通常取决于您如何实现链接,但在这种情况下,实际问题是使用“EntityFactory”来加载域对象的实例。在这种情况下,它提供缓存数据而不是实例化新实例。

总结一下,在这样的情况下要评估的事情,当你第二次浏览表单时,表单的模型对象似乎没有重置:

1 - 您用于访问页面的链接策略

2 - 用于将域对象加载并绑定到表单

上的模型的方法