We gebruiken reeds een geruime tijd Struts als MVC framework binnen onze applicaties, nu hebben we besloten om ook gebruik te maken van het Spring framework, dit icm met Struts (dus niet het MFC framework die bij Spring geleverd wordt).
nu gaan we zo te werk binnen onze struts-config.xml:
De klasse PersonAction is afgeleid van de Struts DispatchAction. In deze klasse staan dus verschillende acties gegroepeerd die allemaal logisch bij elkaar horen. Hier alle acties die met een person te maken hebben. Deze beginnen allemaal met /person/ Indien we geen gebruik zouden maken van een DispatchAction zitten we per project snel over de 100 actie klasses. Nu zoals er te lezen staat in de documentatie van Spring moet je nu voor elke actie beschrijven welke business logica bean geinjecteerd moeten worden. Dit ziet er zo ongeveer uit in de applicationContext.xml:
In dit voorbeeld is nu slechts 1 bean nodig, maar zoals je kan verwachten is dit bij ander acties niet het geval. Wat ik nu heel vervelend vond is dat je dit voor ELKE mogelijke actie moet schrijven, en zoals eerder gezegd hebben we over de 100 acties, dus in de applicationContext wordt dus heel veel herhaald. Wat in feite niet nodig is omdat het meestal dezelfde bean is die wordt geinjecteerd voor eenzelfde DispatchAction.
Wat ik nu in gedachten had is het volgende, graag wat opmerkingen:
hier maak ik gebruik van een DelegatingActionProxy, en deze doet het volgende:
niet echt nette code maar het doet het volgende: ik haal voor elke actie bv: /person/initEdit en /person/save het laatste deel ervan en geef dan voor beide acties hetzelfde " /person " terug.
In de applicationContext.xml heb ik dan maar 1 bean te definiëren:
en zo vermijd ik een heel stuk herhaalde code. Wat vinden jullie van deze manier van werken? Volledig tegen de bedoeling van de DelegatingActionProxy ? of net daar waar het voor gemaakt is?
nu gaan we zo te werk binnen onze struts-config.xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <action path="/person/initEdit"
name="personForm"
parameter="initEdit"
type="be.xxx.celmeeting.web.action.PersonAction">
<forward name="success" path=".selectEditPerson"></forward>
<forward name="failed" path=".addPerson"></forward>
</action>
<action path="/person/save"
name="personForm"
parameter="save"
validate="true"
type="be.xxx.celmeeting.web.action.PersonAction"
input=".addPerson">
<forward name="success" path=".addPerson"></forward>
</action>
..... |
De klasse PersonAction is afgeleid van de Struts DispatchAction. In deze klasse staan dus verschillende acties gegroepeerd die allemaal logisch bij elkaar horen. Hier alle acties die met een person te maken hebben. Deze beginnen allemaal met /person/ Indien we geen gebruik zouden maken van een DispatchAction zitten we per project snel over de 100 actie klasses. Nu zoals er te lezen staat in de documentatie van Spring moet je nu voor elke actie beschrijven welke business logica bean geinjecteerd moeten worden. Dit ziet er zo ongeveer uit in de applicationContext.xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <bean name="/person/initEdit"
class="be.xxx.celmeeting.web.action.PersonAction">
<property name="personBO">
<ref bean="personBO"/>
</property>
</bean>
<bean name="/person/save"
class="be.xxx.celmeeting.web.action.PersonAction">
<property name="personBO">
<ref bean="personBO"/>
</property>
</bean> |
In dit voorbeeld is nu slechts 1 bean nodig, maar zoals je kan verwachten is dit bij ander acties niet het geval. Wat ik nu heel vervelend vond is dat je dit voor ELKE mogelijke actie moet schrijven, en zoals eerder gezegd hebben we over de 100 acties, dus in de applicationContext wordt dus heel veel herhaald. Wat in feite niet nodig is omdat het meestal dezelfde bean is die wordt geinjecteerd voor eenzelfde DispatchAction.
Wat ik nu in gedachten had is het volgende, graag wat opmerkingen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <action path="/person/initEdit"
name="personForm"
parameter="initEdit"
type="be.xxx.celmeeting.web.proxy.PersonDelegatingProxy">
<forward name="success" path=".selectEditPerson"></forward>
<forward name="failed" path=".addPerson"></forward>
</action>
<action path="/person/save"
name="personForm"
parameter="save"
validate="true"
type="be.xxx.celmeeting.web.proxy.PersonDelegatingProxy"
input=".addPerson">
<forward name="success" path=".addPerson"></forward>
</action> |
hier maak ik gebruik van een DelegatingActionProxy, en deze doet het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| public class PersonDelegatingProxy extends DelegatingActionProxy {
protected String determineActionBeanName(ActionMapping mapping) {
String prefix = mapping.getModuleConfig().getPrefix();
String path = mapping.getPath();
String beanName = prefix;
StringTokenizer stok = new StringTokenizer(path,"/");
return "/" + (String) stok.nextElement();
}
} |
niet echt nette code maar het doet het volgende: ik haal voor elke actie bv: /person/initEdit en /person/save het laatste deel ervan en geef dan voor beide acties hetzelfde " /person " terug.
In de applicationContext.xml heb ik dan maar 1 bean te definiëren:
code:
1
2
3
4
5
6
7
| <bean name="/person"
class="be.xxx.celmeeting.web.action.PersonAction">
<property name="personBO">
<ref bean="personBO"/>
</property>
</bean> |
en zo vermijd ik een heel stuk herhaalde code. Wat vinden jullie van deze manier van werken? Volledig tegen de bedoeling van de DelegatingActionProxy ? of net daar waar het voor gemaakt is?
"Live as if you were to die tomorrow. Learn as if you were to live forever"