接着之前的项目进行开发
首先来实现一下新闻归档,在newsService钟实现新的方法
@Override
public Map<String, List<News>> archiveNew() {
List<String> years = newRepository.findGroupYear();
Map<String,List<News>> map = new LinkedHashMap<>();
for(String year:years){
map.put(year,newRepository.findByYear(year));
System.out.println(year);
}
return map;
}
@Override
public Long countNew() {
return newRepository.count();
}
之后新建ArchiveShowController
@Controller
public class ArchiveShowController {
@Autowired
private NewService newService;
@GetMapping("/archives")
public String archives(Model model){
model.addAttribute("archiveMap",newService.archiveNew());
model.addAttribute("newsCount",newService.countNew());
return "archives";
}
}
归档功能就实现了。
运行程序来看一下效果
之后来实现一下登录拦截和异常处理的功能
template导入已经写好的error包来展示异常界面
handle包下新建ControllerExceptionHandler类:
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(HttpServletRequest request,Exception e ) throws Exception{
logger.error("Request:URL:{},Exception:{}",request.getRequestURL(),e);
if(AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){
throw e;
}
ModelAndView mv = new ModelAndView();
mv.addObject("url",request.getRequestURL());
mv.addObject("exception",e);
mv.setViewName("error/error");
return mv;
}
}
之后新建interceptor包,里面写两个类:
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
if(request.getSession().getAttribute("user")==null){
response.sendRedirect("/admin");
System.out.println("拦截");
return false;
}
System.out.println("放行");
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin")
.excludePathPatterns("/admin/login");
}
}
之后来运行程序试一试
可以看到进入通过错误的路由会进入显示异常的页面