2011-01-21 37 views
1

我正在Eclipse中编写Spring Web应用程序。在WEB-INF中,我有一个web.xml文件,它为myapp-servlet.xml文件提供了一个servlet映射。Spring Web应用程序 - 如何从页面控制器到业务层

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

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

我想过这样做的一种方式是将我的业务对象作为属性添加到myapp-servlet.xml文件中的页面控制器。然而,这似乎将业务层和控制器整合到了我所喜欢的太多 - 这意味着每个控制器都需要业务对象的属性。

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

这些都是自定义的想法,我怀疑有一个预先制定的解决方案。有没有办法解决这个问题? (将业务层与Web /页面控制器层集成在一起?)还是由程序员来完成一个定制解决方案,如上所述?

谢谢,(和长期问题遗憾 - 因此黑体)
KTM

+0

你看过Spring的petclinic教程吗?它在功能方面相当基础,但在回答这些布线和架构问题方面做得很好。你可以从SVN获得最新版本,https://src.springframework.org/svn/spring-samples – Fil 2011-01-21 21:15:36

回答

3

你的控制器需要以某种方式握住你的业务对象的引用。为了充分受益于Spring,您需要将这些依赖关系注入到控制器中。

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

依赖注入省去了工厂,你将需要了解我们的服务接口,而无需工厂:

SomeBusinessServiceInterface service = businessFactory.getBusinessService(); 

不过想想这样的:你必须以某种方式得到一些服务的参考(使用该服务接口进行低耦合),而且很可能需要将其缓存 - 将其存储为实例变量。既然你有这个问题,那么提供一个setter不会让你的web和业务层次更加接近现实。

如果一个setter看起来不自然(有时是)使用构造函数注入来实现这个经典OO聚合。

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

+0

谢谢!但是,什么让插头中的火花,可以这么说呢?在非web应用程序中,它是静态的void main。在Web应用程序中,应用程序是否在TCP会话开始时启动?第一个HTTP请求是否实例化了所有的bean,然后后续的HTTP请求会推迟到控制器?唯一自动实例化的bean是那些对应于htm页面的bean ......所以我必须通过这些bean引用(即实例化)我的业务bean,对吗? – ktm5124 2011-01-21 21:00:22

相关问题