src/main/javadoc/overview.html
author Jaroslav Tulach <jtulach@netbeans.org>
Fri, 02 Oct 2015 08:57:14 +0200
changeset 1006 a0f79e32d526
parent 991 a5c83b735cca
child 1017 10427ce1c0ee
permissions -rw-r--r--
Ability to run the JavaFX presenter in headless mode is useful for testing
     1 <!--
     2 
     3     DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     4 
     5     Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
     6 
     7     Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     8     Other names may be trademarks of their respective owners.
     9 
    10     The contents of this file are subject to the terms of either the GNU
    11     General Public License Version 2 only ("GPL") or the Common
    12     Development and Distribution License("CDDL") (collectively, the
    13     "License"). You may not use this file except in compliance with the
    14     License. You can obtain a copy of the License at
    15     http://www.netbeans.org/cddl-gplv2.html
    16     or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    17     specific language governing permissions and limitations under the
    18     License.  When distributing the software, include this License Header
    19     Notice in each file and include the License file at
    20     nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    21     particular file as subject to the "Classpath" exception as provided
    22     by Oracle in the GPL Version 2 section of the License file that
    23     accompanied this code. If applicable, add the following below the
    24     License Header, with the fields enclosed by brackets [] replaced by
    25     your own identifying information:
    26     "Portions Copyrighted [year] [name of copyright owner]"
    27 
    28     Contributor(s):
    29 
    30     The Original Software is NetBeans. The Initial Developer of the Original
    31     Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
    32 
    33     If you wish your version of this file to be governed by only the CDDL
    34     or only the GPL Version 2, indicate your decision by adding
    35     "[Contributor] elects to include this software in this distribution
    36     under the [CDDL or GPL Version 2] license." If you do not indicate a
    37     single choice of license, a recipient has the option to distribute
    38     your version of this file under either the CDDL, the GPL Version 2 or
    39     to extend the choice of license to its licensees as provided above.
    40     However, if you add GPL Version 2 code and therefore, elected the GPL
    41     Version 2 license, then the option applies only if the new code is
    42     made subject to such option by the copyright holder.
    43 
    44 -->
    45 <!DOCTYPE html>
    46 <html>
    47     <head>
    48         <title>HTML for Java APIs</title>
    49         <meta charset="UTF-8">
    50         <meta name="viewport" content="width=device-width, initial-scale=1.0">
    51         <style type="text/css">
    52         table.field td {
    53             padding: 4px;
    54             width: 18px;
    55             height: 18px;
    56             font-size: 1.5em;
    57             border: 1px solid black;
    58         }
    59         table.field td.UNKNOWN {
    60             background-color: #D6E4E1;
    61             cursor: pointer;
    62         }
    63         table.field td.EXPLOSION {
    64             background-color: #A31E39;
    65         }
    66         table.field td.DISCOVERED {
    67             background-color: #9DB2B1;
    68         }
    69         </style>
    70     </head>
    71     <body>
    72         <p>
    73          Use Java to write application logic; Use HTML5 to render the UI;
    74          {@link net.java.html.json.Model Animate an HTML page from Java}
    75          (see <a target="_blank" href="http://dew.apidesign.org/dew/#7212206">Duke being rotated</a> by CSS);
    76          Use {@link net.java.html.json.OnReceive REST} or
    77          <a href="net/java/html/json/doc-files/websockets.html">WebSockets</a>;
    78          interact with <a href="net/java/html/js/package-summary.html">JavaScript</a>;
    79          Get the best of both worlds!
    80 
    81          The goal of these APIs is to use full featured Java runtime
    82          (like real <a href="http://wiki.apidesign.org/wiki/HotSpot">HotSpot VM</a>),
    83          but still rely on a very lightweight rendering technology
    84          (so it can potentially fit
    85          <a href="http://bck2brwsr.apidesign.org">Bck2Brwsr</a> and definitely
    86          to various types of phones). What can be more lightweight
    87          (from a browser perspective) than
    88          <a href="http://wiki.apidesign.org/wiki/HTML">HTML</a>!?
    89          By default we use {@link net.java.html.boot.fx JavaFX's WebView}
    90          component to display the <a href="http://wiki.apidesign.org/wiki/HTML">HTML</a>.
    91          We eliminate the need to manipulate the DOM directly,
    92          there is a special {@link net.java.html.json Java to Knockout.js binding}.
    93          As a result the <a href="http://knockoutjs.com">HTML uses Knockout.js syntax</a>,
    94          yet the application code can be written in Java.
    95         </p>
    96 
    97         <h3>Improvements in version 1.3</h3>
    98 
    99         The <em>JavaFX</em> presenter can be executed in headless mode -
   100         just specify <code>-Dfxpresenter.headless=true</code> when launching
   101         its virtual machine and no window will be shown. This is particularly
   102         useful for testing. Configure your <em>surefire</em> or <em>failsafe</em>
   103         plugins like: <pre>
   104 &lt;plugin&gt;
   105   &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
   106   &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
   107   &lt;version&gt;2.13&lt;/version&gt;
   108   &lt;configuration&gt;
   109       &lt;systemPropertyVariables&gt;
   110           &lt;fxpresenter.headless&gt;true&lt;/fxpresenter.headless&gt;
   111       &lt;/systemPropertyVariables&gt;
   112   &lt;/configuration&gt;
   113 &lt;/plugin&gt;
   114 </pre>
   115 
   116         <h3>What's Been Improved in Version 1.2.3?</h3>
   117 
   118         One can control {@link net.java.html.json.OnReceive#headers() HTTP request headers}
   119         when connecting to server using the {@link net.java.html.json.OnReceive}
   120         annotation. It is possible to have
   121         {@link net.java.html.json.ComputedProperty#write() writable computed properties}.
   122         There is an easy way to enable <a target="_blank" href="http://getfirebug.com/">Firebug</a> in
   123         the JavaFX based Web View -
   124         just run with <code>-Dfirebug.lite=true</code> as
   125         <a target="_blank" href="https://www.youtube.com/watch?v=2rxwY-QJiLo">this video</a>
   126         demonstrates.
   127         Bugfix of issues <a target="_blank" href='https://netbeans.org/bugzilla/show_bug.cgi?id=250503'>250503</a>,
   128         <a target="_blank" href='https://netbeans.org/bugzilla/show_bug.cgi?id=252987'>252987</a>.
   129 
   130         <h3>What's New in Version 1.1?</h3>
   131 
   132         <p>
   133             The content of a {@link net.java.html.BrwsrCtx context}
   134             can be selected by registering implementations under specific
   135             {@link org.netbeans.html.context.spi.Contexts.Id technology identifiers}
   136             and requesting them during
   137             {@link org.netbeans.html.context.spi.Contexts#newBuilder(java.lang.Object...) construction}
   138             of the context. <code>org.netbeans.html:ko4j</code> module's implementation
   139             offers <b>ko4j</b>, <b>xhr</b> and <b>websocket</b> identifiers
   140             for its registered services
   141             (e.g. {@link org.netbeans.html.json.spi.Technology},
   142             {@link org.netbeans.html.json.spi.Transfer} and
   143             {@link org.netbeans.html.json.spi.WSTransfer}).
   144             <code>org.netbeans.html:ko-ws-tyrus</code>
   145             module registers its
   146             {@link org.netbeans.html.json.spi.Transfer Java based JSON} and
   147             {@link org.netbeans.html.json.spi.WSTransfer WebSocket} implementations
   148             under the name <b>tyrus</b>.
   149         </p>
   150         <p>
   151             A particular DOM subtree
   152             that a <a target="_blank" href="http://knockoutjs.com">knockout.js</a> model gets
   153             applied to can be selected by using
   154             {@link net.java.html.json.Models#applyBindings(java.lang.Object,java.lang.String)
   155             Models.applyBindings(m, id)} with an id of an HTML element.
   156             There is new {@link net.java.html.json.Model#targetId()} attribute
   157             which controls behavior of the generated <code>applyBindings</code> method.
   158             If <em>specified and non-empty</em>, then the generated method
   159             will call {@link net.java.html.json.Models#applyBindings(java.lang.Object,java.lang.String)}
   160             with <code>this</code> and the provided {@link net.java.html.json.Model#targetId() target id}.
   161             If <em>specified, but left empty</em>, then the generated method
   162             calls {@link net.java.html.json.Models#applyBindings(java.lang.Object)}.
   163             <em>If unspecified</em>, the method will <b>not</b> be generated at all
   164             (a change with respect to older versions). However one can
   165             still use {@link net.java.html.json.Models#applyBindings(java.lang.Object)}
   166             or {@link net.java.html.json.Models#applyBindings(java.lang.Object,java.lang.String)}
   167             to perform the association of any model with the page element.
   168         </p>
   169         <p>
   170             Memory model when using Knockout bindings has been improved
   171             (required additions of two new methods:
   172             {@link org.netbeans.html.json.spi.PropertyBinding#weak()} and
   173             {@link org.netbeans.html.json.spi.FunctionBinding#weak()}) and
   174             now the Java {@link net.java.html.json.Model models} can garbage collect,
   175             when no longer used. Library writers that use
   176             {@link net.java.html.js.JavaScriptBody} annotation can also
   177             control garbage collection behavior of method arguments by
   178             setting {@link net.java.html.js.JavaScriptBody#keepAlive() keepAlive=false}
   179             attribute.
   180         </p>
   181 
   182         <h3>What's New in Version 1.0?</h3>
   183 
   184         <p>
   185             {@link net.java.html.json.Property#array() Array properties} are now
   186             mutable from the <a href="http://knockoutjs.com">knockout.js</a>
   187             point of view (required {@link org.netbeans.html.json.spi.Proto.Type#replaceValue one SPI change}).
   188             The page lookup mechanism can use {@link net.java.html.boot.BrowserBuilder#locale(java.util.Locale) locale}
   189             to load localized a page with appropriate suffix.
   190             All SPI were moved under the NetBeans namespace - e.g.
   191             {@link org.netbeans.html.boot.spi},
   192             {@link org.netbeans.html.context.spi},
   193             {@link org.netbeans.html.json.spi},
   194             {@link org.netbeans.html.sound.spi}, and also
   195             {@link org.netbeans.html.json.tck}. Methods annotated
   196             with {@link net.java.html.js.JavaScriptBody} annotation and
   197             without fallback Java code now throw {@link java.lang.IllegalStateException}
   198             with a message suggesting to switch to proper
   199             {@link net.java.html.BrwsrCtx#execute browser context} to
   200             prevent endless debugging when one forgets to do so.
   201         </p>
   202 
   203         <p>
   204         What's new in older versions? Click the
   205         <a href="#" onclick="return showHistoric(true)">link</a>
   206         to view even more
   207         <a href="#" onclick="return showHistoric(true)">historic changes</a> below:
   208         </p>
   209 
   210         <a name="historic.changes"></a>
   211         <div id="historic.changes">
   212             <script>
   213             function showHistoric(show) {
   214                 var e = document.getElementById("historic.changes");
   215                 if (show) {
   216                     e.style.display="block";
   217                 } else {
   218                     e.style.display="none";
   219                 }
   220                 return false;
   221             }
   222             showHistoric(false);
   223             </script>
   224 
   225         <h3>What's New in Version 0.9?</h3>
   226 
   227         <p>
   228             System can run in {@link net.java.html.boot.BrowserBuilder#classloader(java.lang.ClassLoader) Felix OSGi container} (originally only Equinox).
   229             {@link net.java.html.json.ComputedProperty Derived properties}
   230             now deeply check changes in other {@link net.java.html.json.Model model
   231             classes} they depend on and recompute their values accordingly.
   232             <a target="_blank" href="http://knockoutjs.com">Knockout.js</a> library has been updated
   233             to version 3.2.0.
   234         </p>
   235 
   236         <h3>What's New in 0.8.x Versions?</h3>
   237 
   238         <p>
   239             Setters or array properties on classes generated by {@link net.java.html.json.Model}
   240             annotation can be accessed from any thread. {@link org.netbeans.html.sound.spi.AudioEnvironment}
   241             can be registered into {@link net.java.html.BrwsrCtx}. There is
   242             a {@link net.java.html.json.Models#parse(net.java.html.BrwsrCtx, java.lang.Class, java.io.InputStream, java.util.Collection)  method}
   243             to parse a JSON array and convert it into
   244             {@link net.java.html.json.Model model classes}.
   245             Improved behavior of <code>enum</code> values in
   246             {@link net.java.html.json.Model knockout bindings}.
   247         </p>
   248 
   249         <p>
   250             Few bugfixes for better portability.
   251             New API for {@link net.java.html.boot.script.Scripts headless execution}
   252             on top of <em>Nashorn</em> - does not run <em>knockout for Java</em>
   253             fully yet
   254             (reported as <a href="https://bugs.openjdk.java.net/browse/JDK-8046013">JDK-8046013</a>),
   255             however even in current state it is quite
   256             {@link net.java.html.boot.script.Scripts useful for testing}
   257             of
   258             {@link net.java.html.js Java/JavaScript interactions}.
   259         </p>
   260 
   261         <p>
   262             {@link net.java.html.boot.fx.FXBrowsers} has been extended
   263             with new helper methods to make it easier to use HTML+Java
   264             API in existing JavaFX applications.
   265             The annotation processor is made
   266             more robust with respect to errors in callback syntax of
   267             {@link net.java.html.js.JavaScriptBody} body parameter.
   268             Javadoc of {@link net.java.html.BrwsrCtx#execute} method
   269             has been improved based on a failure of its usability study.
   270             There can be additional parameters to methods annotated by
   271             {@link net.java.html.json.OnReceive} that allows one to
   272             pass state when a JSON call is made and use it when it finishes.
   273             The mechanism of discovery of sibling HTML page has been
   274             extended to work on systems that don't support
   275             {@link java.lang.Class#getProtectionDomain}.
   276         </p>
   277 
   278         <p>
   279             The first argument of method annotated by
   280             {@link net.java.html.json.OnReceive} annotation has to
   281             be the associated {@link net.java.html.json.Model model class}.
   282         </p>
   283 
   284         <p>
   285             {@link net.java.html.json.OnReceive} annotation now accepts
   286             {@link java.util.List} of data values as second argument
   287             (previously required an array).
   288         </p>
   289 
   290 
   291         <h3>What's New in 0.7.x Versions?</h3>
   292 
   293         <p>
   294             {@link net.java.html.js.JavaScriptBody} annotation has new attribute
   295             {@link net.java.html.js.JavaScriptBody#wait4js()} which allows
   296             asynchronous execution. Libraries using
   297             {@link net.java.html.js.JavaScriptBody} are urged to use this
   298             new attribute as much as possible, as it can speed up execution
   299             in certain environments.
   300         </p>
   301 
   302         <p>
   303             Use {@link net.java.html.BrwsrCtx#execute(java.lang.Runnable)} in
   304             multi-threaded environment to execute your code on the browser thread.
   305             See example
   306             {@link net.java.html.BrwsrCtx#execute(java.lang.Runnable) using Java timer}.
   307         </p>
   308         </div>
   309 
   310         <h3>Interesting Entry Points</h3>
   311 
   312         <p>Learn how to {@link net.java.html.json.Model animate an HTML page from Java}
   313             without referencing single HTML element from the Java code.
   314         </p>
   315         <p>Use {@link net.java.html.json.OnReceive JSON} to communicate
   316             with REST based server API.
   317         </p>
   318         <p>Use <a href="net/java/html/json/doc-files/websockets.html">WebSockets</a>
   319             and JSON.
   320         </p>
   321         <p>Call JavaScript methods from Java and vice versa, via
   322             <a href="net/java/html/js/package-summary.html">JavaScriptBody</a>.
   323         </p>
   324 
   325         <h3>Getting Started</h3>
   326 
   327         There are <a href="http://wiki.apidesign.org/wiki/DukeScriptInNetBeans">many ways</a>
   328         to start developing
   329         <a href="http://html.java.net">Html for Java</a> application.
   330         However to be sure one chooses the most recent setup, it is recommended
   331         to switch to good old command line and use a
   332         <a href="http://wiki.apidesign.org/wiki/Knockout4Java">Maven archetype</a>
   333         associated with every version of this project. Make sure at least
   334         <em>JDK7</em> is your installed Java and type:
   335         <pre>
   336 $ mvn archetype:generate \
   337  -DarchetypeGroupId=org.apidesign.html \
   338  -DarchetypeArtifactId=knockout4j-archetype \
   339  -DarchetypeVersion=0.8 <em># or newer version, if available</em>
   340         </pre>
   341         Answer few questions (for example choose myfirstbrwsrpage as artifactId)
   342         and then you can:
   343         <pre>
   344 $ cd myfirstbrwsrpage
   345 $ mvn process-classes exec:java
   346         </pre>
   347         In a few seconds (or minutes if
   348         <a href="http://wiki.apidesign.org/wiki/Maven">Maven</a>
   349         decides to download the whole Internet of dependencies) you should
   350         see a sample Hello World application rendered in a
   351         <a href="http://wiki.apidesign.org/wiki/JavaFX">JavaFX</a>
   352         web view component (that of course requires your JDK to come
   353         with <a href="http://wiki.apidesign.org/wiki/JavaFX">JavaFX</a>;
   354         <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK7
   355             and JDK8 from Oracle</a> contain everything that is needed).
   356         The generated application is built around one
   357         Java source (uses the {@link net.java.html.json.Model} annotation to
   358         auto-generate another <code>Data.java</code> class during compilation)
   359         and one HTML file (uses the <a href="http://knockoutjs.com">Knockout</a>
   360         syntax to <code>data-bind</code> the HTML elements to the
   361         generated <code>Data</code> model):
   362         <pre>
   363 $ ls src/main/java/**/DataModel.java
   364 $ ls src/main/webapp/pages/index.html
   365         </pre>
   366         That is all you need to get started. Play with the sources,
   367         modify them and enjoy
   368         <a href="http://html.java.net">Html for Java</a>!
   369 
   370         <h2>IDE Support</h2>
   371 
   372         <p>
   373             This API is part of <a target="_blank"
   374             href="http://netbeans.org">NetBeans.org</a> project and as such
   375             it works naturally with the <a target="_blank"
   376             href="https://netbeans.org/features/index.html">NetBeans IDE</a>.
   377             On the other hand, the API is using nothing NetBeans specific,
   378             it builds on standard Java6 APIs and as such it shall work fine
   379             in any IDE.
   380         </p>
   381 
   382         <p>
   383             A lot of work is done by
   384             <a href="http://wiki.apidesign.org/wiki/AnnotationProcessor">
   385             annotation processors</a>
   386             that generate various boiler plate code during compilation. This
   387             is a standard part of Java since JDK6, but for example Eclipse
   388             is known not to deal with processors well and developers using
   389             it need to be careful. IntelliJ users hasn't reported any issues
   390             and of course, NetBeans IDE support for
   391             <a href="http://wiki.apidesign.org/wiki/AnnotationProcessor">processors</a>
   392             is outstanding.
   393         </p>
   394 
   395         <p>
   396             When using {@link net.java.html.js.JavaScriptBody} annotation, it is
   397             useful to do a bit of post processing of classes. There is a
   398             <a href="http://wiki.apidesign.org/wiki/Maven">Maven</a>
   399             plugin for that.
   400             NetBeans IDE will invoke it when doing a build. Other IDEs may
   401             need some hint to do so.
   402             Anyway: If one does not see all (generated) sources or is getting
   403             {@link java.lang.LinkageError}s when executing the application,
   404             switch to command line and do clean build
   405             from there:
   406         </p>
   407         <pre>$ mvn clean install</pre>
   408         <p>
   409             If that succeeds, your IDE of choice will hopefully
   410             pick the generated sources up and present the result of the build
   411             properly. If not,
   412             <a href="https://netbeans.org/downloads/">download NetBeans</a>,
   413             you will be pleasantly
   414             surprised - for example with our excellent
   415             <a href="net/java/html/js/package-summary.html#debugging">Java/JavaScript
   416             debugging</a> support.
   417         </p>
   418 
   419         <a name="deploy">
   420         <h2>Deploy Your Application</h2>
   421         </a>
   422 
   423         <p>
   424         It is not goal of this documentation to list all possible ways
   425         to package and deploy applications which use this API. However it is
   426         important for new comers to see the benefits of using the
   427         <a href="http://html.java.net">HTML for Java</a> API and as such
   428         let's list at least few bundling options, known to work at the time of writing
   429         this documentation.
   430         </p>
   431 
   432         <p>
   433         First of all, this is a <em>client technology</em>. You write client applications
   434         with it which may, but need not connect to a server. You don't need
   435         Tomcat or WebLogic to deploy
   436         <a href="http://html.java.net">HTML for Java</a> applications.
   437         </p>
   438 
   439         <p>
   440             <img src='resources/javafx_logo.jpg' width="64"
   441                  height="64" align="left"/>
   442             The sample project generated by
   443             <code>org.apidesign.html knockout4j-archetype</code> is configured
   444             to use <a href="http://wiki.apidesign.org/wiki/JavaFX">JavaFX</a>
   445             as the rendering technology. This setup is primarily suitable for
   446             development - it needs no special packaging, starts quickly and
   447             allows you to use classical HotSpot VM debuggers. A final
   448             artifact from the build is also a ZIP file which you can use
   449             and distribute to your users. Good for desktop applications.
   450         </p>
   451 
   452         <p>
   453             <img src='resources/netbeans_logo.jpg' width="64"
   454                  height="64" align="right"/>
   455             <img src='resources/eclipse_logo.png' width="64"
   456                  height="64" align="right"/>
   457             All the <a href="http://html.java.net">HTML for Java</a> libraries
   458             are packaged as <a href="http://wiki.apidesign.org/wiki/OSGi">OSGi</a>
   459             bundles and as such they can easily be run in NetBeans as well as
   460             in Eclipse. As a result one can use
   461             <a href="http://wiki.apidesign.org/wiki/OSGi">OSGi</a>
   462             and have a common module system for both platforms. In addition to that
   463             one can render using
   464             HTML and have a common UI in both platforms. In such case
   465             your application would be packaged as a set of
   466             <a href="http://wiki.apidesign.org/wiki/OSGi">OSGi</a> bundles.
   467             Read
   468             <a href="http://wiki.apidesign.org/wiki/HTML">more</a>...
   469         </p>
   470 
   471         <p>
   472             <img src='resources/chrome_logo.png' width="64"
   473                  height="64" align="left"/>
   474             <img src='resources/safari_logo.png' width="64"
   475                  height="64" align="left"/>
   476             <img src='resources/ie_logo.png' width="64"
   477                  height="64" align="left"/>
   478             <img src='resources/firefox_logo.png' width="64"
   479                  height="64" align="left"/>
   480 
   481             There is more and more attempts to execute Java bytecode
   482             in a browser, without any special Java plugin installed.
   483             The <a href="http://html.java.net">HTML for Java</a> is
   484             carefully designed to produce lightweight, well performing
   485             applications even on such restricted environments. It uses
   486             no reflection calls and that allows to statically pre-compile
   487             the applications into JavaScript. One of such environments
   488             is called <a href="http://wiki.apidesign.org/wiki/Bck2Brwsr">Bck2Brwsr</a>,
   489             another <a href="http://wiki.apidesign.org/wiki/TeaVM">TeaVM</a>. Both support the
   490             {@link net.java.html.js.JavaScriptBody} annotation. Read
   491             <a href="http://wiki.apidesign.org/wiki/Bck2BrwsrViaCLI">more</a> or play
   492             a minesweeper game packaged for your browser
   493             (of course <a target="_blank"
   494                 href="http://source.apidesign.org/hg/html~demo/file/ea79b73d590a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java">
   495                 written</a> in Java):
   496         </p>
   497 
   498         <script type="text/html" id="field">
   499             <table class="field">
   500                 <tbody>
   501                     <!-- ko foreach: rows -->
   502                     <tr>
   503                         <!-- ko foreach: columns -->
   504                         <td data-bind="css: style, click: $parents[1].click" >
   505                             <div data-bind='html: html'></div>
   506                         </td>
   507                         <!-- /ko -->
   508                     </tr>
   509                     <!-- /ko -->
   510                 </tbody>
   511             </table>
   512         </script>
   513 
   514         <div data-bind="template: { name : 'field', if: fieldShowing }"></div>
   515 
   516         <!-- boot bck2brwsr -->
   517         <script type="text/javascript" src="resources/teavm.js"></script>
   518         <script>
   519             var vm = new VM();
   520             vm.loadClass('org.apidesign.demo.minesweeper.MainBrwsr');
   521         </script>
   522 
   523         <p>
   524             <img src='resources/ios_logo.jpg' width="64"
   525                  height="64" align="right"/>
   526             <img src='resources/android_logo.jpg' width="64"
   527                  height="64" align="right"/>
   528 
   529             Now when we have seen that the
   530             <a href="http://html.java.net">HTML for Java</a> applications
   531             can run on any modern browser, we can ask whether they can also
   532             fit into a phone!? Yes, they can and especially to phones
   533             that can execute Java code already! Just by changing your
   534             packaging you can create an APK file and deploy it to your
   535             Android phone.
   536             Read <a target="_blank" href="http://wiki.apidesign.org/wiki/DlvkBrwsr">more</a>...
   537             In case you'd like your application to reach out to second biggest
   538             group of smartphone users, don't despair: It
   539             seems the set of devices that can execute
   540             <a href="http://html.java.net">HTML for Java</a> applications
   541             has been extended to <em>iPads</em> and <em>iPhones</em>. Get the
   542             <a target="_blank" href="http://wiki.apidesign.org/wiki/IBrwsr">details here</a>
   543             and deploy everywhere!
   544         </p>
   545         <p>
   546             Convinced it makes sense to use
   547             <a href="http://html.java.net">HTML for Java</a>
   548             APIs for writing applications that are
   549             <em>written once, displayed anywhere</em>? Or do you have an
   550             environment which is not supported? In such case you can bring
   551             <a href="http://html.java.net">HTML for Java</a>
   552             to your environment yourself. Just implement your own
   553             {@link org.netbeans.html.boot.spi.Fn.Presenter}!
   554         </p>
   555 
   556         <h2>Other Resources</h2>
   557 
   558         <img src="net/java/html/json/doc-files/DukeHTML.png" width="256" height="184" alt="Duke and HTML5. Together at last!" align="right"/>
   559 
   560         The javadoc for latest and previous versions is also available
   561         online:
   562         <ul>
   563             <li>Current <a target="_blank" href="http://bits.netbeans.org/html+java/dev/">development</a> version
   564             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/1.1">1.1</a>
   565             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/1.0">1.0</a>
   566             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/0.9">0.9</a>
   567                 and historic ones (<a target="_blank" href="http://bits.netbeans.org/html+java/0.8.3">0.8.3</a>,
   568                 <a target="_blank" href="http://bits.netbeans.org/html+java/0.8.2">0.8.2</a>,
   569                 <a target="_blank" href="http://bits.netbeans.org/html+java/0.8.1">0.8.1</a>,
   570                 <a target="_blank" href="http://bits.netbeans.org/html+java/0.8">0.8</a>, and
   571                 <a target="_blank" href="http://bits.netbeans.org/html+java/0.7.5">0.7.5</a>)
   572             </li>
   573         </ul>
   574     </body>
   575 </html>