Not only  request.getParameter(String name) has problem but
request.getLocale() has problem too. So I decide to modify some methods in
BlockCallHttpServletRequest. My logic is as follows:

For parameters:
 First ask the request in the current call frame. If a parameter is not
found in the current request,  ask the request in the previous call frame.

For locale:
 Directly ask the request in previous call frame and eventually the request
in the first call frame, which is not an instance of
BlockCallHttpServletRequest,   answer the question.

With such logic, a parameter in current request can override the previous
one for the time in current call frame. Once leaving current call frame, the
overriding effect disappear.

I test it in my application. It works for me now. But do not know such logic
applies to others' use cases.

Rice

On 4/3/07, Alexander Klimetschek <[EMAIL PROTECTED]>
wrote:

Rice Yeh schrieb:
> Thank you for your solution. But I still feel weird for a brand new
request
> being created for a called block (servlet), at least for a super block
> (servlet). Having a look at the source code, each new brand request and
> response are supposed to be stored in its call frame (actually, this
> feature
> is not implemented yet, but api for retrieving these two objects are
> provided). If such design is intended, why not just treat request and
> response as part of servlet (block) context. And a way for passing a
> request's attributes or parameters must be provided. My real opinion is
> that
> request should be pass through all servlets invoked, instead of creating
a
> new one.

You are right, as far Cocoon's internal blocks with Sitemap servlets are
involved. In that case one can optimize the calls and provide the original
context (request, sitemap parameters etc.) to the callee. The only problem
you have is how to handle the different parameter levels you have: you
might
want to have global but sometimes only local parameters, eg. when setting
some value in a called block, you don't want it to override a parameter
with
the same name in the calling block.

The advantage of the servlet protocol internally is that you can mount any
servlet as a block, not only cocoon's sitemap servlet. We for example have
mounted the Solr servlets (for indexing and searching with lucene) as
normal
blocks. This is a nice feature that allows you to manage your complex web
application solely with Cocoon and Spring.

Alex

--
Alexander Klimetschek
http://www.mindquarry.com


Reply via email to