Intégration avec applications Web

 

Les applets Java sont exécutées dans l'environnement d'un navigateur web. De ce fait, elles peuvent interagir avec le code javascript présent dans la page web qui contient l'applet et ce, dans les 2 directions. Cette communication permet de réaliser des interfaces html pour contrôler la carte et des intégrations simples avec d'autres applications exécutées dans l'environnement du navigateur web. Cela ne s'applique pas aux applications JMap Pro déployées avec la méthode JavaWebStart (en dehors d'un navigateur web) car il n'y a pas de page web impliquée dans ces cas.

Javascript vers Java

L'exemple de page web suivante est une page normale de démarrage d'une application JMap Pro de type applet à laquelle on a ajouté des fonctions en javascript (pan et zoom) et des hyperliens pour appeler ces fonctions. Lorsqu'elles sont appelées, les fonctions font appel à l'API de JMap pour contrôler la carte.

L'application JMap Pro possède une méthode getApplicationContext() permettant d'accéder à l'ensemble des composantes de l'application.

 
  <%@page contentType="text/html;charset=ISO-8859-1"%>
 
  <%
    String username = request.getParameter("username");    
    String password = request.getParameter("password");
    String parameters = null;
  
    if (username != null && username.length() != 0)
    {
      parameters = "?username=" + username;
      if (password != null)
        parameters += "&password=" + password;
    }
  %>
 
  <html>
    <head>
    <title>
      aa
    </title>
    <script src="library/deployJava.js"></script>
    <script src="library/jmap.js"></script>
  </head>
 
  <BODY BGCOLOR="#ffffff" topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0">
 
  <script>
    function zoom(factor)
    {
      document.jmap.getApplicationContext().getViewManager().getActiveView().zoom(factor);
      document.jmap.getApplicationContext().getViewManager().getActiveView().refresh();
    }
    function pan(x, y)
    {
      document.jmap.getApplicationContext().getViewManager().getActiveView().pan(x, y);
      document.jmap.getApplicationContext().getViewManager().getActiveView().refresh();
    }
  </script>
 
  <a href="javascript:zoom(2.);">Zoom in</a>
  <a href="javascript:zoom(0.5);">Zoom out</a>
  <a href="javascript:pan(0, 200);">Pan north</a>
  <a href="javascript:pan(0, -200);">Pan south</a>
  <a href="javascript:pan(200, 0);">Pan west</a>
  <a href="javascript:pan(-200, 0);">Pan east</a>
 
  <script>
    var attributes = 
    {
      name: "jmap",
      codebase: "http://127.0.0.1:8080/aa",
      code: "com.kheops.jmap.client.application.JMapApplicationLauncher"
      archive: "dockingClient.jar,jmap_application.jar,jmap_client.jar,jmap_client_images.jar,jmap_projections.jar,jmap_symbols.jar,custom_symbols.jar,jmap_metadata.jar,jmap_net.jar,jmap_spatial.jar,kheops_ui.jar,kheops_util.jar,gif4j_pro_2.0.jar,jide-action.jar,jide-common.jar,jide-components.jar,jide-dock.jar,jide-grids.jar",
      width: "100%"
      height: "100%",
      mayscript: true,
      separate_jvm: true,
      parameters: "-appclassname jmap.viewers.docking.AppDocking -project &quot;The World&quot; -directport 7003 -httpport 8080 <%= username != null ? username : "" %> <%= password != null ? password : "" %> -proxypath /aa/servlet/jmapproxy -serverid &quot;aa&quot; -maxmemory 33554432 -connection direct -donotlistusers false -showconnectionmoredetails false  true   "
    };
  
    var parameters = {fontSize:16, jnlp_href:'dockingClient.jnlp'} ; 
 
    deployJava.runApplet(attributes, parameters, '1.6.0_10');
  </script>
 
  </body>
  </html>

 

Java vers Javascript

À partir d'une applet JMap Pro, il est possible d'appeler des fonctions javascript présentes dans la page web qui contient l'applet. Cela permet une interaction entre l'application JMap Pro et son environnement html. Par exemple, il serait possible de sélectionner un élément sur la carte et d'afficher dans la page html des informations sur l'élément en question.

Pour activer cette communication java-javascript, il est nécessaire de spécifier le paramètre mayscript: true dans les attributs servant à démarrer l'applet, tel que montré dans l'exemple suivant.

 

 
<script>
  var attributes = 
  {
    name: "jmap",
    codebase: "http://127.0.0.1:8080/aa",
    code: "com.kheops.jmap.client.application.JMapApplicationLauncher"
    archive: "dockingClient.jar,jmap_application.jar,jmap_client.jar,jmap_client_images.jar,jmap_projections.jar,jmap_symbols.jar,custom_symbols.jar,jmap_metadata.jar,jmap_net.jar,jmap_spatial.jar,kheops_ui.jar,kheops_util.jar,gif4j_pro_2.0.jar,jide-action.jar,jide-common.jar,jide-components.jar,jide-dock.jar,jide-grids.jar",
    width: "100%"
    height: "100%",
    mayscript: true,
    separate_jvm: true,
    parameters: "-appclassname jmap.viewers.docking.AppDocking -project &quot;The World&quot; -directport 7003 -httpport 8080 <%= username != null ? username : "" %> <%= password != null ? password : "" %> -proxypath /aa/servlet/jmapproxy -serverid &quot;aa&quot; -maxmemory 33554432 -connection direct -donotlistusers false -showconnectionmoredetails false  true   "
  };
  
  var parameters = {fontSize:16, jnlp_href:'dockingClient.jnlp'} ; 
 
  deployJava.runApplet(attributes, parameters, '1.6.0_10');
</script>
 

 

Pour appeler une fonction javascript à partir de votre code Java (possiblement de votre extension JMap), vous devez utiliser l'API de JSObject, tel que démontré dans l'exemple suivant.

 

  JSObject w = JSObject.getWindow((Applet)appContext.getRootPaneContainer());

 w.eval("show_form(" + id + ");");

 

Dans cet exemple, la méthode getWindow reçoit l'instance de l'applet en paramètre. La méthode getRootPaneContainer de la classe JMapApplicationContext retourne le container de plus haut niveau de l'application, ce dernier étant l'instance de Applet lorsque l'application est exécutée à l'intérieur du navigateur Web.

La méthode eval prend en paramètres la fonction javascript à appeler avec ses paramètres. Dans cet exemple, un identifiant est passé à la fonction javascript.