4

在應用MVC模式的swing應用程序中,我們如何使用Spring連接模型視圖和控制器?即應該使用spring注入哪些bean(模型,視圖或控制器)以及應用程序創建了哪些內容?在開發應用程序時,我應用了描述爲here的MVC模式。提前致謝。如何使用Spring連接模型視圖和控制器

+0

參見[*介紹使用搖擺*到Spring](http://www.ibm.com/developerworks/java/tutorials/ J-springswing /)。 – trashgod 2012-03-28 06:13:47

+0

@trashgod,感謝您的鏈接,但這不是我正在尋找的。 Spring使用Swing介紹文章提供瞭如何在擺動組件的模型(如表模型)中連接bean的信息......我需要了解的是如何在更獨立的MVC中應用DI,其中模型是域對象並且控制器執行業務邏輯。 – 2012-03-28 06:21:58

+0

首先您允許使用哪種版本的彈簧?這樣的信息有助於解決這些問題,因爲在編寫mvc應用程序方面存在差異。 – 2012-03-30 07:07:34

回答

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; 

} 
} 
1

在我的一個項目中,我成功使用了Spring Rich Client

如果你從頭開始,我建議你看看它,它是值得的。它還提供一些開箱即用的服務(如驗證框等)。

2

如果你在使用的技術上有一些餘地,我會說你改用(Griffon)[http://griffon.codehaus.org/]。它在後臺使用了spring,並且您還獲得了groovy和Swing UI構建器的強大功能。最好的部分是,您仍然可以重複使用迄今爲止編寫的Java代碼。此外,你不需要擔心DI和東西。格里芬爲你處理它。

0

我建議你可以使用「spring mvc」。

jsp(查看)控制器如何顯示數據;

控制器控制返回視圖所需的數據;

服務器控制器的系統邏輯;

模型是數據庫模型。

+0

這是一個桌面應用程序,Spring MVC只能在web應用程序中使用。 – 2012-04-03 06:01:47

0

如果我建議你看一下格里芬,那就沒有人會感到驚訝了。 MVC模式是根深蒂固在格里芬的DNA,看看這個示例應用程序,如圖所示格里芬指南中

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

格里芬提供了每個MVC會員基本DI功能,您只需要定義下一個屬性命名約定。服務,在那裏你會通常把大部分的應用程序邏輯的,也將自動注入到控制器,作爲指南中

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/plugin/spring

Spring bean可以使用標準XML方法,註釋或Groovy Spring DSL來定義。