Как связать Model View и Controller с помощью Spring - PullRequest
4 голосов
/ 28 марта 2012

В приложении Swing GUI, где применяется шаблон MVC, как мы можем использовать Spring для подключения вида модели и контроллера? то есть какие bean-компоненты (модель, представление или контроллер) должны быть введены с помощью Spring, а что должно быть создано из приложения? Я применил шаблон MVC, описанный здесь при разработке приложения. Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 01 апреля 2012

Если у вас есть некоторая свобода действий в технологиях, которые вы используете, я бы сказал, что вы переключитесь на (Griffon) [http://griffon.codehaus.org/]. Он использует пружину на заднем плане, и вы также получаете мощь Groovy и Swing UI строителей. Самое приятное то, что вы все еще можете повторно использовать Java-код, который вы написали до сих пор. Кроме того, вам не нужно беспокоиться о DI и прочее. Гриффон справится с тобой.

1 голос
/ 30 марта 2012

В одном из моих проектов я успешно использовал Spring Rich Client .

Если вы начинаете с нуля, предлагаю вам взглянуть на это, оно того стоит. Кроме того, он предоставляет некоторые услуги из коробки (например, окно аутентификации и т. Д.).

0 голосов
/ 05 апреля 2012

Я определил все бины весной и использовал фабричный метод для создания представлений при необходимости. Контроллер вводится в вид, а модель и вид добавляются в контроллер через пружину.

Ниже приведены примеры кода из простого примера, который я придумал, чтобы найти решение: (простите за длинный пост!)

файл контекста приложения:

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

}
}
0 голосов
/ 04 апреля 2012

Никого не удивит, что я бы порекомендовал вам взглянуть на Гриффона. Шаблон MVC глубоко укоренен в ДНК Гриффона, посмотрите на это приложение, как показано в Руководстве Гриффона

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

Griffon предоставляет базовые возможности DI для каждого члена MVC, вам нужно только определить свойства в соответствии с соглашением об именах. Сервисы, в которые вы обычно помещаете большую часть логики приложения, также автоматически внедряются в контроллеры, как объясняется в руководстве

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

Однако вы также можете использовать Spring DI через плагин Spring

http://artifacts.griffon -framework.org / плагин / весна

Spring bean-компоненты могут быть определены с использованием стандартного подхода XML, аннотаций или Groovy Spring DSL.

0 голосов
/ 03 апреля 2012

Я полагаю, что вы можете использовать «spring mvc».

Контроллер Jsp (View), как отображать данные;

Контроллер контролирует возврат необходимых данных просмотра;1006 * Контроллер сервера системной логики;

Модель - модель базы данных.

...