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