【问题标题】:Populate model with default attributes使用默认属性填充模型
【发布时间】:2014-06-20 21:59:09
【问题描述】:

我正在使用 Spring-MVC 框架构建一个网站。在模板中,我想包含一些“通用”信息。通用的方式不是特定于当前控制器,而是在每个页面上使用。这可以是生成的菜单、用户登录的分钟数或北极的当前温度。

我目前在做什么
我创建了一个抽象类,其中包含使用默认值填充模型的方法。我的控制器扩展了这个类,我在每个(@RequestMapping-ed)方法中调用了这个方法,这是一个缺点。感觉有点hacky,不是很灵活。

@Component
public abstract class AbstractBaseController {
    @Autowired private SomeService someService;

    protected void populateModel(Model model) {
        model.addAttribute("value", someService.getGenericValue());
    }
}
@Controller
public class HomeController extends AbstractBaseController {
    @RequestMapping("/") public String index(Model model) {
        populateModel(model);
        return "home";
    }
}

我的问题
我应该如何为我的视图提供这些通用属性。有没有比我现在做的更好的方法?

(我正在使用 Spring/Spring-MVC 4、JavaConfig、Thymeleaf 和 thymeleaf-layout-dialect)

【问题讨论】:

  • 你的模板引擎是什么?您使用什么技术来渲染页面?从我的角度来看,最好的方法是定义一个单独的控制器方法来传递此信息,并将此方法与@RequestMapping“绑定”到特定的页面区域。然后,您可以通过页面的 JavaScript 请求请求您的“通用”属性,并将此数据作为例如 JSON 提供。
  • 如文章底部所述,我正在使用 Thymeleaf。如果我理解正确,您的建议将意味着额外的 http 请求来获取数据。你确定这是可取的吗?
  • 是的,在这种情况下,您的任何控制器都不需要知道此属性。它们对于业务逻辑是绝对透明的。这只是与“通用”属性的传递相关的一种特定方法。

标签: java spring-mvc


【解决方案1】:

好的,所以我实际上并没有那么难。您可以使用 @ModelAttribute 注释方法,使其在模板中可用。

@Component
public abstract class AbstractBaseController {
    @Autowired private SomeService someService;

    @ModelAttribute("value")
    protected String getValue() {
        return someService.getGenericValue());
    }
}

请注意,此方法将始终被调用。此外,当模板中未调用 ${value} 时。所以它并不比我在问题中描述的方法更“灵活”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多