比如,网站后台,有很多公共的部分,页首,页尾,侧边栏 这些每个页面都有。
而这很多数据,比如网站名称,侧边栏列表,这些都是从数据库里取出的,像下面这样传到到前台。
@ModelAttribute
public ModelAndView index() {
ModelAndView modelAndView = new ModelAndView("admin/index");
List<Menu> list = new ArrayList<>();
list.add(new Menu("fa fa-dashboard", "仪表盘", contextPath+"/dashboard"));
list.add(new Menu("fa fa-pencil", "帖子管理", contextPath+"/posts"));
list.add(new Menu("fa fa-book", "分类管理", contextPath+"/categories"));
list.add(new Menu("fa fa-comment", "回复管理", contextPath+"/replies"));
list.add(new Menu("fa fa-users", "用户管理", contextPath+"/users"));
modelAndView.addObject("menuList", list);
return modelAndView;
}
现在的困惑是,如果让每个页面都能显示上面的数据
每个页面都要在对应的方法里都要写上上面这一段代码,将网站信息装到 Model 里吗?
有什么办法,能减少代码冗余吗?
我这里有几种备选方法,以前用过,感觉很 low,不知道正常的解决办法是什么。
1、使用 @ModelAttribute 注解,在所有方法前都加载该该方法
/**
* 公共加载部分
* @param model
*/
@ModelAttribute
public void loadCommon(Model model) {
List<Menu> list = new ArrayList<>();
list.add(new Menu("fa fa-dashboard", "仪表盘", contextPath+"/dashboard"));
list.add(new Menu("fa fa-pencil", "帖子管理", contextPath+"/posts"));
list.add(new Menu("fa fa-book", "分类管理", contextPath+"/categories"));
list.add(new Menu("fa fa-comment", "回复管理", contextPath+"/replies"));
list.add(new Menu("fa fa-users", "用户管理", contextPath+"/users"));
model.addAttribute("menuList", list);
}
/**
* 获取后台管理主页面
*
* @return
*/
@GetMapping
public String index() {
return "admin/index";
}
感觉上面的方法还是很冗余,每个控制器里都要写,每个方法加载都执行,很不好。
2、在过滤器或者拦截器里将网站数据加载进去
跟上面效果差不多,每个方法都要执行
3、ajax 加载内容部分,共有部分不变
这个方法挺好的,但是我我还是希望页面刷新比较好
这里求 SpringMVC 如何将共有的数据加载到前台,减少冗余
补充:
这里再提两个问题
1、如何是网站前台呢?也使用 iframe 吗,不可能吧?
2、比如网站名称,网站关键字,网站描述,网站备案号,网站等待信息,这种键值对的,数据表怎么设计呢?
页首,页尾,侧边栏这些数据放到后台session中;前台封装一般使用Iframe控制 控制页面布局
用jstl,先把数据封装传到前台
小白表达一下自己的理解。前端如果是jsp的话,可以把页首、页尾、侧边栏等公共部分提取出来单独写一个jsp,在其他jsp中include. 后台的话,不知是否可以用redis缓存起来,看分类应该不是实时数据。
数据作用域 有 page 、request 、session 、 application
如果你这个菜单是用于全局的 就可以存至session 或者 application
这样就不需要每次都要调用了
我想到的都是与Thymeleaf无关的实现,仅供参考:
1.iframe
体验不好,交互时需要控制整页或其他容器的src
2.
<header th:include="header"></header>
采用Thymeleaf标签引入相关的html,在被引用对象中初始化加载时,自己写ajax请求,异步js控制显示
3.jquery的load
$容器.load传入参数控制容器重载,其实和方法2是一个意思。
肯定不能放session,放session如果不主动去修改的话value一直不变,比如消息个数的显示,查看过后刷新后记录条数还是那么多,总不至于每阅读一条消息,就修改下session。