今天在昨天的基础上完成归档功能(即在首页可以按标签、按类别分类展示新闻及对新闻按年份进行归档)。
1.按类别分类展示新闻
在首页按类别分类展示新闻,找到所有的分类 ,并且按照新闻量自上而下排序,其核心代码如下所示
@GetMapping("/types/{id}")
public String types(@PageableDefault(size = 5, sort = {"updateTime"}, direction = Sort.Direction.DESC) Pageable pageable,
@PathVariable long id, Model model) {
// 1. 找到所有的分类 并且按照新闻量自上而下排序
List<Type> list = typeService.listTypeTop(10000);
if (id == -1) {
// 意味着当前第一次访问 访问的分类应是新闻量最多的那个标签
id = list.get(0).getId();
}
model.addAttribute("types", list);
model.addAttribute("page", newsService.listNews(id, pageable));
model.addAttribute("activeTypeId", id);
return "types";
}
2.按标签分类展示新闻
与按类别展示类似。
@GetMapping("/tags/{id}")
public String tags(@PageableDefault(size = 5, sort = "updateTime", direction = Sort.Direction.DESC) Pageable pageable,
@PathVariable long id, Model model) {
// 1. 找到所有的标签 按照新闻量从上而下进行排序
List<Tag> list = tagService.listTagTop(1000);
// 2. 判断当前是否为第一次访问, 若是 就显示新闻量最多的标签
if (id == -1) {
id = list.get(0).getId();
}
model.addAttribute("tags", list);
model.addAttribute("page", newsService.listTagsNews(id, pageable));
model.addAttribute("activeTagId", id);
return "tags";
}
3.归档
按照年份归档新闻,注意新闻数量,其核心代码如下
@GetMapping("/archives")
public String archives(Model model) {
// 需要通过 map 集合存储 年份 和新闻 Map<年份, 新闻的集合>
model.addAttribute("archiveMap", newsService.arvhiveMap());
model.addAttribute("newsCount", newsService.countNews());
return "archives";
}
@Override
public Map<String, List<News>> arvhiveMap() {
// 1. 得到所有的年份
List<String> list = newsRepository.findGroupByYear();
System.out.println(list);
// 2. 创建map集合
Map<String, List<News>> map = new LinkedHashMap<>();
// 3. 将键值对存储至map集合中
for (String year : list) {
map.put(year, newsRepository.findByYear(year));
}
System.out.println(map);
return map;
}
@Override
public Long countNews() {
return newsRepository.count();
}
4.总结
在完成归档功能时,新闻不能很好的按年份顺序进行展示,主要原因是用了HashMap,后来改用LinkedHashMap,解决了这个问题。
Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。
HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;
HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。
如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。
在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。