实现思路是用postDate字段进行排序,使用一个时间点限制取出一页数据。
如果是向下翻页 用postDate < offset 按照postDate desc排序的方法取出下一页数据。
如果向上翻页 用postDate > offset 按照postDate asc 排序的方法取出上一页数据。
存在的问题是如果时间相同的两个记录可能会有一个读取不到。
1 Model
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class BlogItem {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistenti
private String itemTitle;
@Persistent
private Text content;
@Persistent
private Date postDate;
@Persistent
private Date lastUpdateDate;
@Persistent
private Long categoryId;
....
}
2 DAO
public List<BlogItem> pageList(long offset,boolean down,
long catId, int countPerPage, boolean loadContent){
PersistenceManager pm = PMF.get().getPersistenceManager();
List<BlogItem> bcs;
Query query = pm.newQuery(BlogItem.class);
String filter = "";
query.setRange(0, countPerPage);
if(catId > 0){
filter +=(" categoryId==" + catId + " ");
}
if(offset > 0){
Date off = new Date(offset);
if(filter.length()>0) filter +=" && ";
if(down){
filter += (" postDate < offDate ");
query.setOrdering(" postDate desc");
}else{
filter += (" postDate > offDate ");
query.setOrdering(" postDate asc");
}
query.setFilter(filter);
query.declareImports("import java.util.Date");
query.declareParameters("Date offDate");
bcs = (List<BlogItem>)query.execute(off);
}else{
if(filter.length()>0) query.setFilter(filter);
query.setOrdering(" postDate desc");
bcs = (List<BlogItem>)query.execute();
}
if(loadContent && bcs != null && bcs.size()>0){
for(BlogItem bi : bcs)
bi.getContent();
}
if(offset > 0 && down == false){
List<BlogItem> tbcs = new ArrayList<BlogItem>();
for(BlogItem bi : bcs){
tbcs.add(0, bi);
}
return tbcs;
}
return bcs;
}
3 Controller
@RequestMapping(value ="/welcome" ,method = RequestMethod.GET)
public String welcome(Model model,HttpServletRequest request) {
List<BlogItem> bcs = blogItemService.pageList(-1,true,-1, COUNT_PER_PAGE,true);
model.addAttribute("blogItems", bcs);
if(bcs.size() == COUNT_PER_PAGE){
BlogItem last = (BlogItem)bcs.get(bcs.size()-1);
model.addAttribute("last",last.getPostDate().getTime());
}
setup(model);
return "public/index";
}
@RequestMapping(value="/page/{direc}/{offset}",method = RequestMethod.GET)
public String list(@PathVariable String direc,@PathVariable long offset,Model model,HttpServletRequest request) {
boolean down = false;
if(direc.equals("down"))
down=true;
List<BlogItem> bcs = blogItemService.pageList(offset,down,-1, COUNT_PER_PAGE,true);
model.addAttribute("blogItems", bcs);
if(bcs.size() == COUNT_PER_PAGE){
BlogItem first = (BlogItem)bcs.get(0);
BlogItem last = (BlogItem)bcs.get(bcs.size()-1);
model.addAttribute("first",first.getPostDate().getTime());
model.addAttribute("last",last.getPostDate().getTime());
}else if(bcs.size() > 0){
if(down){
BlogItem first = (BlogItem)bcs.get(0);
model.addAttribute("first",first.getPostDate().getTime());
}else{
BlogItem last = (BlogItem)bcs.get(bcs.size()-1);
model.addAttribute("last",last.getPostDate().getTime());
}
}else{
return "redirect:/welcome";
}
setup(model);
return "public/index";
}
网址: http://novel-fun.appspot.com
分享到:
相关推荐
【标题】"ndbpager: Google App Engine NDB的分页工具" 【描述】"Google App Engine NDB的分页功能,通常被称为“寻呼机”,是为了帮助开发者处理大量数据查询而设计的。NDB(Non-relational Datastore Binding)是...
例如,使用DiffUtil来减少RecyclerView的更新次数,或者使用Paging库来实现分页加载,减少一次性加载大量数据带来的性能问题。 10. **测试**:在开发过程中,单元测试和集成测试是必不可少的。JUnit和Espresso可以...
16.2.1 使用不同的参数类型 509 16.2.2 作为参数传递对象 511 16.3 使用ObjectDataSource控件分页、排序和过滤数据 515 16.3.1 用户界面分页 515 16.3.2 数据源分页 517 16.3.3 用户界面排序 522 16.3.4 数据源排序 ...
为了存储和展示新闻,开发者可能定义了对应的实体类,如`NewsItem`,包含标题、摘要、作者、发布时间等字段。 **5. UI设计** UI设计通常通过XML布局文件完成,可能使用了LinearLayout、RelativeLayout或...
12、新增:后台-模型-字段可以选择类型,更改字段类型后,注意出现内容不符出现的灾难。 13、扩展:SVG工具,增加webp转jpg功能 14、处理:重写智写模块 15、增加:手机端专用编辑器,已用于贴吧(支持文字|表情|图片...
- **分页(Pagination)**: 实现Bootstrap风格的分页组件,支持动态加载数据。 - **进度条(Progress Bars)**: 显示进度或负载状态的水平条。 - **表单组件(Forms)**: 包括输入框、选择器、复选框和单选按钮等,...
1. **使用第三方库**:项目中探讨了可能使用到的第三方库,如 Django-tracking-app,用于记录用户对模型的 CRUD 访问。 2. **实操技巧**:包括如何为外键字段设置显示字段、处理多语言环境的翻译、实现模糊搜索和...
10. 应用发布:完成开发后,应用需要打包成APK文件,进行签名和优化,然后上传至Google Play Store或其他分发平台,供用户下载使用。 通过掌握以上技术要点,开发者可以构建出一款功能完善的离线北京公交线路查询...
3. **表单编辑**:提供自动生成的表单用于数据的增删改,支持多种字段类型,如文本、日期、选择器等。 4. **多级嵌套关系**:ng-admin 支持处理多对一、一对多、多对多的关系,可以显示和编辑关联数据。 5. **自定义...
首先,Flutter是Google推出的一个开源跨平台移动应用开发框架,它使用Dart语言编写,允许开发者构建高性能、高保真度的原生iOS和Android应用。Dart是一种强类型、面向对象的语言,语法简洁,易于学习,特别适合快速...
在实际开发过程中,你可能还需要考虑一些高级特性,如分页、过滤、时间区处理以及与第三方服务(如 Google Calendar)的集成。这些都可以通过扩展库的功能或者自定义逻辑来实现。 总的来说,Laravel 4 提供了构建...
- **语音识别**:集成Google Speech-to-Text API,允许用户通过语音查词,涉及Android的音频录制和云端API交互。 - **选词查询**:利用Android的选中文字复制功能,用户可以选取屏幕上的单词直接查询,需实现...
AngularJS 是一款强大的前端JavaScript框架,由Google维护,主要用于构建单页应用(SPA,Single Page Applications)。在AngularJS中,CURD(Create, Read, Update, Delete)操作是开发任何数据驱动应用程序的基础,...
4. **分页与排序**:为了提供更好的用户体验,API应支持结果的分页显示和按特定字段(如距离、评分)排序。 5. **错误处理**:当请求无效或服务器出现问题时,API需要返回适当的错误信息,以便前端应用能够正确地...
友点企业网站管理系统集电脑站、手机站、微信、APP、小程序于一体,共用空间,数据同步,是国内五站合一优秀解决方案。系统采用PHP开发,具有操作简单、功能强大、稳定性好、易扩展、安全性强、维护方便等特点,可帮...
蚂蚁分类信息系统是分类信息源码里值得推荐的一款,源码包含四色模板(蓝、绿、橙、红)、3种风格(分类、门户、行业),并含有WAP端,推荐做本地分类信息类站点使用。MayiCMS功能简介:1,整合在线支付接口如支付宝...
6. **部署与发布**:最后,开发者需要将应用打包并发布到App Store和Google Play。这涉及配置Cordova或Capacitor,以及遵循各个平台的发布指南。 在实际开发过程中,"pg-ionic"项目可能还包含了错误处理、日志记录...