【问题标题】:Wicket: ListView not updated when using multiple browser windows in simple CRUDWicket:在简单 CRUD 中使用多个浏览器窗口时未更新 ListView
【发布时间】:2011-04-24 03:14:28
【问题描述】:

好的,这是我使用 Wicket 1.5M2 的控制器:

public class Users extends WebPage {

private static final List<User> users = Collections.synchronizedList(new ArrayList<User>());

public Users() {

    final UserForm userForm = new UserForm("userForm");
    add(userForm);

    add(new ListView<User>("users", users) {

        @Override
        protected void populateItem(ListItem<User> item) {
            final User user = item.getModelObject();

            item.add(new Label("name", user.getName()));
            item.add(DateLabel.forDatePattern("dateOfBirth", new Model(user.getDateOfBirth()), "dd.MM.yyyy"));
            item.add(new Label("email", user.getEmail()));

            item.add(new Link("editLink") {

                @Override
                public void onClick() {
                    userForm.setModelObject(user);
                }

            });

            item.add(new Link("removeLink") {

                @Override
                public void onClick() {
                    users.remove(user);
                }

            });
        }

    });

    setVersioned(false);
}

private class UserForm extends Form<User> {

    public UserForm(String id) {
        super(id, new CompoundPropertyModel<User>(new User()));

        add(new TextField<String>("name"));
        add(DateTextField.forDatePattern("dateOfBirth", "dd.MM.yyyy"));
        add(new TextField<String>("email"));
    }

    @Override
    protected void onSubmit() {
        User user = getModelObject();
        users.remove(user);
        users.add(user);
        setModelObject(new User());
    }
}
}

当我一次只使用一个浏览器窗口进行 CRUD 操作时,它可以工作。如果我使用两个窗口,用户列表不会更新,除非我在地址字段中再次输入基地址以重新加载页面。

澄清:在同一台计算机上同时使用不同的浏览器效果很好。仅当在同一浏览器中使用多个窗口时,它才不起作用。

  • 幕后发生了什么?

  • 我为整个页面设置了setVersioned(false),为什么我的地址栏显示的地址是:http://localhost:8080/wicket/bookmarkable/package.name.Users?2 那个数字2不是页面的版本吗?

  • 最重要的是,我需要做些什么才能使其表现得像桌面 GUI 应用一样,因此一个浏览器窗口 == 一个应用实例。

【问题讨论】:

    标签: java listview wicket crud


    【解决方案1】:

    1) 在您的实现中有一个全状态页面,是的,“?2”是该页面的一个版本。您可以通过打开新标签或提交表单来检查它 - 这个数字会增加。

    当您在同一个浏览器中打开新标签页时,实际上您使用的是同一个会话。 WebApp 认为您是前一个选项卡上的同一用户并创建页面的另一个版本。

    现在,如果您在新选项卡中提交一些信息,则可以,但如果您返回上一个选项卡并提交一些信息 - Wicket 检测到该页面版本已被弃用并开始搜索实际版本。由于某种原因,您的 POST 信息此时会丢失。

    2) 要摆脱页面版本,您需要将页面设置为无状态。为此,您需要使链接和表单无状态:只需将它们替换为 StatelessLinkStatelessForm 对象。此外,将您的页面设置为setStatelessHint ( true );,现在您的选项卡将正常工作并且没有版本。开发者example.

    3) 这不是正常行为,您需要管理浏览器的cookies。有关此here 的更多信息。

    【讨论】:

      【解决方案2】:

      我不确定您的主要问题,但setVersioned(false) 完全按照您的想法执行并且似乎正在运行。无论 2 是什么,它都不是 Wicket 页面版本号;如果是,那么 2 会在一段时间之后出现,而不是问号。

      查看这个关于版本控制的页面,特别是不显示版本号:Wicket extreme consistent URLs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 2015-12-30
        • 1970-01-01
        • 2019-03-30
        • 2014-01-17
        相关资源
        最近更新 更多