Hi,

On Sun, Oct 21, 2012 at 10:57 AM, Gonzalo Aguilar Delgado <
gagui...@aguilardelgado.com> wrote:

> Hello Ernesto,
>
> I sometimes get confused myself. ;-) I think that I don't understand
> well this piece of code:
>
>         @Override
>         public final void onRequest()
>         {
>                 WebApplication app =
> (WebApplication)getComponent().getApplication();
>                 AjaxRequestTarget target =
> app.newAjaxRequestTarget(getComponent().getPage());
>
>                 RequestCycle requestCycle = RequestCycle.get();
>                 requestCycle.scheduleRequestHandlerAfterCurrent(target);
>
>                 respond(target);
>         }
>
>

AJAX requests are handled int two steps (please Martin and/or other core
developers correct me if I'm saying something wrong;-). First is is
executed ListenerInterfaceRequestHandler (which delegates
on IBehaviorListener#onRequest). So, there you a new request handler is
scheduled after current, so once wicket finishes processing current request
handler it will start processing the new scheduled request handler (that
will produce the AJAX output). This technique is used in many places on the
framework, Eg. DownloadLink#click()

public void onClick()
{
final File file = getModelObject();
if (file == null)
{
throw new IllegalStateException(getClass().getName() +
" failed to retrieve a File object from model");
}

String fileName = fileNameModel != null ? fileNameModel.getObject() : null;
if (Strings.isEmpty(fileName))
{
fileName = file.getName();
}

fileName = UrlEncoder.QUERY_INSTANCE.encode(fileName,
getRequest().getCharset());

IResourceStream resourceStream = new FileResourceStream(
new org.apache.wicket.util.file.File(file));
getRequestCycle().scheduleRequestHandlerAfterCurrent(
new ResourceStreamRequestHandler(resourceStream)
{
@Override
public void respond(IRequestCycle requestCycle)
{
super.respond(requestCycle);

if (deleteAfter)
{
Files.remove(file);
}
}
}.setFileName(fileName)
.setContentDisposition(ContentDisposition.ATTACHMENT)
.setCacheDuration(cacheDuration));
}



> Because the AjaxRequestTarget is really a handler like
> TextRequestHandler but I don't know the
> call machanism.
>

Look at the code RequestCycle#processRequestAndDetach.... and the calls it
makes.

>
> What does the requestCycle.scheduleRequestHandlerAfterCurrent(target);
> here and when used
> with a TextRequestHandler. What's the difference?
>

There is no difference, you tell wicket that after current handler it
should "discard" the results and execute next handler. In your case instead
of returning an AJAX response return some text (JSON) response.


> Is there any way where this mechanism is explained?
>
>
I don't know if Martin or other core developers explain this somewhere?


> Thank you a lot!
>
>
You are welcome:-)

-- 
Regards - Ernesto Reinaldo Barreiro
Antilia Soft
http://antiliasoft.com

Reply via email to