<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->
 
 
#Navigation Top
 [On to the General Installation Guide&gt;&gt;](./installation.html)
 
#Introduction
## General Introduction
 Welcome and hello to MyFaces Extension-Scripting, short Ext-Scripting. Ext-Scripting is an extensions
 project for MyFaces. It tries to add scripting and rapid prototyping (artifact level hot deployment)
 capabilities to JSF by adding
 scripting languages and JSP like recompilation mechanisms.
 Following link to the a video on YouTube shows you what Ext-Scripting can do for you:
 
 
 
 <iframe class="youtube-player" type="text/html" width="800" height="600" src="http://www.youtube.com/embed/g2YvzOloNyI" frameborder="0">
 </iframe>
 
 
 
 As the video shows, you can make changes to almost all JSF artifacts on the fly, and at the next
 reload the changes are present.
 The result is a reduction in server restarts and better turn around times. The
 same rapid prototyping approach which is normally present in scripting languages and scripting
 language based frameworks.
 Additionally to that, Ext-Scripting integrates various scripting languages to be used in conjunction
 with JSF, so that a mixed language approach becomes feasible within the bounds of the framework.
 
 
 
#Documentation
 
 Ext-Scripting provides extensive documentation. Feel free
 to browse our
 [Installation Guide](./installation.html)
 or
 [Users Guide](./usersguide.html)
 for further information.
 
 
 Also
 [download links](./download.html)
 are provided on the left hand side of this page,
 as well as further information.
 
 
#Short Overview over Ext-Scripting
## Supported for Scripting Languages
 
 Ext-Scripting currently only supports Groovy Java and Scala (1.0.3+) as dynamic languages.
 Additional languages will be provided in subsequent releases.
 
 
## Support for JSF2 and JSF2 Artifacts and Annotations
 
 One of the main goals of Ext-Scripting was to provide JSF2 support out of the box. Most new JSF2
 artifacts are supported. Ext-Scripting even adds scriptability to the new annotation syntax of JSF2
 by allowing annotations to be used in a dynamic manner!
 
 
## Support for MyFaces
 
 Extensions scripting supports MyFaces only for now. Following versions are supported.
 
<ul>
   <li>1.2.8+ (note support will be dropped soon post 1.0.2)</li>
   <li>2.0+</li>
</ul>
 
 Older versions are not supported due to missing plugin mechanisms which allow Ext-Scripting to work.
 
 
 The JSF RI and Mojarra as time of writing are not supported due to missing framework hooks needed,
 but Mojarra supports Groovy out of the box within the core engine. So for the time being only
 MyFaces can be used. Also Portlets for 1.0.x are not supported, this limitation will be eliminated
 in future versions. Support for Mojarra maybe will come post 1.0.x.
 
 
 
#Navigation Bottom
 [On to the General Installation Guide&gt;&gt;](./installation.html)
 
 
