学习内容
今天继续编写新闻系统,今天主要是实现的归档、评论功能、搜索,以及拦截器的学习。
归档主要就是将新闻按照时间排序号然后及逆行展示,从而可以根据新闻的时间来选择新闻。
实现归档的主要代码如下:
controller层:
@RequestMapping("archives")
public String archives(Model model){
HashMap<String, List<News>> map=newsService.archiveNews();
Long count=newsService.countNews();
model.addAttribute("newsCount",count);
model.addAttribute("archiveMap",map);
return "archives";
}
service层:
@Override
public Long countNews() {
return newsDao.count();
}
@Override
public HashMap<String, List<News>> archiveNews() {
LinkedHashMap<String,List<News>> map=new LinkedHashMap<>();
List<String> years=newsDao.findGroupYear();
for(String y:years){
List<News>news=newsDao.findByYear(y);
map.put(y,news);
}
return map;
}
实现评论的主要代码:
service层:
@Override
public void save(Comment comment) {
if(comment.getParentComment().getId()==-1){
comment.setParentComment(null);
}
commentDao.save(comment);
}
@Override
public List<Comment> findCommentByNewsId(Long newsId) {
Sort sort=Sort.by("createTime");
List<Comment> comments=commentDao.findByNewsIdAndParentCommentNull(newsId,sort);
return comments;
}
controller层:
@Controller
public class CommentController {
@Autowired
private CommentService commentService;
@PostMapping("/comments")
public String save(Comment comment, HttpSession session){
User user=(User)session.getAttribute("user");
if(user==null){
comment.setAdminComment(false);
}else{
comment.setAdminComment(true);
}
commentService.save(comment);
Long newsId=comment.getId();
return "redirect:/comments/"+newsId;
}
@RequestMapping("/comments/{newsId}")
public String comments(@PathVariable Long newsId, Model model){
List<Comment> comments=commentService.findCommentByNewsId(newsId);
model.addAttribute("comments",comments);
return "news :: commentList";
}
}
搜索功能的实现:controller层代码如下,在service层的findNewsQuery()方法中,调用dao层的findByquery()从而实现新闻的搜索。
@RequestMapping("/search")
public String search(@PageableDefault(size=3,sort={"updateTime"},direction = Sort.Direction.DESC)
Pageable pageable,
String query,
Model model){
Page<News> page=newsService.findNewsByQuery(query,pageable);
model.addAttribute("page",page);
model.addAttribute("query",query);
return "search";
}
拦截器和ssm项目中的过滤器的功能类似,都是防止用户没有登陆而直接输入网址进入系统的情况发生。
但是过滤器是依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,
而拦截器是依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程的一种运用,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理
WebConfig.java文件:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin")
.excludePathPatterns("/admin/login");
}
LoginInterceptor.java
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handle)throws Exception{
if(request.getSession().getAttribute("user")==null){
response.sendRedirect("/admin");
return false;
}
return true;
}
总结
上午还是继续新闻系统的编写,现在新闻系统基本上已经实现了,接下来还需要进行一些优化。上午上课的时候有一些没跟上节奏,主要是电脑启动项目太慢了。下午的时候看了录屏回顾了上午所讲的内容,并完善了自己的代码。下午主要还是进行自己小组项目的编写,今天基本上把自己负责的前台页面完成了,存在的一些小问题也解决了。