gpt4 book ai didi

java - 我如何让 spring 为所有 Controller / Action 设置某些变量

转载 作者:行者123 更新时间:2023-11-29 03:41:56 25 4
gpt4 key购买 nike

我使用 google app engine、spring 和 tiles 的配置,其中每个 Controller 操作都会导致呈现一组嵌套(tiles)jsp。要为(几乎)每个 Controller 计算/设置 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)”方法的解决方案。

最佳答案

Tiles 知道 ViewPreparer 的概念. ViewPreparer 在呈现定义之前执行,是设置 Tiles View 通用属性的好地方。这些属性可以是请求属性(如下所示)或 tiles 属性,如上述 ViewPreparer tutorial page 中的示例所示。 .

ViewPreparer 被实现为“正常”的 spring 服务:

@Component
public class YourViewPreparer implements ViewPreparer {
@Autowired
private UserService userService;

@Override
public void execute(TilesRequestContext tilesContext, AttributeContext attributeContext) {
// Some magic here to get the HttpRequest...
Object[] requestObjects = tilesContext.getRequestObjects();
if (requestObjects.length == 2) {
HttpServletRequest request = (HttpServletRequest) requestObjects[0];
User user = userService.getCurrentUser();
request.setAttribute("isLoggedIn", user != null);
}
}
}

然后通过设置 preparerFactoryClass 属性来配置您的 TilesConfigurer,以获取任何 ViewPreparer beans,如下所示:

<bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" id="tilesConfigurer">
<property name="definitions">
...
</property>
<property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SimpleSpringPreparerFactory" />
</bean>

并在您的 View 声明中定义准备器。您可以从基础 View 扩展所有 View ,这样准备程序声明只需执行一次。

<definition name="main" preparer="com.example.YourViewPreparer">
...
</definition>

<definition name="myView" extends="main">
...
</definition>

或者,您也可以实现自己的 HandlerInterceptor如果您有 Tiles View 以外的其他 View 。

关于java - 我如何让 spring 为所有 Controller / Action 设置某些变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12769046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com