0

我有一个当前工作的连续滚动分页,因为 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 中存储与页面相关的变量以进行分页是一种不好的做法(例如,连续滚动的搜索分页?)

4

2 回答 2

2

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

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

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

于 2013-03-11T16:54:02.320 回答
0

将页面变量存储到用户会话中是否是一种好习惯:否。因为会话属性不是线程安全的。因为只有有权访问特定 HttpSession 的人才能访问它。为了更好地查看Servlet 中的请求和会话

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

于 2013-03-18T05:54:09.303 回答