You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by Ted Husted <hu...@apache.org> on 2002/11/23 22:26:49 UTC

Re: RE: servletMapping field in ActionServlet (1.0.2) (long)

IMHO, the best way to use XML is as a generator/decorator for 
objects. One decoration might be to pass a script to a Java class 
for processing, but framing conditions in a XML files seems to 
step over the line to me. 

Right now, a very good way to test preconditions is through a 
component like the Struts validator. It plugs into the ActionForm 
and confirms that whatever properties are needed are ready, 
willing and agle to go. 

In the normal course, an Action should not need to interact with 
the request or session at all. The ActionForm should encapsulate 
whatever input is needed. 

The routing instructions in Struts are the ActionForwards. The 
Actions can select a destiation using a logical name, and that 
name is mapped to a destination in the configuration. 

For the most part, I just validate the ActionForms, create a data 
transfer object, and pass it all up to the business tier for 
handling. The business object passes back a response that the 
Action analyzes. 

Where someone might be able to plug scripts into Struts would be 
as an alternative to writing Java code. A standard Action could 
evalulate the script and return a result, so the rest of the 
framework wouldn't know that the script exists.

You might embed the script in a XML file, the way the Struts 
validation embed a Javascript in its configuration. But might be 
better to go with a separate configuration file for something like 
that, so it could be used with or without Struts.

-Ted.


11/23/2002 12:19:54 PM, "Nelson, Laird" <La...@FMR.COM> 
wrote:

>> -----Original Message-----
>> From: Ted Husted [mailto:husted@apache.org]
>> What you might be driving at is the ability to pass some type 
of 
>> scripting statement to an Action, that it could then interpret 
at 
>> runtime. Another place to put something like this is the 
parameter 
>> property. 
>
>That's exactly what I'm driving at.  Maybe BSF/BeanShell is a 
good match
>here, as I think about it, as I'm not a huge fan of doing 
scripting with XML
>syntax.
>
>> I sometimes do things like have my Actions look at their 
>> ActionForwards to decide whether do some things (like look for 
a 
>> cancel request or a missing token).
>
>Ditto.
>
>The motivation behind this idea was my thinking along these 
lines:
>
>There's usually a pretty small set of "real" destinations in a 
webapp.  By
>"real", I mean a destination that either brings the user to a 
page that's
>interesting to him, or that completes a process.  Most of the 
destinations
>within webapps that I've seen or had to design are state 
augmentors and
>traffic cops.
>
>Think of a hypothetical RegistrationAction.  It has a set of 
preconditions,
>let's say, for it to do its job.  In order for it to work and not 
to throw
>an error, it needs to find a username, password, first name, last 
name and
>zip code.  If it is ever invoked without any of these things it 
simply will
>not fire (i.e. will not contact the relevant business object in 
the model
>tier to store the registration information).
>
>OK; in this silly situation, right now, all Struts can say in its
>struts-config.xml out of the box is something like "when I get a 
request for
>/registration.do, route to the RegistrationAction" (let's leave 
aside custom
>ActionMapping implementations and the like for a moment):
>
>  <action path="/registration"
>          type="RegistrationAction/>
>
>This means that RegistrationAction can receive requests that may 
or may not
>have the additional state it needs in order to satisfy its 
preconditions.
>This also means that either (a) RegistrationAction or (b) some 
other Action
>that will eventually forward to it needs to check the
>request/session/servlet context to evaluate whether those bits of 
state--the
>username, password, etc.--are present, and consequently to 
evaluate whether
>the RegistrationAction can be safely invoked.  To me, this kind 
of thing is
>routing logic.  Since Struts already locates its routing logic in
>struts-config.xml (with <action-mappings>, <forwards>, <form-
beans> and the
>like), it would be really cool IMHO if there were a facility to 
locate
>*this* kind of routing logic in there as well:
>
>  <action path="/registration">
>    <routing-logic type="BSF:bsh"> <!-- thinking out loud here 
-->
>      final String userName = request.getParameter("userName");
>      // ...and so on...
>      if (userName != null) {
>        // type variable would be exposed by BSF
>        type = RegistrationAction.class;
>      } else {
>        type = SomeOtherAction.class;
>      }
>    </routing-logic>
>  </action>
>
>Voila.  Now this kind of routing logic doesn't have to live in 
any Action.
>
>(Your point is taken about the inability to use existing 
<logic:present>
>tags and the like here; you are exactly right in that what I'm 
driving at is
>to save a script that would be evaluated at runtime (possibly 
having been
>compiled first).  Squint your eyes and blur the silly syntax I 
invented
>above.  :-))
>
>I always find that a good {pulls number out of air} 40% or so of 
my Actions
>are devoted to really doing this kind of routing logic based on 
the
>presence/absence/pattern matching of various request/session 
attributes.
>Although there's of course nothing architecturally or technically 
wrong with
>this (it's controller logic happening in the controller layer--no 
MVC
>violations here), it would be neat to put it all in the same 
place, so that
>people just know that all the routing logic is in the struts-
config file,
>and not buried in the code somewhere.  Then you would also know 
that all
>remaining Actions would truly be business object invokers, and 
not part-time
>traffic cops.  :-)
>
>The drawback, of course, would be that the struts-config.xml 
would become
>more like a hairy piece of code than a configuration file.
>
>Anyhow, food for thought.
>
>Cheers,
>Laird
>
>




--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>