SpringMVC + Thymeleaf 如何实现让页面公共部分的数据都加载,减少冗余,不是局部刷新

比如,网站后台,有很多公共的部分,页首,页尾,侧边栏 这些每个页面都有。
而这很多数据,比如网站名称,侧边栏列表,这些都是从数据库里取出的,像下面这样传到到前台。

     @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。