<!--
    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
 [&lt;&lt;Back to the appendix: Setup steps](./setupSteps.html)
 or
 [On to the appendix: Example Configuration&gt;&gt;](./exampleconfig102.html)
 
#Appendix: Configuration Entries
## General Information
 
 This page is a general quick overview over the possible configuration parameters, if you need further
 details please visit the[setup guide](./installation.html).
 
 
<table>
   <thead>
       <tr>
           <td>Param</td>
           <td>Required</td>
           <td>Possible values</td>
           <td>Short Description</td>
       </tr>
   </thead>
   <tbody>
       <tr>
           <td>org.apache.myfaces.FACES_INIT_PLUGINS</td>
           <td>YES</td>
           <td>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</td>
           <td>MyFaces Extension Point Setup</td>
       </tr>
       <tr>
           <td>scriptingFilter</td>
           <td>YES</td>
           <td/>
           <td>The scripting filter for further information look <a href="#scriptingFilter">below</a></td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS</td>
           <td>NO</td>
           <td>comma separate list of paths</td>
           <td>Additional comma separated loader paths to allow direct editing of groovy files on the sources
               directory instead of editing in the deployment dir /WEB-INF/groovy
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.java.LOADER_PATHS</td>
           <td>NO</td>
           <td>comma separate list of paths</td>
           <td>Additional comma separated loader paths to allow direct editing of java files on the sources
               directory instead of editing in the deployment dir /WEB-INF/java
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.resource.LOADER_PATHS</td>
           <td>NO</td>
           <td>comma separate list of paths</td>
           <td>Additional comma separated loader paths to allow direct editing of resources on the sources
               directory instead of editing in the deployment directory
           </td>
           <td>Important notice, in most cases this path will point to the root of your web application
               directory
               (ie: src/main/webapp in a standard Maven2 structure or &lt;project-root&gt;/webapp for a
               standard
               Eclipse project structure)
           </td>
       </tr>
       <tr>
           <td>facelets.RESOURCE_RESOLVER</td>
           <td>NO</td>
           <td>org.apache.myfaces.extensions.scripting.facelet.ReroutingResourceResolver</td>
           <td>Enables the loading of xhtml facelet pages from your source directory, if
               org.apache.myfaces.extensions.scripting.resource.LOADER_PATHS is set properly
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.scripting.PGK_WHITELIST</td>
           <td>NO</td>
           <td>a comma separate list of whitelisted packages</td>
           <td>Enables package whitelisting, a mechanism which allows to compile and reload only from
               whitelisted packages
           </td>
       </tr>
       <tr>
           <td>org.apache.myfaces.extensions.scripting.PGK_ADDITIONAL_CLASSPATH</td>
           <td>NO</td>
           <td>a comma separate list of additional classpaths</td>
           <td>enables additional classpaths for the compile time</td>
       </tr>
   </tbody>
</table>
 
#Normal configuration entries
 all configuration entries except for the scripting filter follow the context parameter convention
                <context-param>
                    <description>
                        Initializes the plugins for our scripting support
                    </description>
                    <param-name>org.apache.myfaces.FACES_INIT_PLUGINS</param-name>
                    <param-value>org.apache.myfaces.extensions.scripting.servlet.StartupServletContextPluginChainLoader</param-value>
                </context-param>
             
             
 
#Scripting Filter
 []()
 All configuration entries are context parameters, the only exception is the scripting filter which is a servlet filter
 The scripting filter differs in its configuration by having to provide a servlet filter tag and a pattern:
                <!-- ======================================================================================
                        Scripting Filter
                        Second step to enable Ext-Scripting
                     ====================================================================================== -->
                <filter>
                    <filter-name>scriptingFilter</filter-name>
                    <filter-class>org.apache.myfaces.extensions.scripting.servlet.ScriptingServletFilter</filter-class>
                </filter>
                <filter-mapping>
                    <filter-name>scriptingFilter</filter-name>
                    <url-pattern>/*</url-pattern>
                    <dispatcher>REQUEST</dispatcher>
                    <dispatcher>FORWARD</dispatcher>
                    <dispatcher>INCLUDE</dispatcher>
                    <dispatcher>ERROR</dispatcher>
                </filter-mapping>
            
            
 Note for further examples of the configuration go to the section [On to the
 appendix: Example Configuration&gt;&gt;](./exampleconfig.html) 
 
#Navigation Bottom
 [&lt;&lt;Back to the appendix: Setup steps](./setupSteps.html)
 or
 [On to the appendix: Example Configuration&gt;&gt;](./exampleconfig.html)
 
