【问题标题】:Spring Web Application - How to get from page controllers to business layerSpring Web Application - 如何从页面控制器到业务层
【发布时间】:2011-01-21 20:24:26
【问题描述】:

我正在 Eclipse 中编写一个 Spring Web 应用程序。在 WEB-INF 中,我有一个 web.xml 文件,它为 myapp-servlet.xml 文件提供了一个 servlet 映射。

在 myapp-servlet.xml 中,我有一个用于页面控制器的 bean。我推测 Spring DispatcherServlet 从它自己的 ApplicationContext 实例化这些 bean。当我将项目作为服务器运行时,它会显示 index.jsp 文件 - “hello hello hello”。

现在我还推测,如果我在这个 index.jsp 文件中放置一个发送发布数据的提交按钮,我的页面控制器将收到 HTTP 请求的通知。 但是,如何从页面控制器与我的应用程序的其余部分(业务层)进行交互?我正在编写一个 LDAP 目录查找应用程序,一旦用户输入了我想要返回的名称电子邮件。因此,当用户输入名称并点击提交时,我想与我的 LDAP 业务层进行通信。我该怎么做?

我想到的一种方法是将我的业务对象作为属性添加到 myapp-servlet.xml 文件中的页面控制器。但是,这似乎将业务层和控制器集成得太多,我不喜欢 - 这意味着每个控制器都需要业务对象的属性。

我想到的另一种方法是创建一种工厂,所有控制器都将其列为其 XML 中的属性。通过这个工厂,控制器可以访问业务对象;工厂是两层之间的接口。

这些都是定制的想法,我怀疑有一个预制的解决方案。是否已经有解决此问题的方法? (将业务层与网页/页面控制器层集成?)还是由程序员来编写我上面概述的自定义解决方案?

谢谢,(很抱歉这个问题很长 - 因此是粗体)
公里

【问题讨论】:

  • 你看过 Spring 的宠物诊所教程吗?它在功能方面相当基础,但很好地回答了这些布线和架构问题。您可以从 SVN 获取最新消息,src.springframework.org/svn/spring-samples

标签: java spring tomcat spring-mvc


【解决方案1】:

您的控制器需要以某种方式保存对您的业务对象的引用。为了充分利用 Spring,您需要将这些依赖项注入到您的控制器中。

这不是紧密耦合,特别是如果那些业务对象实现了一个接口并且您的控制器将只知道该接口。

依赖注入消除了对工厂的需求,因为您需要了解我们没有工厂的服务接口:

SomeBusinessServiceInterface service = businessFactory.getBusinessService();

但是这样想:您必须以某种方式获取某个服务的引用(使用该服务接口以实现低耦合)并且很可能需要缓存它——将其存储为实例变量。既然你已经拥有了,那么提供一个 setter 并不会比它们现在更耦合你的 web 和业务层。

如果 setter 看起来不自然(有时确实如此),请使用构造函数注入将其实现为经典的 OO 聚合。

关于应用程序上下文配置,Spring 允许您定义使用 web.xml 中的 ContextLoaderListener 定义的 webapp 范围的应用程序上下文。这通常是所有业务 bean 定义应该驻留的地方。您的 -servlet.xml 应用程序上下文绑定到 servlet 并且通常应该包含 MVC 内容,引用根上下文中的 bean,因为该上下文自动成为所有 -servlet.xml 的父级(因此所有 bean 对您来说都是可见的servlet)。

【讨论】:

  • 谢谢!但是,可以这么说,是什么让火花塞进了插头?在非 Web 应用程序中,它是静态 void main。在 Web 应用程序中,应用程序是否在 TCP 会话开始时启动?第一个 HTTP 请求是否实例化了所有的 bean,然后后续的 HTTP 请求服从控制器?唯一自动实例化的 bean 是那些对应于 htm 页面的 bean...所以我必须通过这些 bean 引用(即实例化)我的业务 bean,对吗?
  • 关于您的应用程序上下文配置,让我编辑我的答案(只是忘记了)。
  • 现在,回到您的问题:根 Web 应用程序上下文(使用 ContextLoaderListener 定义)在部署时初始化。至于 servlet,如果您声明要在部署时使用 进行初始化,则关联的应用程序上下文也将被初始化,否则在第一次请求时。
猜你喜欢
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2012-11-08
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多