The "Front Controller" is not really a controller.  It is a child's tool for
people who are challenged by OOP and need tool help.

On 6/21/06, Craig McClanahan <[EMAIL PROTECTED]> wrote:

Comments interspersed.

On 6/21/06, Don Brown <[EMAIL PROTECTED]> wrote:
>
> Craig, thanks for your honesty and candor.  I know this is a delicate
> topic, and I appreciate you approaching the topic openly.


LIkewise ... I may have sounded a bit grumpy in my response, but I don't
ascribe any malicious intent to your proposal.

A couple of clarifications:
>
>   1. I'm not proposing Shale _ever_ depend on Action 2, only that they
> should work well together.  In fact, I mean to start including Shale in
> Action 2's web examples.


In principle, that should work already for some things like
ViewController,
(but, if I read the current navigation handler right, you're not
delegating
so the "dialog" facility of Shale will not operate correctly at the
moment).  Proof is in the pudding of course, by actually writing such a
sample app.

  2. In a "pure JSF" environment, don't you think there is value in
> using an Action 2 controller to handle things like JSON/XML remote
> services?  I'm finding more and more my Struts Actions return JSON
> rather than HTML.  This is how I see us working together even if you
> don't use Action 2's JSF support.


Two separate thoughts on this:

* Technically, having an Action2 type handler for these things is
certainly
  feasible, but not required.  Shale Remoting does the same sorts of
things
  for resource access, and supports dynamically mapping dynamic requests
  to an arbitrary method on a managed bean (i.e. it gets instantiated on
demand
  and dependency injected), using standard JSF facilities, already.  And
it
  takes zero configuration if you like the default mapping algorithm.
(Adding
  xwork interceptor chains around the call to the dynamic handler methods
will
  be an easy add-on to this, for those who like that approach to providing
  services to the handler.)

* Philosophically, a framework built around JSF should encourage the
developer
  to use facilities that are already there, so he or she will not need to
learn
  new concepts.  That's why Shale does things like using method
  binding expressions to configure actions in the dialog subsystem ...
binding
  an asynchronous callback is done exactly the same as binding a submit
  button to an action method (execute() in action framework terminology).
  Nothing new to learn.  Leverages the managed beans facility exactly the
  same way.  Easily usable by a JSF component itself that wants to
encapsulate
  AJAX behavior or by client side JavaScript provided by the application.

  3. Overlap areas like navigation, validation, messages, etc., are only
> waiting on attention to be resolved.  When using the Action 2
> navigation, it is my intention that the default configuration removes
> overlap as much as possible.  You'd use Action 2 navigation rather than
> the NavigationHandler.  Validations could be defined in the page or
> could automatically be created from existing Action 2 validations (XML
> or annotations), similarly to how Seam creates validations from
> annotations.  Messages integration is easily resolved by creating a
> backing bean that provides messages using Action 2 apis.  I fully
> believe it is possible to merge Action 2 and JSF into a web application
> in a seamless manner.


There is a lot of space for implementing common frameworks we can share
for
doing things like validation -- for example, at JavaOne we talked a bit
about a "Commons Validator 2.0" that could derive validation rules from
annotations.  But, at the end of the day, you still need different
mechanisms to embed the particular annotations into the UI toolkit you're
using (the UI tags in SAF, or the component tags in JSF).

For navigation, "you'd use Action 2 navigation rather than navigation
handler" means that you're giving up on the tools around for JSF
navigation,
and forcing a beginner that is reading a JSF book to ignore that chapter
and
learn something different.  We'll want to look at how the existing SAF2
navigation handler can delegate for scenarios where the developer wants to
use JSF navigation for some namespaces.

It's definitely possible to merge Action 2 and JSF in an application --
you've already done that.  That's a tremendous benefit for the migration
use
cases, or those that just want to sprinkle some components without
migrating.  For a new application, though, I don't care for the result,
because it adds complexity (over pure JSF based solutions), and requires
deveopers to deal with additional concepts and configuration files,
without
enough  corresonding benefits to make it worth it (IMHO, of course).

I guess what I'm saying is you could view this "overlap" in a negative
> or positive light.  I think the Struts project should put forth a
> "preferred" approach, used in our quickstarts and tutorials.  However,
> that doesn't mean that we should force developers into our way of
> thinking.  Having options isn't necessarily bad.
>
> At this point, I really don't see a valid either/or framework approach
> debate:
>
>   - If your application needs to be built by tool-dependent programmers,
> pure JSF is definitely the way to go.
>
>   - If you prefer the pure JSF approach for other reasons, use a pure
> JSF framework, but perhaps use Action 2 to organize and deliver JSON/XML
> services.
>
>   - If your application has a lot of Struts developers or stateless
> pages that need pure speed, but in sections you want to use fancy JSF
> components, use Action 2 as the controller and sprinkle in JSF where
> needed.
>
>   - If you like Action-based approaches and don't need/like JSF
> components, just use Action 2.
>
> I hope we can agree that each of the above situations and solutions is
> valid, and make that our common ground.  You may prefer the first
> couple, others the latter two.  As a Struts project, we need to be of
> one mind in at least some things, and it is my hope Action 2's recent
> JSF integration attempts can help get us there.  I put this proposal out
> to help bring us together, not precipitate a "divorce" :)


Doesn't it really come down to which front controller you choose as the
primary foundation of your architecture?

Nearly every existing framework that has added JSF integration has kept
their original basic architecture, and thought of JSF primarily as a
library
of UI widgets.  Shale (and Seam) take a different viewpoint -- utilize the
front controller built in to JSF instead, and decorate around the edges to
add features and ease of use.  If you take that approach, you discover a
very capable framework, usable for server generated markup or AJAX
callbacks
or any other sort of HTTP request, with basic IoC-ish bean instantiation
and
dependency injection built in, along with an expression language that can
be
used to bind components to model data, but can also be used
programmatically
by an application framework itself.

Personally, I want to get out of the front controller business :-), and
leave that problem to the MyFaces and RI teams to compete on quality and
features.  I'd rather add value by leveraging concepts that a JSF-oriented
developer already has to know about, rather than adding abstraction layers
so I can be agnostic about the front controller that is under the covers.

Don


Craig




--
"You can lead a horse to water but you cannot make it float on its back."
~Dakota Jack~

Reply via email to