【问题标题】:How to wire Model View and Controller using Spring如何使用 Spring 连接模型视图和控制器
【发布时间】:2012-04-11 17:13:19
【问题描述】:

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

【问题讨论】:

  • @trashgod,感谢您的链接,但这不是我要寻找的。使用 Swing 介绍 Spring 文章提供了有关如何在表模型等摆动组件模型中连接 bean 的信息...我需要了解的是如何在更分离的 MVC 中应用 DI,其中模型是域对象,控制器执行业务逻辑。
  • 首先你可以使用什么版本的spring?这些信息会有所帮助,因为您编写 mvc 应用程序的方式会有所不同。

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


【解决方案1】:

我在 spring 中定义了所有 bean,并在需要时使用工厂方法创建视图。控制器被注入到视图中,模型和视图通过spring添加到控制器中。

以下是我想出的一个简单示例的代码示例,以便找到解决方案:(对不起,长篇大论!)

应用程序上下文文件:

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

}
}

【讨论】:

    【解决方案2】:

    我推荐你看看 Griffon,这不会让任何人感到惊讶。 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。

    【讨论】:

      【解决方案3】:

      我建议你可以使用“spring mvc”。

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

      Controller控制返回视图所需数据;

      服务器控制器系统逻辑;

      Model 是数据库模型。

      【讨论】:

      • 这是一个桌面应用,spring MVC只能在web应用中使用。
      【解决方案4】:

      如果您在使用的技术上有一些余地,我会说您切换到 (Griffon)[http://griffon.codehaus.org/]。它在后台使用 spring,您还可以获得 groovy 和 Swing UI 构建器的强大功能。最好的部分是,您仍然可以重用迄今为止编写的 java 代码。此外,您无需担心 DI 和其他东西。格里芬为您处理。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2013-08-28
          • 2014-01-18
          • 1970-01-01
          • 1970-01-01
          • 2012-04-24
          • 1970-01-01
          • 2013-09-28
          • 1970-01-01
          • 2022-01-17
          相关资源
          最近更新 更多