You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Igor Vaynberg <ig...@gmail.com> on 2010/02/08 05:18:45 UTC

Re: AjaxRequestTarget#respondComponent(Response, String, Component) calls Component#setOutputMarkupId(boolean)

Why remove it?

-Igor


On Sunday, February 7, 2010, Joachim F. Kainz <jf...@jolira.com> wrote:
> Dear Developers,
>
> I am working for a very, very, very large global retailer and we are
> about to roll out a very high-volume mobile application using Wicket.
>
> In order to support some of the requirements we have I have been working
> on adding a few more stateless components to Wicket. As one example, I
> added a StatelessAjaxFailbankLink. I also added a StatelessLink that
> works better for our app. The code is APL2 licensed and available at
> http://jolira-tools.googlecode.com/svn/wicket-stateless/trunk/  together
> with  demo application.
>
> The demo works perfectly, when clicking on the link the first time. The
> second time it does not. The reason for this problem is that
> AjaxRequestTarget#respondComponent(Response, String, Component) method
> calls Component#setOutputMarkupId(boolean) with a value of true.
>
> I looked for quite a while but I have not found a way to override this
> behavior anywhere. I would greatly appreciate it, if somebody could
> suggest an approach or if somebody could suggest how to remove this line
> from the AjaxRequestTarget in a future version of the wicket code.
> Removing the line should be side-effect free as, in cases this line is
> actually used, this setting is verified earlier in the code.
>
> Best regards,
>
> Joachim
>
>

Re: AjaxRequestTarget#respondComponent(Response, String, Component) calls Component#setOutputMarkupId(boolean)

Posted by "Joachim F. Kainz" <jf...@jolira.com>.
Martjin Dashort pointed out component.setmarkupid() to me yesterday. It
works perfectly for my purposes. Thank you!

Here is my little Stateless demo app.

    public HomePage(final PageParameters parameters) {
        final String _counter = getParameter(parameters, COUNTER_PARAM);
        final int counter = _counter != null ?
Integer.parseInt(_counter) : 0;
        final Label c2 = new Label("c2", Integer.toString(counter));
        final PageParameters updated = updateParams(counter);
        final Link<?> c2Link = new
StatelessAjaxFallbackLink<Void>("c2-link",
                null, updated) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(final AjaxRequestTarget target) {
                if (target != null) {
                    target.addComponent(c2);
                }
            }
        };

        c2.setMarkupId(c2.getId()); // Required to make stateless Ajax
work
        c2.setOutputMarkupId(true);
        add(c2Link);
        add(c2);
    }

The StatelessAjaxFallbackLink code is all yours, if you want it.

On Mon, 2010-02-08 at 09:38 -0800, Igor Vaynberg wrote:

> ajaxrequesttarget will now also call component.setmarkupid() for you...
> 
> -igor
> 
> On Sun, Feb 7, 2010 at 11:34 PM, Joachim Kainz <jf...@jolira.com> wrote:
> > Wicket managing the id is not an option, as the generated id is tied
> > to the session (and therefore not stateless).
> >
> > SetMarkupId on the other hand works great. Thank you! :)
> >
> > Sent from my iPhone
> >
> > On Feb 7, 2010, at 11:29 PM, Martijn Dashorst <martijn.dashorst@gmail.com
> >  > wrote:
> >
> >> just call setMarkupId("c2") or let wicket manage the ID.
> >>
> >> Martijn
> >>
> >> On Mon, Feb 8, 2010 at 6:51 AM, Joachim F. Kainz <jf...@jolira.com>
> >> wrote:
> >>> Igor,
> >>>
> >>> Thank you for responding back.
> >>>
> >>> Here is the code that I am using:
> >>>
> >>>        final Label c2 = new Label("c2", Integer.toString(counter));
> >>>        final Link<?> c2Link = new
> >>> StatelessAjaxFallbackLink<Void>("c2-link",
> >>>                null, updatedParameters) {
> >>>            private static final long serialVersionUID = 1L;
> >>>
> >>>            @Override
> >>>            public void onClick(final AjaxRequestTarget target) {
> >>>                if (target != null) {
> >>>                    target.addComponent(c2, "c2");
> >>>                }
> >>>            }
> >>>        };
> >>>
> >>> Here is my HTML:
> >>>
> >>> <span wicket:id="c2" id="c2"></span>
> >>> <a href="#" wicket:id="c2-link">increment</a>
> >>>
> >>> Instead of calling c2.setOutputMarkupId(true), I am passing the ID
> >>> ("c2") to the component, which means that my
> >>> StatelessAjaxFallbackLink
> >>> works perfectly the first time around. The HTML that is generated for
> >>> the C2 span unfortunately contains the wrong ID the second time
> >>> around,
> >>> because the Component#setOutputMarkupId(true) executed as part of
> >>> AjaxRequestTarget#respondComponent(Response, String, Component)
> >>> generates the wrong id.
> >>>
> >>> Without the call to Component#setOutputMarkupId(true) the id would
> >>> just
> >>> remain "c2" and my StatelessAjaxFallbackLink would work perfectly.
> >>>
> >>> BTW: The call to Component#setOutputMarkupId(true) is redundant
> >>> anyway
> >>> as AjaxRequestTarget#addComponent(Component) already enforces that
> >>> the
> >>> value must be true...
> >>>
> >>> Best regards,
> >>>
> >>> Joachim
> >>>
> >>> On Sun, 2010-02-07 at 20:18 -0800, Igor Vaynberg wrote:
> >>>
> >>>> Why remove it?
> >>>>
> >>>> -Igor
> >>>>
> >>>>
> >>>> On Sunday, February 7, 2010, Joachim F. Kainz <jf...@jolira.com>
> >>>> wrote:
> >>>>> Dear Developers,
> >>>>>
> >>>>> I am working for a very, very, very large global retailer and we
> >>>>> are
> >>>>> about to roll out a very high-volume mobile application using
> >>>>> Wicket.
> >>>>>
> >>>>> In order to support some of the requirements we have I have been
> >>>>> working
> >>>>> on adding a few more stateless components to Wicket. As one
> >>>>> example, I
> >>>>> added a StatelessAjaxFailbankLink. I also added a StatelessLink
> >>>>> that
> >>>>> works better for our app. The code is APL2 licensed and available
> >>>>> at
> >>>>> http://jolira-tools.googlecode.com/svn/wicket-stateless/trunk/
> >>>>> together
> >>>>> with  demo application.
> >>>>>
> >>>>> The demo works perfectly, when clicking on the link the first
> >>>>> time. The
> >>>>> second time it does not. The reason for this problem is that
> >>>>> AjaxRequestTarget#respondComponent(Response, String, Component)
> >>>>> method
> >>>>> calls Component#setOutputMarkupId(boolean) with a value of true.
> >>>>>
> >>>>> I looked for quite a while but I have not found a way to override
> >>>>> this
> >>>>> behavior anywhere. I would greatly appreciate it, if somebody could
> >>>>> suggest an approach or if somebody could suggest how to remove
> >>>>> this line
> >>>>> from the AjaxRequestTarget in a future version of the wicket code.
> >>>>> Removing the line should be side-effect free as, in cases this
> >>>>> line is
> >>>>> actually used, this setting is verified earlier in the code.
> >>>>>
> >>>>> Best regards,
> >>>>>
> >>>>> Joachim
> >>>>>
> >>>>>
> >>>
> >>
> >>
> >>
> >> --
> >> Become a Wicket expert, learn from the best: http://wicketinaction.com
> >> Apache Wicket 1.4 increases type safety for web applications
> >> Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.4
> >

Re: AjaxRequestTarget#respondComponent(Response, String, Component) calls Component#setOutputMarkupId(boolean)

Posted by Igor Vaynberg <ig...@gmail.com>.
ajaxrequesttarget will now also call component.setmarkupid() for you...

-igor

On Sun, Feb 7, 2010 at 11:34 PM, Joachim Kainz <jf...@jolira.com> wrote:
> Wicket managing the id is not an option, as the generated id is tied
> to the session (and therefore not stateless).
>
> SetMarkupId on the other hand works great. Thank you! :)
>
> Sent from my iPhone
>
> On Feb 7, 2010, at 11:29 PM, Martijn Dashorst <martijn.dashorst@gmail.com
>  > wrote:
>
>> just call setMarkupId("c2") or let wicket manage the ID.
>>
>> Martijn
>>
>> On Mon, Feb 8, 2010 at 6:51 AM, Joachim F. Kainz <jf...@jolira.com>
>> wrote:
>>> Igor,
>>>
>>> Thank you for responding back.
>>>
>>> Here is the code that I am using:
>>>
>>>        final Label c2 = new Label("c2", Integer.toString(counter));
>>>        final Link<?> c2Link = new
>>> StatelessAjaxFallbackLink<Void>("c2-link",
>>>                null, updatedParameters) {
>>>            private static final long serialVersionUID = 1L;
>>>
>>>            @Override
>>>            public void onClick(final AjaxRequestTarget target) {
>>>                if (target != null) {
>>>                    target.addComponent(c2, "c2");
>>>                }
>>>            }
>>>        };
>>>
>>> Here is my HTML:
>>>
>>> <span wicket:id="c2" id="c2"></span>
>>> <a href="#" wicket:id="c2-link">increment</a>
>>>
>>> Instead of calling c2.setOutputMarkupId(true), I am passing the ID
>>> ("c2") to the component, which means that my
>>> StatelessAjaxFallbackLink
>>> works perfectly the first time around. The HTML that is generated for
>>> the C2 span unfortunately contains the wrong ID the second time
>>> around,
>>> because the Component#setOutputMarkupId(true) executed as part of
>>> AjaxRequestTarget#respondComponent(Response, String, Component)
>>> generates the wrong id.
>>>
>>> Without the call to Component#setOutputMarkupId(true) the id would
>>> just
>>> remain "c2" and my StatelessAjaxFallbackLink would work perfectly.
>>>
>>> BTW: The call to Component#setOutputMarkupId(true) is redundant
>>> anyway
>>> as AjaxRequestTarget#addComponent(Component) already enforces that
>>> the
>>> value must be true...
>>>
>>> Best regards,
>>>
>>> Joachim
>>>
>>> On Sun, 2010-02-07 at 20:18 -0800, Igor Vaynberg wrote:
>>>
>>>> Why remove it?
>>>>
>>>> -Igor
>>>>
>>>>
>>>> On Sunday, February 7, 2010, Joachim F. Kainz <jf...@jolira.com>
>>>> wrote:
>>>>> Dear Developers,
>>>>>
>>>>> I am working for a very, very, very large global retailer and we
>>>>> are
>>>>> about to roll out a very high-volume mobile application using
>>>>> Wicket.
>>>>>
>>>>> In order to support some of the requirements we have I have been
>>>>> working
>>>>> on adding a few more stateless components to Wicket. As one
>>>>> example, I
>>>>> added a StatelessAjaxFailbankLink. I also added a StatelessLink
>>>>> that
>>>>> works better for our app. The code is APL2 licensed and available
>>>>> at
>>>>> http://jolira-tools.googlecode.com/svn/wicket-stateless/trunk/
>>>>> together
>>>>> with  demo application.
>>>>>
>>>>> The demo works perfectly, when clicking on the link the first
>>>>> time. The
>>>>> second time it does not. The reason for this problem is that
>>>>> AjaxRequestTarget#respondComponent(Response, String, Component)
>>>>> method
>>>>> calls Component#setOutputMarkupId(boolean) with a value of true.
>>>>>
>>>>> I looked for quite a while but I have not found a way to override
>>>>> this
>>>>> behavior anywhere. I would greatly appreciate it, if somebody could
>>>>> suggest an approach or if somebody could suggest how to remove
>>>>> this line
>>>>> from the AjaxRequestTarget in a future version of the wicket code.
>>>>> Removing the line should be side-effect free as, in cases this
>>>>> line is
>>>>> actually used, this setting is verified earlier in the code.
>>>>>
>>>>> Best regards,
>>>>>
>>>>> Joachim
>>>>>
>>>>>
>>>
>>
>>
>>
>> --
>> Become a Wicket expert, learn from the best: http://wicketinaction.com
>> Apache Wicket 1.4 increases type safety for web applications
>> Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.4
>

Re: AjaxRequestTarget#respondComponent(Response, String, Component) calls Component#setOutputMarkupId(boolean)

Posted by Joachim Kainz <jf...@jolira.com>.
Wicket managing the id is not an option, as the generated id is tied
to the session (and therefore not stateless).

SetMarkupId on the other hand works great. Thank you! :)

Sent from my iPhone

On Feb 7, 2010, at 11:29 PM, Martijn Dashorst <martijn.dashorst@gmail.com
 > wrote:

> just call setMarkupId("c2") or let wicket manage the ID.
>
> Martijn
>
> On Mon, Feb 8, 2010 at 6:51 AM, Joachim F. Kainz <jf...@jolira.com>
> wrote:
>> Igor,
>>
>> Thank you for responding back.
>>
>> Here is the code that I am using:
>>
>>        final Label c2 = new Label("c2", Integer.toString(counter));
>>        final Link<?> c2Link = new
>> StatelessAjaxFallbackLink<Void>("c2-link",
>>                null, updatedParameters) {
>>            private static final long serialVersionUID = 1L;
>>
>>            @Override
>>            public void onClick(final AjaxRequestTarget target) {
>>                if (target != null) {
>>                    target.addComponent(c2, "c2");
>>                }
>>            }
>>        };
>>
>> Here is my HTML:
>>
>> <span wicket:id="c2" id="c2"></span>
>> <a href="#" wicket:id="c2-link">increment</a>
>>
>> Instead of calling c2.setOutputMarkupId(true), I am passing the ID
>> ("c2") to the component, which means that my
>> StatelessAjaxFallbackLink
>> works perfectly the first time around. The HTML that is generated for
>> the C2 span unfortunately contains the wrong ID the second time
>> around,
>> because the Component#setOutputMarkupId(true) executed as part of
>> AjaxRequestTarget#respondComponent(Response, String, Component)
>> generates the wrong id.
>>
>> Without the call to Component#setOutputMarkupId(true) the id would
>> just
>> remain "c2" and my StatelessAjaxFallbackLink would work perfectly.
>>
>> BTW: The call to Component#setOutputMarkupId(true) is redundant
>> anyway
>> as AjaxRequestTarget#addComponent(Component) already enforces that
>> the
>> value must be true...
>>
>> Best regards,
>>
>> Joachim
>>
>> On Sun, 2010-02-07 at 20:18 -0800, Igor Vaynberg wrote:
>>
>>> Why remove it?
>>>
>>> -Igor
>>>
>>>
>>> On Sunday, February 7, 2010, Joachim F. Kainz <jf...@jolira.com>
>>> wrote:
>>>> Dear Developers,
>>>>
>>>> I am working for a very, very, very large global retailer and we
>>>> are
>>>> about to roll out a very high-volume mobile application using
>>>> Wicket.
>>>>
>>>> In order to support some of the requirements we have I have been
>>>> working
>>>> on adding a few more stateless components to Wicket. As one
>>>> example, I
>>>> added a StatelessAjaxFailbankLink. I also added a StatelessLink
>>>> that
>>>> works better for our app. The code is APL2 licensed and available
>>>> at
>>>> http://jolira-tools.googlecode.com/svn/wicket-stateless/trunk/
>>>> together
>>>> with  demo application.
>>>>
>>>> The demo works perfectly, when clicking on the link the first
>>>> time. The
>>>> second time it does not. The reason for this problem is that
>>>> AjaxRequestTarget#respondComponent(Response, String, Component)
>>>> method
>>>> calls Component#setOutputMarkupId(boolean) with a value of true.
>>>>
>>>> I looked for quite a while but I have not found a way to override
>>>> this
>>>> behavior anywhere. I would greatly appreciate it, if somebody could
>>>> suggest an approach or if somebody could suggest how to remove
>>>> this line
>>>> from the AjaxRequestTarget in a future version of the wicket code.
>>>> Removing the line should be side-effect free as, in cases this
>>>> line is
>>>> actually used, this setting is verified earlier in the code.
>>>>
>>>> Best regards,
>>>>
>>>> Joachim
>>>>
>>>>
>>
>
>
>
> --
> Become a Wicket expert, learn from the best: http://wicketinaction.com
> Apache Wicket 1.4 increases type safety for web applications
> Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.4

Re: AjaxRequestTarget#respondComponent(Response, String, Component) calls Component#setOutputMarkupId(boolean)

Posted by Martijn Dashorst <ma...@gmail.com>.
just call setMarkupId("c2") or let wicket manage the ID.

Martijn

On Mon, Feb 8, 2010 at 6:51 AM, Joachim F. Kainz <jf...@jolira.com> wrote:
> Igor,
>
> Thank you for responding back.
>
> Here is the code that I am using:
>
>        final Label c2 = new Label("c2", Integer.toString(counter));
>        final Link<?> c2Link = new
> StatelessAjaxFallbackLink<Void>("c2-link",
>                null, updatedParameters) {
>            private static final long serialVersionUID = 1L;
>
>            @Override
>            public void onClick(final AjaxRequestTarget target) {
>                if (target != null) {
>                    target.addComponent(c2, "c2");
>                }
>            }
>        };
>
> Here is my HTML:
>
> <span wicket:id="c2" id="c2"></span>
> <a href="#" wicket:id="c2-link">increment</a>
>
> Instead of calling c2.setOutputMarkupId(true), I am passing the ID
> ("c2") to the component, which means that my StatelessAjaxFallbackLink
> works perfectly the first time around. The HTML that is generated for
> the C2 span unfortunately contains the wrong ID the second time around,
> because the Component#setOutputMarkupId(true) executed as part of
> AjaxRequestTarget#respondComponent(Response, String, Component)
> generates the wrong id.
>
> Without the call to Component#setOutputMarkupId(true) the id would just
> remain "c2" and my StatelessAjaxFallbackLink would work perfectly.
>
> BTW: The call to Component#setOutputMarkupId(true) is redundant anyway
> as AjaxRequestTarget#addComponent(Component) already enforces that the
> value must be true...
>
> Best regards,
>
> Joachim
>
> On Sun, 2010-02-07 at 20:18 -0800, Igor Vaynberg wrote:
>
>> Why remove it?
>>
>> -Igor
>>
>>
>> On Sunday, February 7, 2010, Joachim F. Kainz <jf...@jolira.com> wrote:
>> > Dear Developers,
>> >
>> > I am working for a very, very, very large global retailer and we are
>> > about to roll out a very high-volume mobile application using Wicket.
>> >
>> > In order to support some of the requirements we have I have been working
>> > on adding a few more stateless components to Wicket. As one example, I
>> > added a StatelessAjaxFailbankLink. I also added a StatelessLink that
>> > works better for our app. The code is APL2 licensed and available at
>> > http://jolira-tools.googlecode.com/svn/wicket-stateless/trunk/  together
>> > with  demo application.
>> >
>> > The demo works perfectly, when clicking on the link the first time. The
>> > second time it does not. The reason for this problem is that
>> > AjaxRequestTarget#respondComponent(Response, String, Component) method
>> > calls Component#setOutputMarkupId(boolean) with a value of true.
>> >
>> > I looked for quite a while but I have not found a way to override this
>> > behavior anywhere. I would greatly appreciate it, if somebody could
>> > suggest an approach or if somebody could suggest how to remove this line
>> > from the AjaxRequestTarget in a future version of the wicket code.
>> > Removing the line should be side-effect free as, in cases this line is
>> > actually used, this setting is verified earlier in the code.
>> >
>> > Best regards,
>> >
>> > Joachim
>> >
>> >
>



-- 
Become a Wicket expert, learn from the best: http://wicketinaction.com
Apache Wicket 1.4 increases type safety for web applications
Get it now: http://www.apache.org/dyn/closer.cgi/wicket/1.4.4

Re: AjaxRequestTarget#respondComponent(Response, String, Component) calls Component#setOutputMarkupId(boolean)

Posted by "Joachim F. Kainz" <jf...@jolira.com>.
Igor,

Thank you for responding back.

Here is the code that I am using:

        final Label c2 = new Label("c2", Integer.toString(counter));
        final Link<?> c2Link = new
StatelessAjaxFallbackLink<Void>("c2-link",
                null, updatedParameters) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(final AjaxRequestTarget target) {
                if (target != null) {
                    target.addComponent(c2, "c2");
                }
            }
        };

Here is my HTML:

<span wicket:id="c2" id="c2"></span>
<a href="#" wicket:id="c2-link">increment</a>

Instead of calling c2.setOutputMarkupId(true), I am passing the ID
("c2") to the component, which means that my StatelessAjaxFallbackLink
works perfectly the first time around. The HTML that is generated for
the C2 span unfortunately contains the wrong ID the second time around,
because the Component#setOutputMarkupId(true) executed as part of
AjaxRequestTarget#respondComponent(Response, String, Component)
generates the wrong id.

Without the call to Component#setOutputMarkupId(true) the id would just
remain "c2" and my StatelessAjaxFallbackLink would work perfectly.

BTW: The call to Component#setOutputMarkupId(true) is redundant anyway
as AjaxRequestTarget#addComponent(Component) already enforces that the
value must be true...

Best regards,

Joachim

On Sun, 2010-02-07 at 20:18 -0800, Igor Vaynberg wrote:

> Why remove it?
> 
> -Igor
> 
> 
> On Sunday, February 7, 2010, Joachim F. Kainz <jf...@jolira.com> wrote:
> > Dear Developers,
> >
> > I am working for a very, very, very large global retailer and we are
> > about to roll out a very high-volume mobile application using Wicket.
> >
> > In order to support some of the requirements we have I have been working
> > on adding a few more stateless components to Wicket. As one example, I
> > added a StatelessAjaxFailbankLink. I also added a StatelessLink that
> > works better for our app. The code is APL2 licensed and available at
> > http://jolira-tools.googlecode.com/svn/wicket-stateless/trunk/  together
> > with  demo application.
> >
> > The demo works perfectly, when clicking on the link the first time. The
> > second time it does not. The reason for this problem is that
> > AjaxRequestTarget#respondComponent(Response, String, Component) method
> > calls Component#setOutputMarkupId(boolean) with a value of true.
> >
> > I looked for quite a while but I have not found a way to override this
> > behavior anywhere. I would greatly appreciate it, if somebody could
> > suggest an approach or if somebody could suggest how to remove this line
> > from the AjaxRequestTarget in a future version of the wicket code.
> > Removing the line should be side-effect free as, in cases this line is
> > actually used, this setting is verified earlier in the code.
> >
> > Best regards,
> >
> > Joachim
> >
> >