In the previous blog entry, I had just mentioned about our server-side context sharing mechanism between an Applet
and
web pages in our GIS-enabled project. Users will try to accomplish their scenarios by using those two views. Obviously,
there will be switches many times between them during the execution of any use case. Simply, users will enter some data
via the web interface and then switch to the Applet
view and enter some further data there and then switch back to the
web interface and submit data. Later, they will switch to the Applet
view again to see the results of that submit action.
There is one big problem here. As the web interface part and Applet
view part will be in different web pages, IE calls
the destroy
method of the Applet
instance each time when we leave the page in which the Applet
resides and calls
init
each time when we enter into that page again. IE behaves like this between page back and forward operations, too.
According to the specified operations above, the life cycle of an Applet
in IE is as follows:
init() -> start() : when we enter the page, in which our applet is contained
stop() -> destory() : when we leave applet page, or click page back/forward buttons
init() -> start() : when we again come back to the applet's web page
As a result of the above behavior, our GIS Applet
gets initialized several times during the execution of a user scenario,
which is unacceptable because users may enter some data, open several maps during their operations, and may also switch
back and forth between the Applet
and web interface part.
I tried to find an elegant solution to this multiple init
-> destroy
problem. I looked for a way to prevent the
browser from calling those methods but came up without a solution. Through deep googling around the web, I found
relatively old discussions (dating back to the year 2000 in comp.lang.java.programmer) related to our problem. I think
the only possible solution to this problem is caching state, data, or graphics, which you don’t want to get destroyed and
initialized again in a static data structure in your Applet
code. In the init()
method, or during other phases of the
Applet
, you first look at the cache before you create your graphics or load user data and only create or initialize them
unless they exist in the static cache. This cache could simply be a Hashtable
. The trick here is that the loaded Applet
class definition and therefore static variable are kept alive until all open browser windows are closed.