【问题标题】:JSP Continuos Scrolling Storing page variables in a sessionJSP连续滚动在会话中存储页面变量
【发布时间】:2013-03-09 15:47:56
【问题描述】:

我有一个当前工作的连续滚动分页,因为 Http 是无状态的并且没有办法从 HttpRequest 取回以前的数据集,将页面变量存储到用户会话中是一个好习惯吗? (比如添加最后加载内容的 id,以便在下一次加载或下一次请求时将下一个元素加载到其中)(假设页面是通过 AJAX 加载的)我已经这样实现了。

因此,例如,如果用户搜索某个名称,它将转到执行此操作的某个操作。

paginationHelperBean = new PaginationHelper();

        if(page == 0 && name != null){
            paginationHelperBean.setCurrent_page(0);
        } else {
            paginationHelperBean.setCurrent_page(page);
        }

        //Set the paginationBean for display references in JSP later
        paginationHelperBean.setPer_page(RESULTS_PER_PAGE);
        paginationHelperBean.setTotal_count(profileService.countSearchProfiles(name, paginationHelperBean.getCurrent_page(), RESULTS_PER_PAGE));
        paginationHelperBean.setNumber_of_pages();


    session.put("profileSearchKey", this.name);
    session.put("profileSearchPage", page);

当用户请求另一个片段或数据集时,它将执行先前加载的内容中的下一个项目。

String key = (String)session.get("profileSearchKey");

int page = (Integer)session.get("profileSearchPage")+1;
profiles = profileService.searchProfiles(key, page, RESULTS_PER_PAGE);
session.put("profileSearchPage", page);

所以我的问题是,在 Session 中存储与页面相关的变量以进行分页是一种不好的做法(例如,连续滚动的搜索分页?)

【问题讨论】:

    标签: java jakarta-ee web pagination


    【解决方案1】:

    在我看来,无限滚动应该与使用任何 ajax 调用来获取额外内容没有什么不同,你有一些东西会触发额外数据的获取(用户滚动到页面底部),当它到达时你会显示它。此外,您可以使用获取的最后页码更新 JavaScript 变量,以便当用户再次滚动到页面底部时,您可以获取下一页(无需将此信息存储在会话变量中,例如 ajax 调用 / nextPage.jsp?page_number=[valueFromJavaSript])。

    将此与将获取的最后一页存储在会话变量中进行对比。想象一下您的用户离开无限滚动页面并返回,您期望会发生什么?当您导航回它时,让 jsp 页面重置页码的会话变量,以便后续的 ajax 调用获取正确的页码。 此外,如果您添加多个无限滚动页面,您将在会话中存储多个“当前页面”。

    我想在提交答案之前检查其他人是如何做的,我很确定 Slashdot 曾经有无限滚动,不幸的是它现在有一个下一步按钮。但是我发现了一篇文章“30+ 无限滚动网站的伟大示例”here。我使用 fiddler (http://www.fiddler2.com/fiddler2/) 检查他们是否在请求中传递了页码(即没有将其存储在会话中),而我检查的是(页码、偏移量或类似的东西,但信息是显然在请求中)。

    【讨论】:

      【解决方案2】:

      将页面变量存储到用户会话中是否是一种好习惯:否。因为会话属性不是线程安全的。因为只有那些可以访问特定 HttpSession 的人才能访问它。更好地参见Request and session in Servlet

      您编写的代码可以通过同步问题。如果一个线程正在获取它之前设置的值,那么另一个线程可能已经修改并设置了不同的值。所以当第一个线程尝试获取时价值虽然它可能会获得价值,但它可能不是正确的价值。 编码 session.put("profileSearchKey", this.name); session.put("profileSearchPage", page); 假设线程 A 为 profileSearchKey 和 profileSearchPage 设置了值。当线程 A 尝试获取属性名称 profileSearchKey 和 profileSearchPage 的值时,this.name 和 page 的值可能被另一个线程修改。因此,在获取值时会出现同步问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-31
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        相关资源
        最近更新 更多