java - 检门可装载可拆卸模型的工作原理

标签 java wicket

我试图了解 Wicket LoadableDetachable 模型是如何工作的。 我从 Wicket 文档中了解到的是在正常情况下,当请求完成时,处理 wicket 将自动序列化具有关联模型值的所有组件。这个会消耗更多的内存。如果我们在序列化时使用 LoadableDetachable 模型,则模型值将不会被序列化。这是正确的吗? 。所以它会自动分离模型对象。那么对于下一个请求,模型值将自动重新加载吗?请参阅我的下面的代码。

public class ProductListPanel extends Column<Product> {

    @SpringBean
    private ProductService productService;
    private List productList;


    public ProductListPanel(String id) {
        super(id);
        class ProductModel extends LoadableDetachableModel {

            @Override
            public void detach() {
                // TODO Auto-generated method stub
                productList = null;
                System.out.print("Called Detach Object\n");
            }


            @Override
            protected Object load() {
                // TODO Auto-generated method stub
                productList = productService.findAll();
                System.out.print("Called Get Object\n");
                return productList;
            }

        }
        System.out.print("Before creating also calling\n");
        final ProductModel productModel = new ProductModel();

        ListView view = new ListView("list", productModel) {

            protected void populateItem(ListItem item) {
                System.out.print("\nBefore start also calling\n");
                System.out.print("Before this one is callling \n");
                Product result = (Product) item.getModelObject();
                item.add(new Label("code", result.getCode()));
                item.add(new Label("name", result.getName()));
                final Link deleteLink = new Link("remove", item.getModel()) {

                    @Override
                    public void onClick() {
                        Product product = (Product) getModelObject();
                        productService.delete(product);

                    }

                };
                item.add(deleteLink);

            }
        };

        add(view);
        Link addProductLink = new Link("addProduct") {

            @Override
            public void onClick() {
                // TODO Auto-generated method stub
                setResponsePage(new AddProduct());
            }

        };
        add(addProductLink);
        productModel.detach();
    }
}

在上面的代码中,我列出了数据库中的所有产品。我有每个产品的删除链接,当我们单击该链接时,我将从数据库中删除该产品。单击“删除”链接后,页面不会刷新,这意味着它仍然显示已删除的产品。如果我添加这一行productModel.detach();然后就可以正常工作了。我的问题是为什么我必须调用productModel.detach();手动? LoadableDetachableModel 假设自动执行对吗?

请帮助我

最佳答案

LoadableDetachableModel 在附加的持续时间内缓存检索到的对象。当您从数据库加载数据时,所有项目都在那里。然后执行查询来删除记录,但不更新列表。因此,您必须更改 onClick 处理程序以同时更新检索到的列表,或者仅分离模型。

LoadableDetachableModel 中没有魔法。看一下下面的代码:

List<Person> people = dao.getListOfPeopleAttendingParty();

// assume that the number of people attending the party is 4
assert people.size() == 4;

Person guest = people.get(0);
dao.delete(guest);

// what is the number of people attending the party now?
assert people.size() == ?;

您认为 people.size() 现在是什么?

LoadableDetachableModel 的执行与上面的代码片段没有任何不同:

List<Person> people = peopleModel.getObject(); // is called by ListView

// assume that the number of people attending the party is 4
assert people.size() == 4;

Person guest = people.get(0);
dao.delete(guest);

// what is the number of people attending the party now?
assert people.size() == ?;

所以:不涉及任何魔法,只是简单的 Java 和普通逻辑。

PS。 即使数据库不再保存客人,这两个问题的答案都是4

关于java - 检门可装载可拆卸模型的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10594439/

相关文章:

javascript - 无需服务器往返即可动态启用/禁用表单组件

Java servlet方法调用顺序导致不同的结果

java - 在现有项目结构上设置gradle

java - 试图找出如何将对象从 jEditable 数据表插件发送到我的 Java Servlet

java - 如何根据并发用户的数据库寄存器创建序列号

maven - Intellij Idea 多项目 Wicket 口应用找不到 webapp

java - Wicket Contrib 示例源代码

java - Wicket 口中带有文件下载的提交按钮

java - 如何将内部 css (&lt;style&gt;) 添加到 Wicket 页面

java - 如何从字符串转换为公钥?