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