You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by Apache Wiki <wi...@apache.org> on 2006/08/04 15:26:57 UTC
[Struts Wiki] Update of "StrutsAndSpring" by ndeloof
Dear Wiki user,
You have subscribed to a wiki page or wiki category on "Struts Wiki" for change notification.
The following page has been changed by ndeloof:
http://wiki.apache.org/struts/StrutsAndSpring
The comment on the change is:
------------------------------------------------------------------------------
- === References ===
+ === Using Spring and Groovy to quick prototype actions ===
- * Struts + Spring 2.0 + Groovy: http://forum.springframework.org/showthread.php?t=27534
+ Spring 2.0 adds support for scripted beans. This mean a script engine can be used to run a script that will look like a regular java class.
+ Struts also support scripted actions, but this requires to change the struts config. This may be a good option, but not if you want your production web application to use compiled java classes, and just use scripting support for quick application prototyping.
+
+ Using Spring 2.0 scripted-beans, Groovy that can parse a 100% java source file and Struts allow to quickly change a "classic" java action into a scripted bean, and just hit refresh in the browser to see effects of a code change.
+
+ == How to ? ==
+
+ 1. Create a simple interface that define the Struts action "execute" method:
+
+ {{{
+ public interface StrutsAction
+ {
+ public abstract ActionForward execute(ActionMapping mapping,
+ ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception;
+
+ }
+ }}}
+
+ 1. Create a SciptedBeanActionAdapter class :
+
+ {{{
+ public class SciptedBeanActionAdapter extends Action {
+ private StrutsAction delegate;
+
+ public SciptedBeanActionAdapter(StrutsAction delegate) {
+ this.delegate = delegate;
+ }
+
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
+ return delegate.execute(mapping, form, request, response);
+ }
+ }
+ }}}
+
+ 1. Configure your web application to use this requestProcessor :
+
+ {{{
+ public class GroovyAutowiringTilesRequestProcessor extends AutowiringTilesRequestProcessor {
+
+ protected Action processActionCreate(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
+ throws IOException {
+ WebApplicationContext wac = getWebApplicationContext();
+ String beanName = DelegatingActionUtils
+ .determineActionBeanName(mapping);
+ if (wac.containsBean(beanName)) {
+ StrutsAction bean = (StrutsAction) wac.getBean(beanName, StrutsAction.class);
+ return new SciptedBeanActionAdapter(bean);
+ }
+ return super.processActionCreate(request, response, mapping);
+ }
+ }
+ }}}
+
+ This processor will look into spring context for a bean that implements StrutsAction and wich name is the action mapping path.
+
+ 1. Add classpath*:localContext.xml to your spring web application context. This file will not be required at runtime, so there is no impact on the production application.
+
+ 1. Put a localContext.xml file into your application server classpath. I myself created it in $TOMCAT/shared/classes.
+
+ 1. Add Groovy, asm and Spring-support jars in your web application libs
+
+ Your application is now ready for quick prototyping !
+
+ == Hot reload action's java code ==
+
+ Now, consider you have a FooAction mapped to "/foo.do" you want to edit quickly.
+
+ 1. Make your action implement StrutsAction. You only have to add "implements StrutsAction" as your action allready extends struts Action and defines the execute method.
+
+ 1. Edit your localContext.xml and add :
+
+ {{{
+ <alias name="groovyAction" alias="/foo"/>
+ <lang:groovy id="groovyAction"
+ script-source="file:D:/../src/java/.../FooAction.java"
+ refresh-check-delay="1">
+ </lang:groovy>
+ }}}
+
+ If you want to use dependency injection, simply add
+ {{{
+ <lang:property name="property" ref="bean"/>
+ }}}
+
+ 1. Start the app, go to your web page.
+
+ 1. Change the code and simply hit refresh to see effects. No recompile, repackage, redeploy required !
+