On Tue, 2 Apr 2002 [EMAIL PROTECTED] wrote:
> Date: Tue, 2 Apr 2002 14:33:14 -0600
> From: [EMAIL PROTECTED]
> Reply-To: Struts Developers List <[EMAIL PROTECTED]>
> To: [EMAIL PROTECTED]
> Subject: RE: Servlet 2.3 filter
>
> Please forgive my ignorance if this is a well-known thing. I went to
> the Struts BOF and I went to the "Filters can replace Servlets in MVC"
> BOF. I see the concept, but I just don't see how filters are "better"
> than servlets for MVC. Is there documentation or discussion about this
> idea somewhere? I first heard of it at JavaOne. Is it "pre-supposed"
> that Struts will someday become filter-based or did I misunderstand
> that? I see how filters are a good frontend to MVC to make sure
> requests don't circumvent your controller, but it doesn't make sense to
> me that a filter would "be" the controller. What are the community's
> thoughts on that?
This is a really interesting question.
I finally had a chance to review the slides from Kevin Jones's session on
Filters (slides for all the sessions are now available in PDF from
http://java.sun.com/javaone -- this was session 1208).
I won't claim that I agree with everything Kevin proposes about using
Filters as a controller in an MVC environment. In particular, I would not
consider the "hard to track which servlet is associated with which JSP
page(s)" issue to be a problem in MVC. Rather, I consider that
separation to be (one of) the whole points of MVC -- making the business
logic and presentation logic as independent of each other as possible.
That being said, I can see the following general advantages for using a
Filter as the controller component of Struts:
* UNIVERSALITY - You can actually guarantee that *all* requests really
flow through the controller. Consider the following scenarios in
Struts 1.0 and 1.1:
- In the Struts example app, we want to ensure that the user is always
logged on, and redirect to the login page if not (a very common
requirement in apps that manage their own security). But, in order
to accomplish this guarantee, we've got ugly <app:checkLogon> tags
on all of the pages, because we can't guarantee that the user will
not link directly to a page.
- In the multiple application support of Struts 1.1, there is a current
restriction that all links *must* flow through the controller in order
for the sub-application selection logic to work correctly. We could
get around this by requiring a custom tag on every page again, but
that is clearly not optimal.
Both of these situations can be elegantly handled by mapping a
controller Filter to the "/*" URL pattern, so that it watches every
single request.
* COMPOSABILITY - The current Struts controller logic is very monolithic,
and it is hard to customize exactly what the controller does for you.
If, instead, we viewed the controller as a series of services that can
be included or not (based on application requirements), the application
architect has the option to pay for only the services they need.
Examples of current Struts services that might well be decomposed:
multipart request handling, path->Action mapping, locale selection,
role permissions checking, form population and validation, ... plus
the fact that it would be easy to add other (perhaps application
specific) services that integrate nicely with those provided by Struts.
* FLEXIBILITY - Another aspect of the monolithic nature of the current
controller is that all of it's processing is applied to every request.
While that is sort of the idea of MVC :-), there are many cases where
you might want different sets of services invoked in different parts of
the same app (or in different sub-applications). We went part-way in
this direction in 1.1, by letting you customize the RequestProcessor
instance used for each sub-app. It's much more powerful to allow the
application architect to compose the set of services to be applied
in a declarative fashion, in web.xml, without having to write any code
to manage the overall orchestration.
* INTEGRATION - Sometimes you want to be able to integrate existing web
application functionality, already provided by servlets and/or JSP
pages, into a Struts based web app. Today, you have to write "glue"
actions that do forwards to such resources -- with a Filter based
controller that front ends things, you can do this more elegantly
(even if you can't modify the apps being integrated).
* WRAPPING - A completely different sort of advantage in using a Filter
is the ability (using the Filter APIs) to wrap the request and/or
response before handing it on to the next filter (or the servlet that
ultimately gets invoked). This capability lets you do all sorts of
interesting things -- just a couple of ideas to whet your appetite:
- If you want to do application managed security, but like the idea
of role checking and user identification that Struts can use in its
decision making process, you could write a request wrapper that fakes
the values returned by getRemoteUser(), getUserPrincipal(), and
isUserInRole(). NOTE - whatever you do here won't affect security
decisions that the container itself makes (such as EJB access
permissions), so it's not a panacea.
- It's commonly necessary to generate slightly different HTML for
different user agents, to deal with the inevitable differences.
One approach is to build the knowledge of these differences into
every tag that renders HTML. A different approach would be to
generate some agent-neutral rendering of the output in XML, and then
apply an agent-specific transformation in a response wrapper.
Some of this can be done with a monolithic controller model, but it
tends to be easier if the controller is composed of separate filters
that you can order as needed.
The bottom line is that, while there has been no formal decision that a
future version of Struts would migrate to a Filter based controller, the
arguments I've listed above seem like fairly compelling advantages. As
always, we would strive to minimize any impacts on applications that just
*use* Struts (i.e. you've just implemented actions and form beans) -- but
the additional power that could be made available to developers is quite
impressive. What do you think?
> Greg
>
Craig
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>