基于使用Spring Boot的条件,将片段包括在模块布局中



我是Thymelaf模板引擎的新手,但我曾使用过其他模板引擎,如blade。

我想根据条件包括片段,比如我为不同的用户(例如管理员、经理、超级用户、用户等)提供不同的菜单。我将这些菜单保存在标题中,每个标题都在不同的片段文件中,比如adminheader, defaultheader, userheader.html

现在我想检查用户是否登录。如果未登录,则使用defaultheader显示布局,或者如果已登录,则检查用户是否为管理员。如果用户是admin,则显示具有adminheader的页面,否则显示具有userheader的网页。

努力:

到目前为止,页面以默认标题打开,我有如下代码的设计布局文件,

layout.html

<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
  <head layout:include="layouts/fragments/head :: headFragment">
  </head>
  <body>
       <div class="container-fluid">
           <header id="header" class="row navbar-fixed-top" layout:include="layouts/fragments/header :: headerFragment" >
           </header>
           <section class="row margin-top-120">
               <div class="container-fluid">
                    <section id="main-content" class="col-lg-12" layout:fragment="content">
                    </section>               
               </div>
           </section>
           <footer id="footer" class="row">
               <div class="container-fluid" layout:include = "layouts/fragments/footer :: footerFragment">
               </div>
           </footer>
       </div>
   </body>
</html>

我已经在这个布局文件中包含了headerFragment,并且运行良好。现在不知道如何根据条件包含其他头片段。

**Updated**

控制器

@Controller
public class IndexController {
    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
    @RequestMapping("/")
    public String index(){
        return "index";
    }
    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String login(User user) {
        logger.info("Hello Get Login");
        return "login";
    }
    @RequestMapping(value="/validateLogin", method=RequestMethod.POST)
    public String validateLogin(@Valid @ModelAttribute("user") User user, BindingResult bindingResult) {
        logger.info(user.toString());
        if (bindingResult.hasErrors()) {
            logger.info(bindingResult.toString());
            return "login";
        }
        return "redirect:/";
    }
    @RequestMapping("/logout")
    public String logout(){
        return "index";
    }
....
}

请给我建议解决办法。

谢谢。

您可以使用表达式来包含条件中的不同片段。在百里香的文献中有一个例子。

templatename :: domselector中,templatenamedomselector都可以是全特征表达式。在下面的例子中,我们希望根据条件包括不同的片段。如果经过身份验证的用户是管理员,我们将显示与普通用户不同的页脚:

<div th:replace="fragments/footer :: ${#authentication.principal.isAdmin()} ? 'footer-admin' : 'footer'">
  &copy; 2013 The Static Templates
</div>

感谢@Patrick的回答。但我找到了自己的解决方案。

我不知道它是好是坏。请告诉我。

layout.html

<!DOCTYPE html>
<html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
  <head layout:include="layouts/fragments/head :: headFragment"></head>
  <body>
       <div class="container-fluid">
            ((${session.containsKey('user')}) ? 
            <header id="header" class="row navbar-fixed-top" layout:include="layouts/fragments/admin-Header :: headerFragment">
           </header> : 
           <header id="header" class="row navbar-fixed-top" layout:include="layouts/fragments/default-Header :: headerFragment">
           </header>)
           <section class="row margin-top-120">
               <div class="container-fluid">
                    <section id="main-content" class="col-lg-12" layout:fragment="content">
                    </section>               
               </div>
           </section>
           <footer id="footer" class="row">
               <div class="container-fluid" layout:include = "layouts/fragments/footer :: footerFragment">
               </div>
           </footer>
       </div>
   </body>
</html>

最新更新