Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "Jetty/Howto/Configure JSP"
m |
m |
||
Line 6: | Line 6: | ||
==Compiling JSPs== | ==Compiling JSPs== | ||
− | To compile .jsp files into java classes, you need a Java compiler. You can acquire a Java compiler from the JVM | + | To compile .jsp files into java classes, you need a Java compiler. You can acquire a Java compiler from the JVM if you are using a full JDK, or from a third party Jar. |
− | In versions of Jetty prior to 7.5.0, the JSP infrastructure made use of the Eclipse Java Compiler (ecj.jar) which is supplied in $JETTY_HOME/lib/jsp. For jetty-7.5.0 we upgraded the version of JSP to <tt>jsp-impl-2.1.3.b10</tt> (from Glassfish). In this version, the JSP infrastructure ALWAYS tries to acquire a Java compiler from the JVM if the version of Java is 1.6 or above. Therefore, if you are using a JRE, JSPs are unable to compile. We are waiting on the JSP project to back port a bug fix from jsp-2.2 that will allow us to force the JSP infrastructure to look beyond the JVM for a compiler. In the meanwhile, we have patched the JSP code and are waiting on Eclipse Orbit to make a release with those patched Jars. When the Jars have been patched, we will make a Jetty release containing them. In the interim, if using jetty-7.5.x, you must use a full JDK. Alternatively, you can precompile your JSPs (which is preferable in a production deployment in any case). The [[Jetty/Feature/Jetty_Jspc_Maven_Plugin|Jetty JSPC Maven Plugin]] is helpful for precompilation. | + | In versions of Jetty prior to 7.5.0, the JSP infrastructure made use of the Eclipse Java Compiler (ecj.jar) which is supplied in <tt>$JETTY_HOME/lib/jsp</tt>. For jetty-7.5.0 we upgraded the version of JSP to <tt>jsp-impl-2.1.3.b10</tt> (from Glassfish). In this version, the JSP infrastructure ALWAYS tries to acquire a Java compiler from the JVM if the version of Java is 1.6 or above. Therefore, if you are using a JRE, JSPs are unable to compile. We are waiting on the JSP project to back port a bug fix from jsp-2.2 that will allow us to force the JSP infrastructure to look beyond the JVM for a compiler. In the meanwhile, we have patched the JSP code and are waiting on Eclipse Orbit to make a release with those patched Jars. When the Jars have been patched, we will make a Jetty release containing them. In the interim, if using jetty-7.5.x, you must use a full JDK. Alternatively, you can precompile your JSPs (which is preferable in a production deployment in any case). The [[Jetty/Feature/Jetty_Jspc_Maven_Plugin|Jetty JSPC Maven Plugin]] is helpful for precompilation. |
Note that for jetty-8.x.x, you can use ''either'' a full JDK ''or'' a JRE in combination with a third party Java compiler (such as ecj). In the latter case, you need to set a SystemProperty, either in your code or in a jetty config file. Here's the snippet that you can put into <tt>jetty.xml</tt>: | Note that for jetty-8.x.x, you can use ''either'' a full JDK ''or'' a JRE in combination with a third party Java compiler (such as ecj). In the latter case, you need to set a SystemProperty, either in your code or in a jetty config file. Here's the snippet that you can put into <tt>jetty.xml</tt>: | ||
Line 127: | Line 127: | ||
|- | |- | ||
| compiler | | compiler | ||
− | | Determined at runtime. For Jetty this is the | + | | Determined at runtime. For Jetty this is the Eclipse jdt compiler. |
|- | |- | ||
| compilerTargetVM | | compilerTargetVM | ||
Line 298: | Line 298: | ||
</source> | </source> | ||
− | == Using JSTL Taglibs | + | == Using JSTL Taglibs for Jetty 7.x and 8.x == |
------------------- | ------------------- | ||
− | + | === Jetty 7.x=== | |
− | The JSTL tags are present in the org.apache.taglibs.standard.glassfish | + | The JSTL tags are present in the <tt>org.apache.taglibs.standard.glassfish</tt> Jar in <tt>$JETTY_HOME/lib/jsp</tt>. For the Jetty/jsp integration to find them, you need to configure a pattern that defines the names of files in the container's classpath that contain <tt>.tld</tt> files. You must define the pattern as a context attribute on each context that you deploy. The context attribute and pattern is: |
− | |||
attribute: org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern | attribute: org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern | ||
value: .*/.*jsp-api-[^/]*\.jar$|.*/.*jsp-[^/]*\.jar$|.*/.*taglibs[^/]*\.jar$ | value: .*/.*jsp-api-[^/]*\.jar$|.*/.*jsp-[^/]*\.jar$|.*/.*taglibs[^/]*\.jar$ | ||
− | If you are using the | + | If you are using the Jetty deployers (that is, your <tt>start.ini</tt> file contains <tt>etc/jetty-deploy.xml</tt>), you don't need to do anything, as the pattern is pre-defined in <tt>etc/jetty-deploy.xml</tt>, and the deployer makes sure the attribute is set on each and every context it deploys. If you are NOT using the deployers, you need to configure the attribute on *each* context you set. Here's an example: |
− | + | ||
− | If you | + | |
+ | <source lang = "XML"> | ||
<New class="org.eclipse.jetty.webapp.WebAppContext"> | <New class="org.eclipse.jetty.webapp.WebAppContext"> | ||
<Arg><Ref id="Contexts"/></Arg> | <Arg><Ref id="Contexts"/></Arg> | ||
Line 320: | Line 318: | ||
</Call> | </Call> | ||
</New> | </New> | ||
+ | </source> | ||
+ | |||
+ | ({note| You can use the <tt>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</tt> for more than identifying Jars that contain tlds. Its purpose is to supply a pattern of names of Jars on the container's classpath whose /META-INF directories should be scanned for resources, for fragments, or for tlds.}} | ||
− | + | ===Jetty 8.x=== | |
− | + | The version of jsp 2.2 engine that jetty uses employs a Servlet 3.0 way of finding tlds (see [http://download.oracle.com/javaee/6/api/javax/servlet/ServletContainerInitializer.html ServletContainerInitializer.html]) , and thus does ''not'' require that you define <tt>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</tt>. | |
− | The version of jsp 2.2 engine that | + | |
− | JSF Taglibs | + | ==Using JSF Taglibs== |
----------------- | ----------------- | ||
− | If you | + | If you want to use JSF with your webapp, you need to copy the <tt>jsf-impl.jar</tt> (or whichever Jar contains the <tt>META-INF/*.tld</tt> files from your chosen JSF implementation) into <tt>$JETTY_HOME/lib/jsp</tt>. This is because the version of the jsp engine from Glassfish that we are using ''requires'' that the JSF tags are on the container's classpath, and ''not'' on the webapp's classpath. |
Revision as of 16:32, 19 October 2011
Contents
Introduction
This page provides information about configuring JSP.
Compiling JSPs
To compile .jsp files into java classes, you need a Java compiler. You can acquire a Java compiler from the JVM if you are using a full JDK, or from a third party Jar.
In versions of Jetty prior to 7.5.0, the JSP infrastructure made use of the Eclipse Java Compiler (ecj.jar) which is supplied in $JETTY_HOME/lib/jsp. For jetty-7.5.0 we upgraded the version of JSP to jsp-impl-2.1.3.b10 (from Glassfish). In this version, the JSP infrastructure ALWAYS tries to acquire a Java compiler from the JVM if the version of Java is 1.6 or above. Therefore, if you are using a JRE, JSPs are unable to compile. We are waiting on the JSP project to back port a bug fix from jsp-2.2 that will allow us to force the JSP infrastructure to look beyond the JVM for a compiler. In the meanwhile, we have patched the JSP code and are waiting on Eclipse Orbit to make a release with those patched Jars. When the Jars have been patched, we will make a Jetty release containing them. In the interim, if using jetty-7.5.x, you must use a full JDK. Alternatively, you can precompile your JSPs (which is preferable in a production deployment in any case). The Jetty JSPC Maven Plugin is helpful for precompilation.
Note that for jetty-8.x.x, you can use either a full JDK or a JRE in combination with a third party Java compiler (such as ecj). In the latter case, you need to set a SystemProperty, either in your code or in a jetty config file. Here's the snippet that you can put into jetty.xml:
<Call class="java.lang.System" name="setProperty"> <Arg>org.apache.jasper.compiler.disablejsr199</Arg> <Arg>true</Arg> </Call>
Configuring JSP
The JSP engine has many configuration parameters. Some parameters affect only precompilation, and some affect runtime recompilation checking. Parameters also differ between the 2.0 and 2.1 release of the JSP engine. This page lists the configuration parameters, their meanings and their default settings.
Understanding JSP 2.1 Parameters
init param | Description | Default | webdefault.xml |
---|---|---|---|
development | If development=true, recompilation checks are made on each request. See also modificationTestInterval. | TRUE | - |
fork | Should Ant fork its java compiles of JSP pages? | TRUE | FALSE |
keepgenerated | Do you want to keep the generated Java files around? | FALSE | - |
saveByteCode | If class files are generated as byte arrays, should they be saved to disk at the end of compilations? | FALSE | - |
trimSpaces | Should white spaces between directives or actions be trimmed? | FALSE | - |
enablePooling | Determines whether tag handler pooling is enabled. | TRUE | - |
mappedFile | Support for mapped Files. Generates a servlet that has a print statement per line of the JSP file. | TRUE | - |
sendErrorToClient | If false, stack traces, etc., are sent to std error instead of the client's browser. | FALSE | - |
classdebuginfo | Include debugging info in class file. | TRUE | - |
checkInterval | Interval in seconds between background recompile checks. Only relevant if development=false. | 0 | - |
suppressSmap | Generation of SMAP info for JSR45 debugging. | FALSE | - |
dumpSmap | Dump SMAP JSR45 info to a file. | FALSE | - |
genStrAsCharArray | Option for generating Strings. | FALSE | - |
genStrAsByteArray | Option for generating Strings. | TRUE | - |
defaultBufferNone | FALSE | - | |
errorOnUseBeanInvalidClassAttribute | FALSE | - | |
scratchDir |
Directory where servlets are generated. Jetty sets this value according to the [/display/JETTY/Temporary+Directories work dir] settings for the webapp. |
- | - |
compiler | Determined at runtime. For Jetty this is the Eclipse jdt compiler. | ||
compilerTargetVM | Target vm to compile for. | 1.5 | - |
compilerSourceVM | Sets source compliance level for the jdt compiler. | 1.5 | - |
javaEncoding | Pass through the encoding to use for the compilation. | UTF8 | - |
modificationTestInterval | If development=true, interval between recompilation checks, triggered by a request. | 0 | - |
xpoweredBy | Generate an X-Powered-By response header. | FALSE | FALSE |
usePrecompiled/use-precompiled | FALSE | - | |
validating/enableTldValidation | Whether or not to validate tag files against the schema. | FALSE | |
reload-interval | If reload-interval=0, then no runtime checking of JSP, otherwise sets the checking interval for both development=true and development=false. | ||
initial-capacity/initialCapacity | The initial capacity of the hash maps mapping the name of the JSP to class and JSP file. |
Much confusion generally ensues about the development, checkInterval and modificationTestInterval parameters and JSP runtime recompilation. Here is a factoring out of the various options:
- Check the JSP files for possible recompilation on every request:
<init-param> <param-name>development></param-name> <param-value>true></param-value> </init-param>
- Only check approximately every N seconds, where a request will trigger the time-lapse calculation. This example checks every 60 seconds:
<init-param> <param-name>development></param-name> <param-value>true></param-value> </init-param> <init-param> <param-name>modificationTestInterval></param-name> <param-value>60></param-value> </init-param>
- Do no checking whatsoever, but still compile the JSP on the very first hit. (Note: this reload-interval parameter is shorthand for a development=false and checkInterval=0 combination):
<init-param> <param-name>reload-interval></param-name> <param-value>-1></param-value> </init-param>
- Don't do any request-time checking, but instead start a background thread to do checks every N seconds. (This example checks every 60 seconds):
<init-param> <param-name>development></param-name> <param-value>false></param-value> </init-param> <init-param> <param-name>checkInterval></param-name> <param-value>60></param-value> </init-param>
Modifying the Configuration
There are several options for modifying the Jasper JSP servlet configuration.
Overriding webdefault.xml
You can make a copy of the webdefault.xml shipped with Jetty, apply your changes, and use it instead of the shipped version. The example below shows how to do this when using the Jetty Maven plugin.
<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <webAppConfig> <defaultsDescriptor>src/main/resources/webdefault.xml</defaultsDescriptor> </webAppConfig> <connectors> ..
If you're using Jetty standalone, and you want to change the JSP settings for just one or a few of your webapps, then copy the $JETTY_HOME/etc/webdefault.xml file somewhere, modify it, and then use a context xml file to set this file as the webdefaults for your webapp. Here's a snippet:
<Configure class=>"org.eclipse.jetty.webapp.WebAppContext"> <Set name=>"contextPath">/foo</Set> <Set name=>"war"><SystemProperty name=>"jetty.home" >default=>"."/>/webapps/foobar.war</Set> <Set name=>"defaultsDescriptor">/home/smith/dev/webdefault.xml</Set> </Configure>
If you want to change the JSP settings for all of the webapps, then edit the $JETTY_HOME/etc/webdefaults.xml file directly instead.
Configuring the JSP Servlet in web.xml
Another option is to add an entry for the Jasper JSP servlet to the web.xml file of your webapp. You can use the entry in webdefault.xml as a starting point.
<servlet id=>"jsp"> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>logVerbosityLevel</param-name> <param-value>DEBUG</param-value> </init-param> <init-param> <param-name>fork</param-name> <param-value>>false</param-value> </init-param> <init-param> <param-name>keepgenerated</param-name> <param-value>>true</param-value> </init-param> ... <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspf</url-pattern> <url-pattern>*.jspx</url-pattern> <url-pattern>*.xsp</url-pattern> <url-pattern>*.JSP</url-pattern> <url-pattern>*.JSPF</url-pattern> <url-pattern>*.JSPX</url-pattern> <url-pattern>*.XSP</url-pattern> </servlet-mapping> <servlet id=>"my-servlet"> <servlet-name>myServlet</servlet-name> <servlet-class>com.acme.servlet.MyServlet</servlet-class> ...
Using JSTL Taglibs for Jetty 7.x and 8.x
Jetty 7.x
The JSTL tags are present in the org.apache.taglibs.standard.glassfish Jar in $JETTY_HOME/lib/jsp. For the Jetty/jsp integration to find them, you need to configure a pattern that defines the names of files in the container's classpath that contain .tld files. You must define the pattern as a context attribute on each context that you deploy. The context attribute and pattern is:
attribute: org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern value: .*/.*jsp-api-[^/]*\.jar$|.*/.*jsp-[^/]*\.jar$|.*/.*taglibs[^/]*\.jar$
If you are using the Jetty deployers (that is, your start.ini file contains etc/jetty-deploy.xml), you don't need to do anything, as the pattern is pre-defined in etc/jetty-deploy.xml, and the deployer makes sure the attribute is set on each and every context it deploys. If you are NOT using the deployers, you need to configure the attribute on *each* context you set. Here's an example:
<New class="org.eclipse.jetty.webapp.WebAppContext"> <Arg><Ref id="Contexts"/></Arg> <Arg><SystemProperty name="jetty.home" default="."/>/webapps/test.war</Arg> <Arg>/test</Arg> <Call name="setAttribute"> <Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg> <Arg>.*/.*jsp-api-[^/]*\.jar$|.*/.*jsp-[^/]*\.jar$|.*/.*taglibs[^/]*\.jar$</Arg> </Call> </New>
({note| You can use the org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern for more than identifying Jars that contain tlds. Its purpose is to supply a pattern of names of Jars on the container's classpath whose /META-INF directories should be scanned for resources, for fragments, or for tlds.}}
Jetty 8.x
The version of jsp 2.2 engine that jetty uses employs a Servlet 3.0 way of finding tlds (see ServletContainerInitializer.html) , and thus does not require that you define org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern.
Using JSF Taglibs
If you want to use JSF with your webapp, you need to copy the jsf-impl.jar (or whichever Jar contains the META-INF/*.tld files from your chosen JSF implementation) into $JETTY_HOME/lib/jsp. This is because the version of the jsp engine from Glassfish that we are using requires that the JSF tags are on the container's classpath, and not on the webapp's classpath.