users@glassfish.java.net

Glassfish 3.0.1, WEB-INF, JSPs, and a mystery

From: Owen Jacobson <owen.jacobson_at_grimoire.ca>
Date: Sun, 22 Aug 2010 18:51:48 -0400

Hi there,

I have the following deployment structure:

grimoire-1.0-SNAPSHOT.ear
 \_ account-1.0-SNAPSHOT.ear (context root: account)
    \_ WEB-INF/jsp/signup.jsp

account.war also contains a Jersey app, which handles the URL <context>/signup and forwards (via a Jersey Viewable) to /WEB-INF/jsp/signup.jsp. Under Jetty (without the EAR, obviously), this works; under Glassfish, the attempt to forward to the JSP fails with

org.apache.jasper.JasperException: /WEB-INF/jsp/signup.jsp(1,30) PWC6117: File "/WEB-INF/jsp/" not found
I can see WEB-INF/jsp/ and its contents in Glassfish's domain/applications/ directory.

This appears to be independent of whether I deploy the webapp on its own or from inside my EAR file.

In the stack trace, I can see that Jersey is dispatching to the JSP using something like
        request.getRequestDispatcher("/WEB-INF/jsp/signup.jsp").forward(request, response);

I'm used to placing JSPs that should not be served directly to users under WEB-INF (where they're not part of the webapp's URL space); however, I'm also used to containers allowing forwards to JSPs under WEB-INF. What's going on here? Are my expectations wrong (or at least container-dependent), or is Glassfish doing the wrong thing somewhere?

-o

Relevant (I hope) logs & code:

$ jar tf grimoire-1.0-SNAPSHOT.ear
META-INF/
META-INF/MANIFEST.MF
account-1.0-SNAPSHOT.war
META-INF/application.xml
root-1.0-SNAPSHOT.war

$ cat application.xml
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" version="6">
  <display-name>grimoire</display-name>
  <module>
    <web>
      <web-uri>root-1.0-SNAPSHOT.war</web-uri>
      <context-root>/</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>account-1.0-SNAPSHOT.war</web-uri>
      <context-root>/account</context-root>
    </web>
  </module>
</application>

Envy:target owen$ jar tf account-1.0-SNAPSHOT.war
META-INF/
META-INF/MANIFEST.MF
WEB-INF/
WEB-INF/classes/
WEB-INF/classes/ca/
WEB-INF/classes/ca/grimoire/
WEB-INF/classes/ca/grimoire/account/
WEB-INF/classes/ca/grimoire/account/web/
WEB-INF/jsp/
WEB-INF/lib/
account-ui.js
signup-page-scripts.js
signup.css
WEB-INF/classes/ca/grimoire/account/web/Signup.class
WEB-INF/jsp/signup.jsp
WEB-INF/lib/asm-3.1.jar
WEB-INF/lib/jersey-core-1.1.5.jar
WEB-INF/lib/jersey-server-1.1.5.jar
WEB-INF/lib/jsr311-api-1.1.1.jar
WEB-INF/web.xml

$ cat web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee
            http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <!-- Inter-app glue parameters -->
    <context-param>
        <param-name>root-module-url</param-name>
        <param-value>..</param-value>
    </context-param>

    <jsp-config>
        <jsp-property-group>
            <url-pattern>/*</url-pattern>
            <page-encoding>UTF-8</page-encoding>
            <default-content-type>text/html; charset=UTF-8</default-content-type>
        </jsp-property-group>
    </jsp-config>

    <filter>
        <filter-name>ca.grimoire.account.jersey</filter-name>
        <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>ca.grimoire.account.web</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
            <param-value>/WEB-INF/jsp</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>ca.grimoire.account.jersey</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

$ bin/asadmin deploy ~/Development/grimoire/grimoire/target/grimoire-1.0-SNAPSHOT.ear
Application deployed successfully with name grimoire-1.0-SNAPSHOT.

$ find domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/account-ui.js
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/META-INF
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/META-INF/MANIFEST.MF
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/signup-page-scripts.js
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/signup.css
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/classes
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/classes/ca
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/classes/ca/grimoire
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/classes/ca/grimoire/account
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/classes/ca/grimoire/account/web
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/classes/ca/grimoire/account/web/Signup.class
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/jsp
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/jsp/signup.jsp
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/lib
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/lib/asm-3.1.jar
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/lib/jersey-core-1.1.5.jar
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/lib/jersey-server-1.1.5.jar
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/lib/jsr311-api-1.1.1.jar
domain1/applications/grimoire-1.0-SNAPSHOT/account-1.0-SNAPSHOT_war/WEB-INF/web.xml