一下子转入springboot的怀抱之后,对于之前通过xml进行的一些配置。转成完全基于注解式,可能都有些不习惯吧。此次面对一个这样的需求,计划将公用的基础信息进行查询,可以直接给页面使用。
需求介绍
页面使用的Thymeleaf框架,使用框架的模板,将整体页面布局进行拆分。其中,页面头作为公用的模板引入到了每一个页面。页面里面使用Thymeleaf标签进行后台动态数据的取值。这样做就会产生一个问题:即动态数据变量如何每次都获取到值?
总结到如下两种解决方案:
- 使用缓存技术。之前写过一篇springboot和Ehcache集成的文章。springboot整合EHCache,可以参考该文章。但是,这样的话需要每一次都进行缓存的取值,比较繁琐。上次说过,使用springboot的缓存技术去查询,定义拦截器,然后每次都去查询数据库(会自动识别,第一次才会查询数据库,之后不再查询数据库)。但是,无论这种方式如何去优化,总之都要进行缓存的取值。
- 使用拦截器拦截,之后存入servlet的attribute。这样的话,公用的Thymeleaf模板直接去servlet下面取值就好了。
相对于第一种方案,第二种比较简洁,不必每次都去查询。可以说是,一次拦截,终身受益。针对于第二种方案,下面重点介绍一下,说一下整体的实现过程。
实现方式
实现思路
实现思路很简单,定义拦截器,拦截我们制定的请求。之后将数据存入request。页面直接从request里面取值。
实现步骤
- 定义拦截器
这个不必多说,继承HandlerInterceptorAdapter,之后重写preHandle即可。代码如下以供参考:
/**
* 网站信息拦截器,将网站的基础信息进行拦截
*/
@Component
public class LimitIntercepterForWebsite extends HandlerInterceptorAdapter{
Logger logger = LoggerFactory.getLogger(LimitIntercepterForWebsite.class);
@Autowired
private EduWebsiteProfileService eduWebsiteProfileService;
@Autowired
private EduWebsiteNavigateService eduWebsiteNavigateService;
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取配置信息
Map<String,Object> websitemap = eduWebsiteProfileService.getWebsiteProfileByType("web");
request.setAttribute("websitemap",websitemap);
Map<String,Object> logomap = eduWebsiteProfileService.getWebsiteProfileByType("logo");
request.setAttribute("logomap",logomap);
Map<String, Object> navigateMap = eduWebsiteNavigateService.getWebNavigate();
request.setAttribute("navigateList",navigateMap.get("INDEX"));
return super.preHandle(request, response, handler);
}
}
注意:上面定义的拦截器,需要注解为component组件
- 注解配置该拦截器
这里,需要在配置类里面进行拦截器的配置,配置类定义为Configuration,同时继承WebMvcConfigurerAdapter类。重写addInterceptors方法,在该方法里面实现对指定请求的拦截。代码如下以供参考:
//添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//多个拦截器组成一个拦截器链
// addPathPatterns用于添加拦截规则
// excludePathPatterns用户排除拦截
// super.addInterceptors(registry);
registry.addInterceptor(limitIntercepterForWebsite()).addPathPatterns("/**");
}
这里对所有的请求实现了拦截
- 在Thmeleaf框架对于的html页面,进行request变量的取值。
使用内置变量httpServletRequest进行取值即可。代码如下以供参考:
<li th:each="nav:${#httpServletRequest.getAttribute('navigateList')}">
<a th:href="${nav.url}" th:title="${nav.name}">
<span th:text="${nav.name}"></span>
</a>
</li>
综上,完成了一个在springboot下面拦截器的实现。
网友评论