如何使用Spring连接模型视图和控制器
在应用MVC模式的swing应用程序中,我们如何使用Spring连接模型视图和控制器?即应该使用spring注入哪些bean(模型,视图或控制器)以及应用程序创建了哪些内容?在开发应用程序时,我应用了描述为here的MVC模式。提前致谢。如何使用Spring连接模型视图和控制器
我在spring中定义了所有的bean,并在需要时使用工厂方法创建视图。控制器被注入到视图中,模型和视图通过弹簧添加到控制器中。
以下是我想出的一个简单示例中的代码示例,以便找到解决方案:(对于长篇帖子感到抱歉!)
应用程序上下文的文件:
<bean id="firstModel" class="com.model.FirstModel"></bean>
<bean id="secondModel" class="com.model.SecondModel"></bean>
<bean id="firstController" class="com.controller.FirstController" />
<bean
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref local="firstController" />
</property>
<property name="targetMethod">
<value>addModel</value>
</property>
<property name="arguments">
<list>
<value>FIRST</value>
<ref local="firstModel" />
</list>
</property>
</bean>
<bean id="secondController" class="com.controller.SecondController" />
<bean
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref local="secondController" />
</property>
<property name="targetMethod">
<value>addModel</value>
</property>
<property name="arguments">
<list>
<value>SECOND</value>
<ref local="secondModel" />
</list>
</property>
</bean>
<bean
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref local="secondController" />
</property>
<property name="targetMethod">
<value>addModel</value>
</property>
<property name="arguments">
<list>
<value>FIRST</value>
<ref local="firstModel" />
</list>
</property>
</bean>
<bean id="firstForm" class="com.view.FirstForm">
<property name="controller">
<ref bean="firstController" />
</property>
</bean>
<bean id="secondForm" class="com.view.SecondForm">
<property name="controller">
<ref bean="secondController" />
</property>
</bean>
以下是抽象控制器类:
public class AbstractController implements PropertyChangeListener {
Map<Type, BaseView> registeredViews;
Map<Type, AbstractModel> registeredModels;
public AbstractController() {
registeredViews = new HashMap<Type, BaseView>();
registeredModels = new HashMap<Type, AbstractModel>();
}
public void addModel(Type type, AbstractModel model) {
registeredModels.put(type, model);
model.addPropertyChangeListener(this);
}
public void removeModel(AbstractModel model) {
registeredModels.remove(model);
model.removePropertyChangeListener(this);
}
public void addView(BaseView view, Type type) {
registeredViews.put(type, view);
}
public void removeView(javax.swing.JFrame view) {
registeredViews.remove(view);
}
public void propertyChange(PropertyChangeEvent evt) {
for (BaseView view : registeredViews.values()) {
view.modelPropertyChange(evt);
}
}
protected void setModelProperty(String propertyName, Object newValue) {
for (AbstractModel model : registeredModels.values()) {
Statement statment = new Statement(model, "set" + propertyName, new Object[] { newValue });
try {
statment.execute();
} catch (NoSuchMethodException e) {
continue;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
以下是抽象模型类:
public class AbstractModel {
protected PropertyChangeSupport propertyChangeSupport;
public AbstractModel() {
propertyChangeSupport = new PropertyChangeSupport(this);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
}
以下是代码示例视图界面:
public interface BaseView {
void modelPropertyChange(PropertyChangeEvent evt);
public abstract void showForm();
}
以下是工厂类的代码示例:
public class FormFactory {
private ApplicationContext context;
private static FormFactory viewFactory;
private FormFactory() {
if (context == null) {
context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
}
}
public static synchronized FormFactory getInstance() {
if (viewFactory == null) {
viewFactory = new FormFactory();
}
return viewFactory;
}
public BaseView createForm(Type type) {
BaseView form = null;
switch (type) {
case FIRST:
form = (BaseView) context.getBean("firstForm");
break;
case SECOND:
form = (BaseView) context.getBean("secondForm");
break;
default:
break;
}
return form;
}
}
如果你在使用的技术上有一些余地,我会说你改用(Griffon)[http://griffon.codehaus.org/]。它在后台使用了spring,并且您还获得了groovy和Swing UI构建器的强大功能。最好的部分是,您仍然可以重复使用迄今为止编写的Java代码。此外,你不需要担心DI和东西。格里芬为你处理它。
我建议你可以使用“spring mvc”。
jsp(查看)控制器如何显示数据;
控制器控制返回视图所需的数据;
服务器控制器的系统逻辑;
模型是数据库模型。
这是一个桌面应用程序,Spring MVC只能在web应用程序中使用。 – 2012-04-03 06:01:47
如果我建议你看一下格里芬,那就没有人会感到惊讶了。 MVC模式是根深蒂固在格里芬的DNA,看看这个示例应用程序,如图所示格里芬指南中
格里芬提供了每个MVC会员基本DI功能,您只需要定义下一个属性命名约定。服务,在那里你会通常把大部分的应用程序逻辑的,也将自动注入到控制器,作为指南中
解释但是你可以使用Spring的DI通过Spring插件太
http://artifacts.griffon-framework.org/plugin/spring
Spring bean可以使用标准XML方法,注释或Groovy Spring DSL来定义。
参见[*介绍使用摇摆*到Spring](http://www.ibm.com/developerworks/java/tutorials/ J-springswing /)。 – trashgod 2012-03-28 06:13:47
@trashgod,感谢您的链接,但这不是我正在寻找的。 Spring使用Swing介绍文章提供了如何在摆动组件的模型(如表模型)中连接bean的信息......我需要了解的是如何在更独立的MVC中应用DI,其中模型是域对象并且控制器执行业务逻辑。 – 2012-03-28 06:21:58
首先您允许使用哪种版本的弹簧?这样的信息有助于解决这些问题,因为在编写mvc应用程序方面存在差异。 – 2012-03-30 07:07:34