【问题标题】:How to prevent multiples instances of same model如何防止同一模型的多个实例
【发布时间】:2026-02-20 22:45:01
【问题描述】:

我想知道如何防止Thymeleaf中同一模型的多个实例,例如:在标题上显示用户名。

<span th:text="${username}">User Name</span>

控制器:

@RequestMapping(value = "/", method = RequestMethod.GET)
public String index(Model model) {
    model.addAttribute("username", "User Name");
    return "index.html";
}

@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String admin(Model model) {
    model.addAttribute("username", "User Name");
    return "indexAdmin.html";
}

@RequestMapping(value = "/page", method = RequestMethod.GET)
public String page(Model model) {
    model.addAttribute("username", "User Name");
    return "page.html";
}

【问题讨论】:

  • 您可以将用户名设置为会话,并可以在百里香中访问它,从而避免重复代码。

标签: java spring thymeleaf


【解决方案1】:

Spring 允许您执行以下操作:

@ModelAttribute("username")
public String username() {
    return "User Name";
}

此代码将为封闭控制器处理的每个请求设置一个“用户名”属性。您还可以访问几乎所有可用于 @RequestMapping 方法的参数,包括模型对象本身。

如上面评论中所述,如果您想在特定用户的请求中保留某些对象(例如,从数据库中获取它并使用该实例填充模型),那么您可以创建一个 @SessionAttributes 处理程序或将手动将对象放入会话中。

似乎可以从问题中删除“百里香”标签

【讨论】:

  • 感谢您的回复!正如您在狙击代码中显示的那样,用户名模型属性将始终为“用户名”,不是吗?所以......我认为@Apollo 解决方案更灵活。你怎么看?
  • 这取决于您的需求。只有两种选择。 ModelAttribute 处理程序将在每个请求上调用。如果您想在特定用户(会话)的请求中保留一些对象,那么您可以使用 @SessionAttributes 或只是将该对象手动放入会话中。如果您正在设置登录用户的用户名,那么(很可能)用户本身已经在会话中,对吧?
最近更新 更多