我目前正在进行连续滚动分页,因为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);
所以我的问题是,将页面相关变量存储在会话中进行分页是不好的做法(例如,使用连续滚动搜索分页?)
答案 0 :(得分:2)
在我看来,无限滚动应该与使用任何ajax调用来获取其他内容没有什么不同,你有一些东西可以触发获取其他数据(用户滚动到页面底部),当它到达时你显示它。此外,您可以使用提取的最后一个页码更新JavaScript变量,以便当用户再次滚动到页面底部时,您将获取下一页(无需将此信息存储在会话变量中,例如ajax调用/ NextPage.jsp上?PAGE_NUMBER = [valueFromJavaSript])。
将此与存储在会话变量中的最后一页进行对比。想象一下,您的用户导航离开无限滚动页面并返回,您期望会发生什么?当您导航回页面编号时,让jsp页面重置页码的会话变量,以便后续的ajax调用获取正确的页码。 此外,如果您添加多个无限滚动页面,您将在会话中存储多个“当前页面”。
在我提交答案之前,我想检查其他人是如何做的,我很确定Slashdot曾经有无限滚动,不幸的是它现在有一个下一个按钮。但我发现了一篇文章“30多个无限滚动网站的优秀例子”here。我使用fiddler(http://www.fiddler2.com/fiddler2/)来检查它们是否在请求中传递了页码(即没有将它存储在会话中),我检查的是(页码,偏移或类似的东西,但是信息显然在请求中。)
答案 1 :(得分:0)
将页面变量存储到用户会话中是一种很好的做法:否。会话属性不是线程安全的。只有那些有权访问特定HttpSession的人才能访问它。为了更好地查看Request and session in Servlet
你编写的代码可以通过sychnonization问题。如果一个线程获得它先前设置的值,则有可能另一个线程已经修改并设置了不同的值。所以当第一个线程试图获取时尽管它可能获得价值,但它可能不是正确的价值。 代码 session.put(“profileSearchKey”,this.name); session.put(“profileSearchPage”,页面); 假设线程A为profileSearchKey和profileSearchPage设置值。当线程A尝试获取属性名称profileSearchKey和profileSearchPage的值时,this.name和page的值可能被另一个线程修改。因此,在获取值时,同步问题将到达。 / p>