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 DonBrown:
http://wiki.apache.org/struts/RoughSpots

------------------------------------------------------------------------------
  I'm new around here, so be nice ;)  I probably have a lot less WW experience 
than most, so I apologize in advance if I'm flat out wrong about some of the 
things here.
  
    1. How does WW help the user with state management?  As far as I can tell, 
if I want to keep a 'user' object around I have to interact with the map 
returned by ActionContext.getSession().  Actions should in general have a 
type-safe and transparent way to do this, e.g. by subclassing ActionContext and 
providing getUser()/setUser() which store the user in session.  This allows for 
re-working of the storage strategy (e.g. write a cookie and lookup the user 
each time) without affecting actions.
- 
      * [crazybob] I prefer an injection-based approach. You can use the 
`ScopeInterceptor` to pull an object off the session and pass it to your 
action. Or you can use Spring to inject session-scoped objects into your action 
(though I would avoid Spring personally).
- 
      * [jcarreira] I can attest that the Spring scoped components work well 
with WebWork. It's what we use at work for maintaining session or request state.
  
    1. In tandem with the previous point, since Actions are already stateful, 
it'd be nice to have the ActionContext injected into the Action.  One benefit 
is when a newbie developer needs it, the linkage is obvious (they don't have to 
a priori know about the ActionContext, they're being handed in it on a 
platter). If the developer can subclass ActionContext, it would also encourage 
them to implement a base action which accepts the context inject and leveraging 
the fact that JDK 1.5 allows co-variant returns, also write a getContext() 
method that returns the down-casted type; they wouldn't have to do 
((MyActionContext) ActionContext.getContext()).getUser() for example, just 
getContext().getUser().
      * [frankz] This might well address the issue of !ActionContext being 
!ThreadLocal.  If it was injected, it wouldn't need to be !ThreadLocal to get 
the same basic effect, and maybe more importantly, it wouldn't automatically be 
available to helper classes as it is as a !ThreadLocal.  That would address my 
concern about "inappropriate" usage of !ActionContext.
      * [jcarreira] I think this is a bad idea, in general. Actions should 
specify the exact things they need and have them supplied, not just ask for the 
"world" (the ActionContext is the world the action lives in). 
+     * [mrdon] While I agree more specific is generally better, I like the 
idea of the user being able to subclass ActionContext for their particular 
application.  Tapestry has the Visit object (I think that's the name) I've 
always liked.
+ 
-   1. HTML analog tags should stick to HTML attributes. I dont' mean they 
shouldn't have more functionality, but the attributes should be identical where 
possible, and they shouldn't do things like render a label and an input.  
Keeping them more like regular HTML tags makes them easier to ramp up on, and 
more non-developer friendly
+   1. HTML analog tags should stick to HTML attributes. I don't mean they 
shouldn't have more functionality, but the attributes should be identical where 
possible, and they shouldn't do things like render a label and an input.  
Keeping them more like regular HTML tags makes them easier to ramp up on, and 
more non-developer friendly
      * [MJ] I see the following options when it comes to tags. (1) Use plain 
HTML + implicit scoped variables like "actionName", "actionAddress", etc. to 
create dynamic values; this looks pretty compact with JSP 2.0. (2) Use 1:1 
relation between WW tags and HTML tags. (3) Use 1:M relation between WW tags 
and HTML tags, like to create data entry form or a table. (4) Use 
non-HTML-looking tags + more abstract attributes + "media" attribute, thus 
creating something like JSF renderer for different media. Choosing between (1) 
and (2) I prefer the first one.
-     * I'd encourage people to give the ww: tags a spin... they're really much 
more powerful than the JSTL or previous struts tags and you don't need so many 
tags to do things. On being closer to HTML attributes, do you have some 
examples?
+     * [jcarreira] I'd encourage people to give the ww: tags a spin... they're 
really much more powerful than the JSTL or previous struts tags and you don't 
need so many tags to do things. On being closer to HTML attributes, do you have 
some examples?
+     * [mrdon] +1 for aligning attributes with HTML attributes
  
    1. Actions should return concrete objects, not symbolic results.  Symbolic 
results might have been optimal when you had one event/method per action and 
the outcomes were always whole-page views, but they get in the way now.  When 
you want to return anything that requires more than the symbol, you have to do 
some less than intuitive things to make the Action and the Result cooperate.  
I'd prefer to see a concrete Result get returned from Action methods, which 
would allows developers to do more powerful things more easily.  There are a 
bunch of ways to make it backward compatible too.  You could return 'new 
SymbolicResult("success")' and have the SymbolicResult do the lookup stuff (You 
could even redefine the String constants to be SymbolicResults).  You could 
alternatively use a static class to do Results.find(SUCCESS).  Or you could 
even allow method to continue to return String or Result, and if String wrap it 
in a SymbolicResult.
      * [frankz] +1.  This is one area where I personally think Struts had it 
right and we've seen frameworks getting it "wrong" subsequently.  
!ActionForward I believe is the right concept, even if the realization might 
not be optimal.  I think the difference between return "ok"; and return new 
ActionResult("ok"); is pretty minimal, but the later opens up a lot of 
possibilities being a true object that can have behaviors and properties and 
such.
@@ -308, +309 @@

    <result name="..." type="redirect">${url}</result>
  }}} 3) Enabling users to return either a real object or a string is going to 
impact the interceptor API, too. :( 4) Wait a second... you can do what you 
want right now! Create a new result type which looks up a `Result` object on 
the value stack and delegates to it. Then map a global result to the new type. 
For example, you could return `CUSTOM`, and the the result type would execute 
the `Result` returned from `getCustomResult()` on your action. ;) 
      * [jcarreira] -1 I've never, ever seen anything that needed this, and it 
makes the API requirements on the action classes more tightly coupled. Result 
configurations and Result instances can pull values from the value stack 
(including but not limited to action properties) so you can easily set up any 
of the values you want to give the result as properties of your action and have 
them pulled. 
+     * [mrdon] I'm still in favor of this idea, because it allows a more 
code-centric style of programming, without giving up any backwards 
compatibility.  For example, consider an app that uses wildcards in its 
xwork.xml to define common patterns, however each submit action is going to be 
redirecting to somewhere else.  Without adding a new action in the config, you 
want to just return a redirect result.  Yes, you can do that now by putting 
values into the stack then pulling them out in the definition, but I think it 
is cleaner to be more explicit: {{{
+  Result result = ActionRedirectResult("bar", "foo");
+  return result;
+ }}} rather than {{{
+  ActionContext.push("actionName", "foo");
+  ActionContext.push("actionNamespace", "bar");
+  return "redirect";
+  ...
+  <result type="redirect-action">
+    <param name="actionName">${actionName}</param>
+    <param name="namespace">/${actionNamespace}</param>
+  </result>
+ }}}  My point is this feature enables a new style of development, one closer 
to RoR and, IMO, easier for the newbie, without affecting anyone else.
+ 
  
  == Nice to haves ==
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to