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