在應用MVC模式的swing應用程序中,我們如何使用Spring連接模型視圖和控制器?即應該使用spring注入哪些bean(模型,視圖或控制器)以及應用程序創建了哪些內容?在開發應用程序時,我應用了描述爲here的MVC模式。提前致謝。如何使用Spring連接模型視圖和控制器
回答
我在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;
}
}
在我的一個項目中,我成功使用了Spring Rich Client。
如果你從頭開始,我建議你看看它,它是值得的。它還提供一些開箱即用的服務(如驗證框等)。
如果你在使用的技術上有一些餘地,我會說你改用(Griffon)[http://griffon.codehaus.org/]。它在後臺使用了spring,並且您還獲得了groovy和Swing UI構建器的強大功能。最好的部分是,您仍然可以重複使用迄今爲止編寫的Java代碼。此外,你不需要擔心DI和東西。格里芬爲你處理它。
我建議你可以使用「spring mvc」。
jsp(查看)控制器如何顯示數據;
控制器控制返回視圖所需的數據;
服務器控制器的系統邏輯;
模型是數據庫模型。
這是一個桌面應用程序,Spring MVC只能在web應用程序中使用。 – 2012-04-03 06:01:47
如果我建議你看一下格里芬,那就沒有人會感到驚訝了。 MVC模式是根深蒂固在格里芬的DNA,看看這個示例應用程序,如圖所示格里芬指南中
格里芬提供了每個MVC會員基本DI功能,您只需要定義下一個屬性命名約定。服務,在那裏你會通常把大部分的應用程序邏輯的,也將自動注入到控制器,作爲指南中
解釋但是你可以使用Spring的DI通過Spring插件太
http://artifacts.griffon-framework.org/plugin/spring
Spring bean可以使用標準XML方法,註釋或Groovy Spring DSL來定義。
- 1. 模型,視圖和控制器如何連接?
- 2. 模型視圖控制器中的模型視圖控制器
- 3. 如何使用模型對象的Yii控制器和視圖
- 4. 如何將模型和控制器連接到視圖中的按鈕
- 5. 模型視圖控制器
- 6. 如何使用模型/視圖/控制器方法制作GUI?
- 7. 如何使用模型和控制器
- 8. 模型 - 視圖 - 控制器和Java
- 9. 模型視圖控制器和回調
- 10. 如何連接容器視圖控制器與視圖
- 11. Java應用程序,鏈接模型,視圖和控制器
- 12. 如何使用spring mvc控制視圖?
- 13. 如何使用工具欄連接兩個視圖控制器
- 14. 如何在控制器/視圖mvc中使用多個模型?
- 15. 在可可中,您如何將模型連接到視圖控制器?
- 16. 如何從控制器或視圖從belongs_to模型連接到has_many表?
- 17. Ember statemanager,控制器,視圖,模型:如何將它們連接在一起?
- 18. 如何將表視圖「連接」到視圖控制器
- 19. 如何在控制器和視圖之間建立連接?
- 20. 使用視圖控制器既作爲模式視圖控制器和作爲標籤欄視圖控制器
- 21. CakePHP:如何在控制器,模型和視圖中使用(如果可能)類?
- 22. 在Codeigniter中:如何識別視圖的模型和控制器?
- 23. Spring Roo創建控制器和視圖
- 24. 連接MVC模型視圖和關聯的Knockout.js視圖模型
- 25. 如何使用模塊,控制器和視圖生成URL?
- 26. 如何使用Storyboard將兩個視圖控制器連接到一個視圖控制器?
- 27. mvc無視圖 - 控制器連接
- 28. 視圖控制器按鈕連接Swift
- 29. 如何使用RSpec測試設計模型,控制器和視圖?
- 30. Ember.JS - 如何在同一頁面使用多個模型,控制器和視圖?
參見[*介紹使用搖擺*到Spring](http://www.ibm.com/developerworks/java/tutorials/ J-springswing /)。 – trashgod 2012-03-28 06:13:47
@trashgod,感謝您的鏈接,但這不是我正在尋找的。 Spring使用Swing介紹文章提供瞭如何在擺動組件的模型(如表模型)中連接bean的信息......我需要了解的是如何在更獨立的MVC中應用DI,其中模型是域對象並且控制器執行業務邏輯。 – 2012-03-28 06:21:58
首先您允許使用哪種版本的彈簧?這樣的信息有助於解決這些問題,因爲在編寫mvc應用程序方面存在差異。 – 2012-03-30 07:07:34