1

我几乎在所有页面中都有一个侧边栏,需要一些方法和查询才能执行(比如其中的城市和事件列表)。所以基本上,现在我几乎在所有控制器中调用该方法,然后调用 model.setAttribute("mylist",list) 。

对我来说一个好的解决方案是,当我将它包含在 JSP 中时,我可以为该侧边栏子页面调用控制器或服务,但它在视图层中是不可能的。我能做的就是将 Java 片段代码放在所有页面中都包含的 JSP 子页面中,这很糟糕。

现在我正在添加这些方法调用并在我的所有控制器中设置结果属性,这是很多重复的代码。对于这些情况,什么是好的设计解决方案?

在 Summery 中:我想在几乎所有的控制器中调用一些方法,因为在 Apache Tiles 中,我使用的是侧边栏子页面,它需要在控制器/服务层中完成这些方法调用。

4

3 回答 3

1

如果您需要的是大多数视图中的附加模型属性,我会选择 @ControllerAdvice 注释。在那里,您可以声明使用 @ModelAttribute 注释的方法,这将在每个控制器调用时调用。

这可能会导致一些开销,因此请保持简单快速;)

于 2013-07-18T17:32:40.650 回答
1

另一种选择是将拦截器添加到您的 MVC 配置中。例如,此拦截器检索用户的未读会话数,以便在其导航栏中显示它,并将其作为具有请求范围的属性存储在 HttpServletRequest 中。它也可以添加到 ModelAndView 中:

public class PageModelInterceptor extends HandlerInterceptorAdapter {
    private MessagingService mailboxService;

    public PageModelInterceptor() {
    }

    @Override
    public void postHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler, final ModelAndView modelAndView) {
        addNbConversationUpdates(request);
    }

    private void addNbConversationUpdates(final HttpServletRequest request) {
        if (XSecurity.principal() != null) {
            final int nbUpdatedConversations = mailboxService.getUpdatedConversations(XSecurity.principal().getId()).size();
            request.setAttribute("nbConversationUpdates", nbUpdatedConversations);
        }
    }

    public void setMailboxService(final MessagingService mailboxService) {
        this.mailboxService = mailboxService;
    }
}

这需要添加到您的 dispatcher-servlet.xml 或您的 Web 应用程序上下文声明的任何文件中。

<mvc:interceptor>
    <mvc:mapping path="/ui/**" />
    <bean class="com.xyz.project.web.PageModelInterceptor">
        <property name="mailboxService" ref="mailboxService" />
    </bean>
</mvc:interceptor>

如您所见,您可以声明路径模式,从而排除不需要这样做的 URL。

于 2013-07-18T18:40:06.793 回答
0

如果我正确地回答了您的问题,您需要一些列表对象,您需要将其值显示在左侧/右侧的所有视图页面中。

如果该列表值(从其中填充列表的表)不经常更改,那么您可以点击一次查询并只准备一次列表,然后您可以将该列表设置为会话变量,以便您可以直接在 View 中获取它层。

根据您正确的要求,如果这不起作用,您可以执行一些类似的要求。

于 2013-07-18T15:37:50.830 回答