【问题标题】:Spring MVC Filter solutionSpring MVC 过滤器解决方案
【发布时间】:2013-03-08 18:53:45
【问题描述】:


我需要你对过滤器使用的建议。只是想知道我在想什么 是一个很好的方法。
所以我的任务是使用 JSP、Spring MVC 2.5、javascript 等开发 5-6 个屏幕。
所有 这些屏幕共享许多常见的数据元素,例如下拉列表等。
我在想 实现过滤器并在 Spring ModelMap 中填充这些下拉值 就在过滤器中,这样每个屏幕都属于过滤器的 URL 模式 获取此数据。
这是一个正确的方法吗?

【问题讨论】:

  • 过滤器?绝对不。也许是 Spring 拦截器,但我个人不愿意如此严重地违反最小意外原则来追求一种过度微观的代码重用方法。将代码放在实用程序类中,并从每个控制器上的 @ModelAttribute 方法调用它。
  • @Affe 我同意拦截器的方法我已经成功实现了这个方法。
  • 感谢 Affe 的评论。微代码重用方法是我的目标:)

标签: java jsp servlets spring-mvc


【解决方案1】:

我相信过滤器可以解决问题,但我会远离这种方法。您也可以使用 Spring 的拦截器来做同样的事情,并且仍然利用 Spring 的特性,例如依赖注入、事务管理和 Spring Data 包。

在您的调度程序配置中设置拦截器。

<mvc:interceptors>
    <mvc:interceptor>
       <mvc:mapping path="/**"/>
       <bean class="org.my.domain.interceptors.LookupHandlerInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

然后定义你的拦截器类:

public class LookupHandlerInterceptor extends HandlerInterceptorAdapter {

        @Autowired
        LookupLoaderApplicationListener loader;

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
             request.setAttribute("lookupList", loader.getCategories());
             return super.preHandle(request, response, handler);
        }
    }

这种方法将允许您利用您可能在应用程序中使用的其他 Spring 功能,例如您可能已设置的任何持久性。然后你可以在你的数据库中管理这个列表。

【讨论】:

  • 谢谢凯文。我认为要在模型属性中持久化数据,我必须使用 @SessionAttributes 和 modelMap 在多个请求之间持久化它。
【解决方案2】:

我认为违反最小意外原则并在应用程序的单独部分隐藏对控制器的正确功能至关重要的代码是不值得的。 /p>

为什么对未来的开发者隐藏设置屏幕的代码?

仅仅因为他们现在都共享共同的参考数据,他们会永远永远吗?一旦对不同屏幕的要求开始出现分歧,就会很快变得丑陋。

您基本上具有使用继承而不是组合来制作控制器的所有缺点,此外,您甚至无法看到控制器中的代码。我将简单地制作一个执行常见工作的实用程序 bean,将其注入控制器,然后编写一行 @ModelAttribute 方法来调用它。将来他们的个人需求发生变化时,混乱会少得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 2012-02-19
    相关资源
    最近更新 更多