src/main/javadoc/overview.html
author Jaroslav Tulach <jtulach@netbeans.org>
Mon, 01 Sep 2014 16:25:25 +0200
changeset 852 e5723aecdaff
parent 841 e673fd71b81b
child 870 77bff7390451
child 886 88d62267a0b5
permissions -rw-r--r--
Documenting, testing and adopting code to IllegalStateException being thrown when there is no browser context during invocation of a JavaScriptBody method.
     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     </head>
    52     <body>
    53         <p>
    54          Use Java to write application logic; Use HTML5 to render the UI; 
    55          {@link net.java.html.json.Model Animate an HTML page from Java}
    56          (see <a target="_blank" href="http://dew.apidesign.org/dew/#7212206">Duke being rotated</a> by CSS);
    57          Use {@link net.java.html.json.OnReceive REST} or
    58          <a href="net/java/html/json/doc-files/websockets.html">WebSockets</a>;
    59          interact with <a href="net/java/html/js/package-summary.html">JavaScript</a>;
    60          Get the best of both worlds!
    61          
    62          The goal of these APIs is to use full featured Java runtime 
    63          (like real <a href="http://wiki.apidesign.org/wiki/HotSpot">HotSpot VM</a>), 
    64          but still rely on a very lightweight rendering technology 
    65          (so it can potentially fit 
    66          <a href="http://bck2brwsr.apidesign.org">Bck2Brwsr</a> and definitely
    67          to various types of phones). What can be more lightweight 
    68          (from a browser perspective) than 
    69          <a href="http://wiki.apidesign.org/wiki/HTML">HTML</a>!?
    70          By default we use {@link net.java.html.boot.fx JavaFX's WebView} 
    71          component to display the <a href="http://wiki.apidesign.org/wiki/HTML">HTML</a>. 
    72          We eliminate the need to manipulate the DOM directly, 
    73          there is a special {@link net.java.html.json Java to Knockout.js binding}. 
    74          As a result the <a href="http://knockoutjs.com">HTML uses Knockout.js syntax</a>, 
    75          yet the application code can be written in Java.
    76         </p>
    77         
    78         <h3>What's New in Version 1.0?</h3>
    79         
    80         <p>
    81             {@link net.java.html.json.Property#array() Array properties} are now
    82             mutable from the <a href="http://knockoutjs.com">knockout.js</a>
    83             point of view (required {@link org.netbeans.html.json.spi.Proto.Type#replaceValue one SPI change}).
    84             The page lookup mechanism can use {@link net.java.html.boot.BrowserBuilder#locale(java.util.Locale) locale}
    85             to load localized a page with appropriate suffix.
    86             All SPI were moved under the NetBeans namespace - e.g.
    87             {@link org.netbeans.html.boot.spi},
    88             {@link org.netbeans.html.context.spi},
    89             {@link org.netbeans.html.json.spi},
    90             {@link org.netbeans.html.sound.spi}, and also
    91             {@link org.netbeans.html.json.tck}. Methods annotated
    92             with {@link net.java.html.js.JavaScriptBody} annotation and
    93             without fallback Java code now throw {@link java.lang.IllegalStateException}
    94             with a message suggesting to switch to proper
    95             {@link net.java.html.BrwsrCtx#execute browser context} to
    96             prevent endless debugging when one forgets to do so.
    97         </p>
    98         
    99         <h3>What's New in Version 0.9?</h3>
   100         
   101         <p>
   102             System can run in {@link net.java.html.boot.BrowserBuilder#classloader(java.lang.ClassLoader) Felix OSGi container} (originally only Equinox).
   103             {@link net.java.html.json.ComputedProperty Derived properties}
   104             now deeply check changes in other {@link net.java.html.json.Model model
   105             classes} they depend on and recompute their values accordingly.
   106             <a target="_blank" href="http://knockoutjs.com">Knockout.js</a> library has been updated
   107             to version 3.2.0.
   108         </p>
   109         
   110         <h3>What's New in 0.8.x Versions?</h3>
   111         
   112         <p>
   113             Setters or array properties on classes generated by {@link net.java.html.json.Model}
   114             annotation can be accessed from any thread. {@link org.netbeans.html.sound.spi.AudioEnvironment}
   115             can be registered into {@link net.java.html.BrwsrCtx}. There is
   116             a {@link net.java.html.json.Models#parse(net.java.html.BrwsrCtx, java.lang.Class, java.io.InputStream, java.util.Collection)  method}
   117             to parse a JSON array and convert it into 
   118             {@link net.java.html.json.Model model classes}.
   119             Improved behavior of <code>enum</code> values in 
   120             {@link net.java.html.json.Model knockout bindings}.
   121         </p>
   122         
   123         <p>
   124             Few bugfixes for better portability. 
   125             New API for {@link net.java.html.boot.script.Scripts headless execution}
   126             on top of <em>Nashorn</em> - does not run <em>knockout for Java</em>
   127             fully yet 
   128             (reported as <a href="https://bugs.openjdk.java.net/browse/JDK-8046013">JDK-8046013</a>),
   129             however even in current state it is quite 
   130             {@link net.java.html.boot.script.Scripts useful for testing}
   131             of 
   132             {@link net.java.html.js Java/JavaScript interactions}.
   133         </p>
   134         
   135         <p>
   136             {@link net.java.html.boot.fx.FXBrowsers} has been extended
   137             with new helper methods to make it easier to use HTML+Java
   138             API in existing JavaFX applications.
   139             The annotation processor is made
   140             more robust with respect to errors in callback syntax of
   141             {@link net.java.html.js.JavaScriptBody} body parameter.
   142             Javadoc of {@link net.java.html.BrwsrCtx#execute} method
   143             has been improved based on a failure of its usability study.
   144             There can be additional parameters to methods annotated by
   145             {@link net.java.html.json.OnReceive} that allows one to
   146             pass state when a JSON call is made and use it when it finishes.
   147             The mechanism of discovery of sibling HTML page has been
   148             extended to work on systems that don't support
   149             {@link java.lang.Class#getProtectionDomain}.
   150         </p>
   151         
   152         <p>
   153             The first argument of method annotated by
   154             {@link net.java.html.json.OnReceive} annotation has to
   155             be the associated {@link net.java.html.json.Model model class}.
   156         </p>
   157         
   158         <p>
   159             {@link net.java.html.json.OnReceive} annotation now accepts
   160             {@link java.util.List} of data values as second argument
   161             (previously required an array).
   162         </p>
   163         
   164         
   165         <h3>What's New in Older Versions?</h3>
   166         
   167         <p>
   168             {@link net.java.html.js.JavaScriptBody} annotation has new attribute
   169             {@link net.java.html.js.JavaScriptBody#wait4js()} which allows
   170             asynchronous execution. Libraries using
   171             {@link net.java.html.js.JavaScriptBody} are urged to use this
   172             new attribute as much as possible, as it can speed up execution
   173             in certain environments.
   174         </p>
   175         
   176         <p>
   177             Use {@link net.java.html.BrwsrCtx#execute(java.lang.Runnable)} in
   178             multi-threaded environment to execute your code on the browser thread.
   179             See example 
   180             {@link net.java.html.BrwsrCtx#execute(java.lang.Runnable) using Java timer}.
   181         </p>
   182         
   183         <h3>Interesting Entry Points</h3>
   184         
   185         <p>Learn how to {@link net.java.html.json.Model animate an HTML page from Java}
   186             without referencing single HTML element from the Java code.
   187         </p>
   188         <p>Use {@link net.java.html.json.OnReceive JSON} to communicate
   189             with REST based server API.
   190         </p>
   191         <p>Use <a href="net/java/html/json/doc-files/websockets.html">WebSockets</a>
   192             and JSON.
   193         </p>
   194         <p>Call JavaScript methods from Java and vice versa, via
   195             <a href="net/java/html/js/package-summary.html">JavaScriptBody</a>.
   196         </p>
   197 
   198         <h3>Getting Started</h3>
   199 
   200         There are <a href="http://wiki.apidesign.org/wiki/DukeScriptInNetBeans">many ways</a> 
   201         to start developing 
   202         <a href="http://html.java.net">Html for Java</a> application. 
   203         However to be sure one chooses the most recent setup, it is recommended
   204         to switch to good old command line and use a 
   205         <a href="http://wiki.apidesign.org/wiki/Knockout4Java">Maven archetype</a>
   206         associated with every version of this project. Make sure at least 
   207         <em>JDK7</em> is your installed Java and type:
   208         <pre>      
   209 $ mvn archetype:generate \
   210  -DarchetypeGroupId=org.apidesign.html \
   211  -DarchetypeArtifactId=knockout4j-archetype \
   212  -DarchetypeVersion=0.8 <em># or newer version, if available</em>
   213         </pre>
   214         Answer few questions (for example choose myfirstbrwsrpage as artifactId) 
   215         and then you can:
   216         <pre>
   217 $ cd myfirstbrwsrpage
   218 $ mvn process-classes exec:java
   219         </pre>
   220         In a few seconds (or minutes if 
   221         <a href="http://wiki.apidesign.org/wiki/Maven">Maven</a>
   222         decides to download the whole Internet of dependencies) you should 
   223         see a sample Hello World application rendered in a 
   224         <a href="http://wiki.apidesign.org/wiki/JavaFX">JavaFX</a>
   225         web view component (that of course requires your JDK to come
   226         with <a href="http://wiki.apidesign.org/wiki/JavaFX">JavaFX</a>; 
   227         <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK7 
   228             and JDK8 from Oracle</a> contain everything that is needed). 
   229         The generated application is built around one 
   230         Java source (uses the {@link net.java.html.json.Model} annotation to
   231         auto-generate another <code>Data.java</code> class during compilation)
   232         and one HTML file (uses the <a href="http://knockoutjs.com">Knockout</a>
   233         syntax to <code>data-bind</code> the HTML elements to the 
   234         generated <code>Data</code> model):
   235         <pre>
   236 $ ls src/main/java/**/DataModel.java
   237 $ ls src/main/webapp/pages/index.html
   238         </pre>
   239         That is all you need to get started. Play with the sources, 
   240         modify them and enjoy
   241         <a href="http://html.java.net">Html for Java</a>!
   242         
   243         <h2>IDE Support</h2>
   244         
   245         <p>
   246             This API is part of <a target="_blank"
   247             href="http://netbeans.org">NetBeans.org</a> project and as such
   248             it works naturally with the <a target="_blank"
   249             href="https://netbeans.org/features/index.html">NetBeans IDE</a>.
   250             On the other hand, the API is using nothing NetBeans specific,
   251             it builds on standard Java6 APIs and as such it shall work fine
   252             in any IDE.
   253         </p>
   254         
   255         <p>
   256             A lot of work is done by 
   257             <a href="http://wiki.apidesign.org/wiki/AnnotationProcessor">
   258             annotation processors</a>
   259             that generate various boiler plate code during compilation. This
   260             is a standard part of Java since JDK6, but for example Eclipse
   261             is known not to deal with processors well and developers using
   262             it need to be careful. IntelliJ users hasn't reported any issues
   263             and of course, NetBeans IDE support for 
   264             <a href="http://wiki.apidesign.org/wiki/AnnotationProcessor">processors</a>
   265             is outstanding.
   266         </p>
   267         
   268         <p>
   269             When using {@link net.java.html.js.JavaScriptBody} annotation, it is
   270             useful to do a bit of post processing of classes. There is a
   271             <a href="http://wiki.apidesign.org/wiki/Maven">Maven</a> 
   272             plugin for that.
   273             NetBeans IDE will invoke it when doing a build. Other IDEs may 
   274             need some hint to do so. 
   275             Anyway: If one does not see all (generated) sources or is getting
   276             {@link java.lang.LinkageError}s when executing the application, 
   277             switch to command line and do clean build
   278             from there:
   279         </p>
   280         <pre>$ mvn clean install</pre>
   281         <p>
   282             If that succeeds, your IDE of choice will hopefully
   283             pick the generated sources up and present the result of the build 
   284             properly. If not, 
   285             <a href="https://netbeans.org/downloads/">download NetBeans</a>, 
   286             you will be pleasantly 
   287             surprised - for example with our excellent 
   288             <a href="net/java/html/js/package-summary.html#debugging">Java/JavaScript 
   289             debugging</a> support.
   290         </p>
   291         
   292         <a name="deploy">
   293         <h2>Deploy Your Application</h2>
   294         </a>
   295         
   296         <p>
   297         It is not goal of this documentation to list all possible ways
   298         to package and deploy applications which use this API. However it is 
   299         important for new comers to see the benefits of using the
   300         <a href="http://html.java.net">HTML for Java</a> API and as such
   301         let's list at least few bundling options, known to work at the time of writing 
   302         this documentation.
   303         </p>
   304         
   305         <p>
   306         First of all, this is a <em>client technology</em>. You write client applications
   307         with it which may, but need not connect to a server. You don't need
   308         Tomcat or WebLogic to deploy 
   309         <a href="http://html.java.net">HTML for Java</a> applications.
   310         </p>
   311         
   312         <p>
   313             <img src='resources/javafx_logo.jpg' width="64"
   314                  height="64" align="left"/>
   315             The sample project generated by
   316             <code>org.apidesign.html knockout4j-archetype</code> is configured
   317             to use <a href="http://wiki.apidesign.org/wiki/JavaFX">JavaFX</a>
   318             as the rendering technology. This setup is primarily suitable for 
   319             development - it needs no special packaging, starts quickly and
   320             allows you to use classical HotSpot VM debuggers. A final 
   321             artifact from the build is also a ZIP file which you can use
   322             and distribute to your users. Good for desktop applications.
   323         </p>
   324         
   325         <p>
   326             <img src='resources/netbeans_logo.jpg' width="64"
   327                  height="64" align="right"/>
   328             <img src='resources/eclipse_logo.png' width="64"
   329                  height="64" align="right"/>
   330             All the <a href="http://html.java.net">HTML for Java</a> libraries
   331             are packaged as <a href="http://wiki.apidesign.org/wiki/OSGi">OSGi</a>
   332             bundles and as such they can easily be run in NetBeans as well as
   333             in Eclipse. As a result one can use 
   334             <a href="http://wiki.apidesign.org/wiki/OSGi">OSGi</a>
   335             and have a common module system for both platforms. In addition to that 
   336             one can render using
   337             HTML and have a common UI in both platforms. In such case
   338             your application would be packaged as a set of
   339             <a href="http://wiki.apidesign.org/wiki/OSGi">OSGi</a> bundles.
   340             Read 
   341             <a href="http://wiki.apidesign.org/wiki/HTML">more</a>...
   342         </p>
   343         
   344         <p>
   345             <img src='resources/chrome_logo.png' width="64"
   346                  height="64" align="left"/>
   347             <img src='resources/safari_logo.png' width="64"
   348                  height="64" align="left"/>
   349             <img src='resources/ie_logo.png' width="64"
   350                  height="64" align="left"/>
   351             <img src='resources/firefox_logo.png' width="64"
   352                  height="64" align="left"/>
   353             
   354             There is more and more attempts to execute Java bytecode
   355             in a browser, without any special Java plugin installed.
   356             The <a href="http://html.java.net">HTML for Java</a> is
   357             carefully designed to produce lightweight, well performing
   358             applications even on such restricted environments. It uses
   359             no reflection calls and that allows to statically pre-compile
   360             the applications into JavaScript. One of such environments
   361             is called <a href="http://wiki.apidesign.org/wiki/Bck2Brwsr">Bck2Brwsr</a>, 
   362             another <a href="http://wiki.apidesign.org/wiki/TeaVM">TeaVM</a>. Both support the
   363             {@link net.java.html.js.JavaScriptBody} annotation. Read 
   364             <a href="http://wiki.apidesign.org/wiki/Bck2BrwsrViaCLI">more</a> or play
   365             a minesweeper game packaged for your browser 
   366             (of course <a target="_blank"
   367                 href="http://source.apidesign.org/hg/html~demo/file/ea79b73d590a/minesweeper/src/main/java/org/apidesign/demo/minesweeper/MinesModel.java">
   368                 written</a> in Java):
   369         </p>
   370         
   371         <script type="text/html" id="field">
   372             <table class="field">
   373                 <tbody>
   374                     <!-- ko foreach: rows -->
   375                     <tr>
   376                         <!-- ko foreach: columns -->
   377                         <td data-bind="css: style, click: $parents[1].click" >
   378                             <div data-bind='html: html'></div>
   379                         </td>
   380                         <!-- /ko -->
   381                     </tr>
   382                     <!-- /ko -->
   383                 </tbody>
   384             </table>
   385         </script>
   386 
   387         <div data-bind="template: { name : 'field', if: fieldShowing }"></div>
   388 
   389         <!-- boot bck2brwsr -->
   390         <script type="text/javascript" src="resources/teavm.js"></script>
   391         <script>
   392             var vm = new VM();
   393             vm.loadClass('org.apidesign.demo.minesweeper.MainBrwsr');
   394         </script>
   395 
   396         <p>
   397             <img src='resources/ios_logo.jpg' width="64"
   398                  height="64" align="right"/>
   399             <img src='resources/android_logo.jpg' width="64"
   400                  height="64" align="right"/>
   401             
   402             Now when we have seen that the 
   403             <a href="http://html.java.net">HTML for Java</a> applications 
   404             can run on any modern browser, we can ask whether they can also
   405             fit into a phone!? Yes, they can and especially to phones 
   406             that can execute Java code already! Just by changing your
   407             packaging you can create an APK file and deploy it to your
   408             Android phone. 
   409             Read <a target="_blank" href="http://wiki.apidesign.org/wiki/DlvkBrwsr">more</a>...
   410             In case you'd like your application to reach out to second biggest
   411             group of smartphone users, don't despair: It 
   412             seems the set of devices that can execute
   413             <a href="http://html.java.net">HTML for Java</a> applications 
   414             has been extended to <em>iPads</em> and <em>iPhones</em>. Get the 
   415             <a target="_blank" href="http://wiki.apidesign.org/wiki/IBrwsr">details here</a>
   416             and deploy everywhere!
   417         </p>
   418         <p>
   419             Convinced it makes sense to use 
   420             <a href="http://html.java.net">HTML for Java</a>
   421             APIs for writing applications that are 
   422             <em>written once, displayed anywhere</em>? Or do you have an
   423             environment which is not supported? In such case you can bring
   424             <a href="http://html.java.net">HTML for Java</a>
   425             to your environment yourself. Just implement your own
   426             {@link org.netbeans.html.boot.spi.Fn.Presenter}!
   427         </p>
   428         
   429         <h2>Other Resources</h2>
   430         
   431         <img src="net/java/html/json/doc-files/DukeHTML.png" width="256" height="184" alt="Duke and HTML5. Together at last!" align="right"/>
   432         
   433         The javadoc for latest and previous versions is also available
   434         online:
   435         <ul>
   436             <li>Current <a target="_blank" href="http://bits.netbeans.org/html+java/dev/">development</a> version
   437             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/0.8.3">0.8.3</a>
   438             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/0.8.2">0.8.2</a>
   439             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/0.8.1">0.8.1</a>
   440             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/0.8">0.8</a>
   441             <li>Version <a target="_blank" href="http://bits.netbeans.org/html+java/0.7.5">0.7.5</a>
   442         </ul>
   443         
   444 <style type="text/css">
   445 table.field td {
   446     padding: 4px;
   447     width: 18px;
   448     height: 18px;
   449     font-size: 1.5em;
   450     border: 1px solid black;
   451 }
   452 table.field td.UNKNOWN {
   453     background-color: #D6E4E1;
   454     cursor: pointer;
   455 }
   456 table.field td.EXPLOSION {
   457     background-color: #A31E39;
   458 }
   459 table.field td.DISCOVERED {
   460     background-color: #9DB2B1;
   461 }
   462 </style>        
   463     </body>
   464 </html>