如何使用Spring连接模型视图和控制器

时间:2012-03-28 06:05:46

标签: java spring swing model-view-controller inversion-of-control

在应用MVC模式的swing GUI应用程序中,我们如何使用Spring连接模型视图和控制器?即应该使用弹簧注入哪些bean(模型,视图或控制器)以及应该从应用程序创建什么?我在开发应用程序时应用了here描述的MVC模式。提前谢谢。

5 个答案:

答案 0 :(得分:2)

如果你对你正在使用的技术有一定的回旋余地,我会说你转到(格里芬)[http://griffon.codehaus.org/]。它在后台使用spring,你也可以获得groovy和Swing UI构建器的强大功能。最棒的是,您仍然可以重用到目前为止编写的java代码。此外,您不必担心DI和东西。格里芬为你处理它。

答案 1 :(得分:1)

在我的一个项目中,我成功使用了Spring Rich Client

如果你是从头开始,我建议你看看它,值得。它还提供了一些开箱即用的服务(如身份验证框等)。

答案 2 :(得分:0)

我建议您使用“spring mvc”。

Jsp(View)控制器如何显示数据;

控制器控制返回视图所需的数据;

服务器控制器系统逻辑;

模型是数据库模型。

答案 3 :(得分:0)

我建议你去看看格里芬,这没什么好吃的。 MVC模式深深植根于Griffon的DNA中,看看这个示例应用程序,如Griffon指南所示

http://griffon.codehaus.org/guide/0.9.5-rc2/guide/2.%20Getting%20Started.html#2.3%20A%20Groovy%20Console%20Example

Griffon为每个MVC成员提供基本的DI功能,您只需要按照命名约定定义属性。您通常会将大部分应用程序逻辑放在其中的服务也会自动注入控制器,如指南中所述

http://griffon.codehaus.org/guide/0.9.5-rc2/guide/8.%20Controllers%20and%20Services.html#8.2%20Services

但是你也可以通过Spring插件来使用Spring DI

http://artifacts.griffon-framework.org/plugin/spring

可以使用标准XML方法,注释或Groovy Spring DSL来定义Spring bean。

答案 4 :(得分:0)

我在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;

}
}