Hi, I could solve my problem with the reload of the page and the multi call of the constructors.
This evening, I created a quickstart project to show you my problem. After finishing the code of the quickstart project, I could not reproduce my problem. I compared the code from the quickstart project with my own code and found the difference. I made a mistake during the creation of the background thread and the initialization of the AjaxSelfUpdatingTimerBehavior. The problem was the order. I created the AjaxSelfUpdatingTimerBehavior before the Background Thread. After changing this order, I could use my application in multiple tabs without any problems. Thanks for the many help. Andre On Thu, 1 Mar 2012 23:03:37 +0100 Andre Schütz <[email protected]> wrote: > Hi, > > I started my project with Jetty from within IDEA to use breakpoints and > additional informations from the debugger. The Jetty server > started without any problems, but when I call localhost:8080, I get > he following error: > > Unexpected Runtime Exception > > Last cause: Can not determine Markup. Component is not yet connected to a > parent. > [Page class = org.myproject.PageIndex, id = 0, render count = 1] > > In my pom.xml, I defined the path to the HTML files for the corresping classes > as: > > <build> > <resources> > <resource> > <filtering>false</filtering> > <directory>src/main/resources</directory> > </resource> > <resource> > <directory>src/main/html</directory> > </resource> > <resource> > <filtering>false</filtering> > <directory>src/main/java</directory> > <includes> > <include>**</include> > </includes> > <excludes> > <exclude>**/*.java</exclude> > </excludes> > </resource> > </resources> > <testResources> > <testResource> > <filtering>false</filtering> > <directory>src/test/resources</directory> > </testResource> > <testResource> > <directory>src/main/html</directory> > </testResource> > <testResource> > <filtering>false</filtering> > <directory>src/test/java</directory> > <includes> > <include>**</include> > </includes> > <excludes> > <exclude>**/*.java</exclude> > </excludes> > </testResource> > </testResources> > <plugins> > <plugin> > > Seems to me, that Jetty does not find the .html files? > > Andre > > > On Thu, 1 Mar 2012 10:13:00 +0200 > Martin Grigorov <[email protected]> wrote: > > > Use mvnDebug instead of mvn at the command line. This will start it in > > debug mode and you can attach to it from IDEA. > > Otherwise Wicket quickstart comes with src/test/java/**/Start.java. > > Run this class as normal Java application with main(String[]). From > > the context menu in the .java file choose "Debug 'Start.main()'" > > > > 2012/3/1 "André Schütz" <[email protected]>: > > > Hi Martin, > > > > > > I compile the wicket project via Maven from the command line. I do not > > > use the IDE to start the project and trace it? Do you have a hint how I > > > can do that? As IDE, Ia m using IntelliJ IDEA. > > > > > > Andre > > > > > > -------- Original-Nachricht -------- > > >> Datum: Thu, 1 Mar 2012 09:40:30 +0200 > > >> Von: Martin Grigorov <[email protected]> > > >> An: [email protected] > > >> Betreff: Re: Multi Tab and Session > > > > > >> 2012/2/29 Andre Schütz <[email protected]>: > > >> > Hi, > > >> > > > >> > I could identify the cause of the problem, but still have no > > >> > solution. > > >> > > > >> > I set some breakpoints and made some output messages to trace > > >> > the system. The following thinks happened: > > >> > > > >> > (1) > > >> > I submit a search in Tab1. The search word will be passed as > > >> > Page Parameter to Page2 in Tab1. While Tab1 is showing the loading > > >> > animation with it AjaxSelfUpdatingTimerBehavior, I submit a second > > >> > search in Tab2. Tab2 switches to its Page2 and the loading animation > > >> > stops in both Tabs. > > >> > > > >> > Reason: > > >> > --> The constructors of Page2 is called twice on the two Tabs. > > >> > > > >> > As diagram: > > >> > 01.) Tab1: Page1 submit search > > >> > 02.) Tab1: Page2 (Page id = 14) calls its constructor and adds a PanelA > > >> > 03.) Tab1: shows loading animation with its > > >> AjaxSelfUpdatingTimerBehavior at PanelA > > >> > 04.) Tab2: Page1 submit search > > >> > 05.) Tab2: Page2 (Page id = 16) calls its constructor and adds a PanelA > > >> > 06.) Tab2: shows loading animation with its > > >> AjaxSelfUpdatingTimerBehavior at PanelA > > >> > 07.) Tab1: Page2 (Page id = 17) calls its constructor > > >> > 08.) Tab1: does not update anymore > > >> > 09.) Tab2: Page2 (Page id = 18) calls its constructor > > >> > 10.) Tab2: does not update anymore > > >> > > > >> > I do nothing from the beginning of step 7 and do not know why the > > >> constructor > > >> > is called again. > > >> > > >> Put a breakpoint in Page2 constructor and see why it is called. > > >> > > >> > > > >> > (2) > > >> > The same odd behavior happens, when I do the following. I submit a > > >> search > > >> > in Tab1 from its Page1. While the loading animation is shown, I reload > > >> the > > >> > Page1 in Tab2. The constructor of Page2 in Tab1 is called again and the > > >> > Page2 in Tab1 stops its update progress. > > >> > > > >> > As diagram: > > >> > 01.) Tab1: Page1 submit search > > >> > 02.) Tab1: Page2 (Page id = 22) calls its constructor and adds a PanelA > > >> > 03.) Tab1: shows loading animation with its > > >> AjaxSelfUpdatingTimerBehavior at PanelA > > >> > 04.) Tab2: Reload any Page > > >> > 05.) Tab1: Page2 (Page id = 23) calls its constructor > > >> > 06.) Tab1: does not update anymore > > >> > > > >> > > > >> > I really can't explain to myself, why the constructor is called again. > > >> But I think > > >> > that this second call in the individual Tabs is crashing my > > >> > application. > > >> > Any ideas about this odd behavior? > > >> > > > >> > Thank in advance, > > >> > Andre > > >> > > > >> > > > >> > On Wed, 29 Feb 2012 10:10:37 -0800 > > >> > Dan Retzlaff <[email protected]> wrote: > > >> > > > >> >> Your description is clear, thank you. I'm not certain that the > > >> background > > >> >> thread's reference to the Session is valid outside of the servlet > > >> request. > > >> >> I would verify your assumption by logging the session's object ID when > > >> the > > >> >> value is read/written. > > >> >> > > >> >> I have one other thought for you. I believe Wicket keeps the most > > >> recent > > >> >> page in a deserialized state to save itself the work of > > >> >> deserialization > > >> in > > >> >> the common case of it being required by the next request. (I think the > > >> >> logic is in PageStoreManager, but it's not clear to me. Hopefully a > > >> >> dev > > >> can > > >> >> confirm/correct me.) At any rate, this may cause the difference > > >> >> between > > >> >> your two scenarios. In your successful, single-tab scenario, you may > > >> >> be > > >> >> benefiting from a lack of serialization/deserialization round-trip. We > > >> have > > >> >> noticed this difference when our components have transient variables > > >> that > > >> >> aren't set to null in detach(): in the most recent page the variable > > >> >> remains not-null; if the session has intermediate requests for other > > >> pages, > > >> >> the variable is null when next accessed. > > >> >> > > >> >> Good luck, > > >> >> Dan > > >> >> > > >> >> 2012/2/29 "André Schütz" <[email protected]> > > >> >> > > >> >> > Hi, > > >> >> > > > >> >> > Page1 gets the click of the submit button and collects the search > > >> word. > > >> >> > This will be changed into a hash value and set as PageParameter > > >> >> > (q=Hashvalue) to the ResponsePage which is Page2. > > >> >> > Additionally, I store the hash value into a session HashMap which > > >> holds > > >> >> > the hash value as key and an own class with the original search > > >> >> > word. > > >> This > > >> >> > class will be filled with the results from the search of the > > >> background > > >> >> > thread. > > >> >> > > > >> >> > On Page2, I have the PageParameter as hash value and can search for > > >> the > > >> >> > correct entry of the HashMap in the session to react, when the > > >> results are > > >> >> > found. > > >> >> > > > >> >> > I hope, I could describe it. > > >> >> > > > >> >> > Andre > > >> >> > > > >> >> > -------- Original-Nachricht -------- > > >> >> > > Datum: Tue, 28 Feb 2012 14:27:35 -0800 > > >> >> > > Von: Dan Retzlaff <[email protected]> > > >> >> > > An: [email protected] > > >> >> > > Betreff: Re: Multi Tab and Session > > >> >> > > > >> >> > > Hi Andre. I'm trying to understand your setup. A quickstart may be > > >> >> > > required. > > >> >> > > > > >> >> > > What does your Page1's onSubmit() look like? Specifically I'd like > > >> to > > >> >> > know > > >> >> > > how Page2 knows to watch for "word2". > > >> >> > > > > >> >> > > 2012/2/28 Andre Schütz <[email protected]> > > >> >> > > > > >> >> > > > Hello, > > >> >> > > > > > >> >> > > > I have a problem with my application that I am not able to solve > > >> since > > >> >> > > > the last three days. > > >> >> > > > > > >> >> > > > I realized that Wicket 1.5 provides multi tab / multi window > > >> support > > >> >> > > > for more than one opened tab in a browser. > > >> >> > > > I have a problem with multiple tabs in my program, that I want > > >> >> > > > to > > >> >> > > > describe now. > > >> >> > > > > > >> >> > > > The program consists of two pages. Page1 contains a search field > > >> that > > >> >> > > > will be used to type in a search word. > > >> >> > > > Page2 makes the search on a database, returns the results and > > >> >> > > > displays it as a list. The search will be done from a background > > >> >> > > > thread that stores the result in a hashmap in the session with > > >> the > > >> >> > > > search word as the key. Furthermore, Page2 shows a little > > >> >> > > > loading > > >> >> > > > animation that will be updated (AjaxSelfUpdatingTimerBehavior), > > >> when > > >> >> > the > > >> >> > > > result is stored in the session. > > >> >> > > > > > >> >> > > > Now the problem. > > >> >> > > > > > >> >> > > > (1) I open the application in two tabs of the same browser. > > >> >> > > > (2) The URL looks as follows: > > >> >> > > > Tab1 - localhost:8080/appli/?0 > > >> >> > > > Tab2 - localhost:8080/appli/?1 > > >> >> > > > (3) Tab1 gets word1 in the search field and Tab2 gets word2 > > >> >> > > > into the search field. > > >> >> > > > (4) I press the submit button of Tab1, switch to Tab2 and press > > >> the > > >> >> > > > submit button, too. > > >> >> > > > (5) The two Threads start to search for the results. > > >> >> > > > (6) During the AjaxSelfUpdatingTimeBehavior, the result panel of > > >> Page2 > > >> >> > > > checks > > >> >> > > > in its overwritten onBeforeRender method for the results. When > > >> the > > >> >> > > result > > >> >> > > > for the search word is found in the session, the updateBehavior > > >> of > > >> >> > Page2 > > >> >> > > > is stopped and the results will be displayed. > > >> >> > > > -> Here starts my problem: > > >> >> > > > > > >> >> > > > None of the two pages will be updated and show the results. If I > > >> start > > >> >> > > > the search in one of the Tabs, the process will be finished and > > >> the > > >> >> > > > results displayed onto the screen. > > >> >> > > > > > >> >> > > > For me, it seems that both tabs share the same session data and > > >> also > > >> >> > > > the same updateBehavior on the Page2. > > >> >> > > > > > >> >> > > > Can anybody help me with that problem? Would be great. > > >> >> > > > > > >> >> > > > -- > > >> >> > > > Andre Schütz <[email protected]> > > >> >> > > > > > >> >> > > > > > >> --------------------------------------------------------------------- > > >> >> > > > To unsubscribe, e-mail: [email protected] > > >> >> > > > For additional commands, e-mail: [email protected] > > >> >> > > > > > >> >> > > > > > >> >> > > > >> >> > -- > > >> >> > Empfehlen Sie GMX DSL Ihren Freunden und Bekannten und wir > > >> >> > belohnen Sie mit bis zu 50,- Euro! > > >> https://freundschaftswerbung.gmx.de > > >> >> > > > >> >> > --------------------------------------------------------------------- > > >> >> > To unsubscribe, e-mail: [email protected] > > >> >> > For additional commands, e-mail: [email protected] > > >> >> > > > >> >> > > > >> > > > >> > > > >> > -- > > >> > Andre Schütz <[email protected]> > > >> > > > >> > --------------------------------------------------------------------- > > >> > To unsubscribe, e-mail: [email protected] > > >> > For additional commands, e-mail: [email protected] > > >> > > > >> > > >> > > >> > > >> -- > > >> Martin Grigorov > > >> jWeekend > > >> Training, Consulting, Development > > >> http://jWeekend.com > > >> > > >> --------------------------------------------------------------------- > > >> To unsubscribe, e-mail: [email protected] > > >> For additional commands, e-mail: [email protected] > > >> > > > > > > -- > > > NEU: FreePhone 3-fach-Flat mit kostenlosem Smartphone! > > > Jetzt informieren: http://mobile.1und1.de/?ac=OM.PW.PW003K20328T7073a > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [email protected] > > > For additional commands, e-mail: [email protected] > > > > > > > > > > > -- > > Martin Grigorov > > jWeekend > > Training, Consulting, Development > > http://jWeekend.com > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [email protected] > > For additional commands, e-mail: [email protected] > > > > > -- > Andre Schütz <[email protected]> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > -- Andre Schütz <[email protected]> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
