users@glassfish.java.net

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

From: Owen Jacobson <owen.jacobson_at_grimoire.ca>
Date: Mon, 23 Aug 2010 19:02:39 -0400

It was my code.

I'd been working on several aspects of my app simultaneously, and mistakenly left a taglib declaration in one of my JSPs thus:

<%@ taglib uri="" prefix="c" %>

Note the blank URI: glassfish was attempting to resolve the taglib URI relative to the path to the JSP, finding a directory there, and giving up.

(No points for guessing which taglib I *meant* to declare.)

-o

On 2010-08-22, at 6:51 PM, Owen Jacobson wrote:

> 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
>