4

In einer Swing-GUI-Anwendung, in der das MVC-Muster angewendet wird, wie können wir die Modellansicht und den Controller mit Spring verbinden? d. h., welche Bohnen (Modell, Ansicht oder Controller) sollten mithilfe der Feder injiziert werden und was sollte aus der Anwendung erstellt werden? Ich habe das MVC-Muster here bei der Entwicklung der Anwendung angewendet. Danke im Voraus.So verkabeln Sie Modellansicht und Controller mit Spring

+0

Siehe auch [* Einführung Schaukel * zum Frühling mit] (http://www.ibm.com/developerworks/java/tutorials/ J-Springschwingen /). – trashgod

+0

@trashgod, danke für den Link, aber das ist nicht was ich suche. Die Einführung in Spring mit dem Artikel Swing bietet Informationen zum Verdrahten von Beans in Swing-Komponentenmodellen wie Tabellenmodellen ... Was ich verstehen muss, ist, wie man DI in einer separaten MVC anwendet, wo Modelle Domain-Objekte sind und die Controller Geschäfte machen Logik. –

+0

vor allem, welche Version von Frühling dürfen Sie verwenden? Solche Informationen helfen, da es Unterschiede gibt, wie Sie Ihre mvc-Anwendung in Abhängigkeit davon schreiben. –

Antwort

0

Ich habe alle Bohnen im Frühjahr definiert und eine Factory-Methode verwendet, um die Ansichten bei Bedarf zu erstellen. Der Controller wird in die Ansicht injiziert, und das Modell und die Ansicht werden über die Feder dem Controller hinzugefügt.

Im Folgenden sind die Codebeispiele aus einem einfachen Beispiel, das ich gefunden habe, um eine Lösung zu finden: (Entschuldigung für die lange Post!)

die Anwendungskontext-Datei:

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

folgende ist die abstrakte Controller-Klasse:

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(); 
     } 

    } 
}  
} 

finden Sie die abstrakte Modellklasse:

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

Es folgt das Codebeispiel der Ansichtsschnittstelle:

finden Sie das Codebeispiel der Factory-Klasse:

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; 

} 
} 
1

Bei einem meiner Projekte habe ich erfolgreich Spring Rich Client verwendet.

Wenn Sie bei Null beginnen, schlage ich vor, dass Sie es sich anschauen, es lohnt sich. Und es bietet auch einige Dienste aus der Box (wie Authentifizierungsbox und so).

2

Wenn Sie etwas Spielraum in den Technologien haben, die Sie verwenden, würde ich sagen, dass Sie zu (Griffon) wechseln [http://griffon.codehaus.org/]. Es verwendet Frühling im Hintergrund und Sie erhalten auch die Kraft von groovy und Swing UI-Builder. Der beste Teil ist, dass Sie den Java-Code, den Sie bisher geschrieben haben, immer noch verwenden können. Außerdem müssen Sie sich nicht um DI und solche Sachen sorgen. Griffon behandelt es für Sie.

0

Ich schlage vor, dass Sie "Federmvc" verwenden können.

Jsp (View) Controller, wie die Daten angezeigt werden;

Controller Kontrolle der Rückkehr der Ansicht erforderlichen Daten;

Server-Controller die Systemlogik;

Modell ist das Datenbankmodell.

+0

Dies ist eine Desktop-Anwendung, Feder MVC kann nur in Web-Anwendungen verwendet werden. –

0

Es würde niemanden überraschen, dass ich Ihnen empfehlen würde, sich Griffon anzuschauen. Das MVC-Muster ist tief in Griffon DNA engrained, haben einen Blick auf dieses Beispiel-App wie im Griffon Führer

gezeigt

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

Griffon Grund DI-Funktionen für jedes MVC Mitglied bietet, müssen Sie nur Eigenschaften definieren folgende ein Namenskonvention. Dienstleistungen, wo Sie in der Regel die meisten der Logik setzen würde der Anwendung, werden ebenfalls automatisch in Controller injiziert, wie die Führung in

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

erklärt auch immer Sie den Einsatz von Spring DI auch über den Frühling Plugin

machen

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

Spring-Beans können mit dem Standard-XML-Ansatz, Annotationen oder Groovy Spring DSL definiert werden.

Verwandte Themen