On Thu, 23 Dec 2004 18:04:18 -0800, Don Brown <[EMAIL PROTECTED]> wrote: > Craig McClanahan wrote: > > On Thu, 23 Dec 2004 12:31:19 -0800, Don Brown <[EMAIL PROTECTED]> wrote: > <snip /> > >>If that is correct, would it be possible to implement JSF within Struts > >>chain? Could a JSF implementation be decomposed into chain commands, > >>and therefore allow the user to mix and match? > > > > > > You'd have to replace the standard implementation of JSF's Lifecycle > > API while still ensuring that the JSF based functioning happens in the > > correct order. To my mind, it's easier to decompose what Struts does > > and bolt it onto JSF (basically the direction Shale is taking) versus > > the other way. > > I guess what I have in mind is the JSF integration approach Cocoon > takes. Every request enters Cocoon, then certain pipelines can choose > to hand the request off to JSF. Conceptually, I think it is a better > fit with the advantages of the respective frameworks. Cocoon and Struts > excel at a request-based approach, so it is a natural fit for them to be > the controller for all requests, JSF or not. JSF, as an event-based > framework, is a fine solution for components or complex, event-based > pages.
I guess I'm not seeing the advantage of having a controller (in the sense that we've traditionally used talking about Struts or Cocoon) in *front* of JSF's controller. In a very simplistic sense, there are three kinds of requests in the world: * UI State Change (example: tree control node open/close, where the component's state is managed server side). Should be handled by the view tier technology (JSF in this scenario, which Shale puts in front). * Form Submit to be validated (example: typical of what Struts form processing ins about). Should be handled by the application tier that enforces such things (in Shale, this is done by a combination of the JSF validators and an upcoming integration of Commons Validator, all managed transparently by the JSF lifecycle, including redisplay of the input page if validation fails. * Validated form submit to be processed by business logic (example: what we use actions for in Struts; in JSF/Shale this is the invocation of the action method bound to your submit button). There's still room for some overall per-request processing for things like enforcing authentication, performance logging, etc. That can all be handled with a Filter (Shale's filter predefines "before" and "after" chains that you can use to decorate the basic functionality. I guess I don't see why I need anything else as a controller -- with the possible exception of managing dialogs that are "longer than a request and shorter than a session". What I've got so far is conceptually pretty similar to what you can do today by sharing a single form bean across multiple pages; the reason it's not posted yet is I haven't made the "remove the session object when you leave the dialog" part quite elegant enough yet. > > The end game here would be to make Struts a universal controller > implementation that could front-end JSF, Cocoon (as it can do now with > the Struts Cocoon plugin), continuations-based frameworks, or any other > more specialized controller implementation. IMO, chain is great for a > universal controller backbone, but poor/too-generic for an > application-level controller framework. Not every request/workflow > might be appropriate for JSF, but by putting it behind Struts, the > developer has the option how best to handle it. > > > > > > >>I guess where I'm going with this is one of the huge advantages of an > >>event-based view framework like JSF is the ability to have > >>self-contained, complex components. On the other hand, I think > >>event-based approaches are poor at handling complex workflows as code > >>has to be split up into different event methods. It seems like a > >>perfect marriage would be event-based framework for the components, but > >>continuations-based framework for application events and actions. > > > > > > Stay tuned next week for a Shale checkin that addresses the complexity > > of managing dialogs -- I've made some good progress fleshing that out. > > Continuations are definitely a good way to deal with serial workflows > > like a wizard dialog, and I'd like to see us continue to explore that > > avenue -- it's just not (yet?) obvious to me that they are optimal for > > workflows with lots of branches in them. > > > > Consider, for example, a "dialog" for handling authentication at a > > portal that also allows self-registration and "remember me" cookies. > > The various paths through this logic are essentially the same as the > > front parts of MailReader (up to where you get to the main menu), plus > > a bypass branch if the user's cookie is still there. For extra fun, > > assume that the process of collecting user profile info takes multiple > > screens, and that the user might at any point cancel the whole thing > > (meaning no updates should show up in any database). > > Actually, I think continuations really excel at workflows that involve > branches, because the power of a full scripting language is more capable > of handling such complex logic, as opposed to say a workflow system > based on XML. > > All continuations really do is help you script the sequence of pages and > connect them into a logical process. In your example, the logic for > pulling authentication information out of cookies or a form POST would > be extracted to a Java class or helper Javascript method for simpler > apps. Continuations would help with the multistep process of collecting > information. Probably, it would go something like this: > > if (!loginThroughCookies()) { > while (true) { > showPageAndWait("login"); > if (context.requestParams["register"] != null) { > showPageAndWait("login1"); > if (context.requestParams["cancel"] != null) { > continue; > } > showPageAndWait("login2"); > if (context.requestParams["cancel"] != null) { > continue; > } else { > registerUser(); > } > } else if (loginThroughForm()) { > break; > } > } > } > > // This step could also call the mainMenu function to start that > // workflow > showPageAndWait("mainMenu"); > Hmm ... I'm not sure cascading if's are all that much easier to understand and maintain than the corresponding configuration of this with JSF navigation rules :-). > Keep in mind, I'm very new at continuations, so I'm sure someone more > knowledgable could make something simplier. One improvement is if you > use the Wizard framework I created for struts-flow, it would be even > simpler because the wizard framework would automatically handle HTML > form button clicks that went to the previous step. That would definitely be a value add. We need to experiment to see how much value. > > Don > Craig --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]