我使用谷歌应用引擎、spring 和磁贴的配置,其中每个控制器操作都会导致渲染一组嵌套(磁贴)jsp。jsp 的一些元素要为(几乎)每个控制器计算/设置,例如页面上某处的登录/注销链接:
<%
com.google.appengine.api.users.UserService userService =
com.google.appengine.api.users.UserServiceFactory.getUserService();
com.google.appengine.api.users.User user = userService.getCurrentUser();
if (user != null) {%>
<li class="active"><a href="#feeds">Feeds</a></li>
<li class="active"><a href="<%=userService.createLogoutURL("")%>">Logout</a></li>
<%} else {%>
<li class="active"><a href="<%=userService.createLoginURL("")%>">Login</a></li>
<%}%>
当然,这是可能的,我也可以制作可以简化此类代码的静态类。然而,这不是我喜欢在我的 jsp 中拥有的东西,而且在 thymeleaf 这样的模板引擎中(可能)不可能执行这样的代码。因此,我该如何做这样的事情:
@RequestMapping("/foo")
public class FooController {
@RequestMapping(value="/{bar}", method = RequestMethod.GET)
public String getMovie(@PathVariable String bar, ModelMap model) {
model.addAttribute("bar", bar);
model.addAttribute("message", "message");
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
model.addAttribute("isLoggedIn", user==null);
return "somepage";
}
}
总结如下:我如何防止 isLoggedIn 代码在任何地方重复,最好是一个不同于需要调用一些“initUserModel(model)”方法的解决方案。