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