我正在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中列为属性。通过这个工厂,控制器可以访问业务对象;工厂是两层之间的接口。
这些都是自定义的想法,我怀疑有一个预先制定的解决方案。有没有办法解决这个问题? (将业务层与Web /页面控制器层集成?)或者由程序员来编写如上所述的自定义解决方案?
谢谢,(抱歉长问题 - 因此大胆)
KTM
答案 0 :(得分:3)
您的控制器需要以某种方式保存对业务对象的引用。为了完全受益于Spring,您需要将这些依赖项注入控制器。
这不是紧密耦合,特别是如果这些业务对象实现了一个接口,而你的控制器只知道该接口。
依赖注入消除了对工厂的需求,因为您需要了解我们没有工厂的服务接口:
SomeBusinessServiceInterface service = businessFactory.getBusinessService();
但是想想这样:你必须以某种方式获得某些服务的引用(使用该服务接口进行低耦合),并且很可能需要缓存它 - 将其存储为实例变量。既然你已经拥有了这一点,那么提供一个setter就不会比你已经拥有更多的web和业务层。
如果setter看起来不自然(有时是),请使用构造函数注入将其实现为经典的OO聚合。
关于应用程序上下文配置,Spring允许您定义使用web.xml中的ContextLoaderListener定义的webapp范围的应用程序上下文。这通常是您的所有业务bean定义应该驻留的位置。您的-servlet.xml应用程序上下文绑定到servlet,并且通常应该包含MVC内容,引用根上下文中的bean,因为该上下文自动成为所有-servlet.xml的父级(因此所有bean都可见小服务程序)。