Reputation: 3
I have this kind of problem (this one), with app engine.
I just get started and trying to deploy my java app to App engine with eclipse plugin, after testing it at least 100 times at localhost (with tomcat-server and App engine standard localhost), it works fine in local.
But when I deploy it as app engine standard, I got this error when I'm trying to access any servlet:
java.lang.IllegalStateException: No such servlet: jsp at org.eclipse.jetty.servlet.ServletHandler.updateMappings (ServletHandler.java:1535) at org.eclipse.jetty.servlet.ServletHandler.doStart (ServletHandler.java:157) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at org.eclipse.jetty.util.component.ContainerLifeCycle.start (ContainerLifeCycle.java:131) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart (ContainerLifeCycle.java:105) at org.eclipse.jetty.server.handler.AbstractHandler.doStart (AbstractHandler.java:61) at org.eclipse.jetty.security.SecurityHandler.doStart (SecurityHandler.java:361) at org.eclipse.jetty.security.ConstraintSecurityHandler.doStart (ConstraintSecurityHandler.java:448) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at org.eclipse.jetty.util.component.ContainerLifeCycle.start (ContainerLifeCycle.java:131) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart (ContainerLifeCycle.java:105) at org.eclipse.jetty.server.handler.AbstractHandler.doStart (AbstractHandler.java:61) at org.eclipse.jetty.server.handler.ScopedHandler.doStart (ScopedHandler.java:120) at org.eclipse.jetty.server.session.SessionHandler.doStart (SessionHandler.java:116) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at org.eclipse.jetty.util.component.ContainerLifeCycle.start (ContainerLifeCycle.java:131) at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart (ContainerLifeCycle.java:105) at org.eclipse.jetty.server.handler.AbstractHandler.doStart (AbstractHandler.java:61) at org.eclipse.jetty.server.handler.ScopedHandler.doStart (ScopedHandler.java:120) at org.eclipse.jetty.server.handler.ContextHandler.startContext (ContextHandler.java:809) at org.eclipse.jetty.servlet.ServletContextHandler.startContext (ServletContextHandler.java:345) at org.eclipse.jetty.webapp.WebAppContext.startWebapp (WebAppContext.java:1406) at org.eclipse.jetty.webapp.WebAppContext.startContext (WebAppContext.java:1368) at org.eclipse.jetty.server.handler.ContextHandler.doStart (ContextHandler.java:778) at org.eclipse.jetty.servlet.ServletContextHandler.doStart (ServletContextHandler.java:262) at org.eclipse.jetty.webapp.WebAppContext.doStart (WebAppContext.java:522) at org.eclipse.jetty.util.component.AbstractLifeCycle.start (AbstractLifeCycle.java:68) at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.createHandler (AppVersionHandlerMap.java:244) at com.google.apphosting.runtime.jetty9.AppVersionHandlerMap.getHandler (AppVersionHandlerMap.java:182) at com.google.apphosting.runtime.jetty9.JettyServletEngineAdapter.serviceRequest (JettyServletEngineAdapter.java:97) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest (JavaRuntime.java:680) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest (JavaRuntime.java:642) at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run (JavaRuntime.java:612) at com.google.apphosting.runtime.JavaRuntime$NullSandboxRequestRunnable.run (JavaRuntime.java:806) at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run (ThreadGroupPool.java:274) at java.lang.Thread.run (Thread.java:745)
I can access to other files, images, *.html.
I don't know if its important, I noticed that in app engine my web.xml file is modified by adding servlet and servelt-mapping (mapping to cloud storage I think) for all of my *.jsp files , but not in localhost.
And somewhere in the log details "This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.", I don't know if is that linked to my trial account.
I am using datanucleus (datanucleus-api-jdo-5.1.0-release) libs, I have some filters, index file and error-page jsp in my web.xml too.
Eclipse project facets :
App engine standard envirement : JRE8
Servlet API : 2.5
JAVA : 1.8
JPA : 1.0
I really need help, thanks.
appengine-web.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<threadsafe>true</threadsafe>
<sessions-enabled>true</sessions-enabled>
<runtime>java8</runtime>
</appengine-web-app>
web.xml file :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>my_project</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- SERVLETS DEFs -->
<servlet>
<servlet-name>Welcome</servlet-name>
<servlet-class>my_root_package.servlets.controllers.Welcome</servlet-class>
</servlet>
<servlet>
<servlet-name>Statistic</servlet-name>
<servlet-class>my_root_package.servlets.controllers.Statistic</servlet-class>
</servlet>
<servlet>
<servlet-name>Genea_Tree</servlet-name>
<servlet-class>my_root_package.servlets.controllers.Genea_Tree</servlet-class>
</servlet>
<servlet>
<servlet-name>Genea_TreeEdit</servlet-name>
<servlet-class>my_root_package.servlets.controllers.Genea_TreeEdit</servlet-class>
</servlet>
<servlet>
<servlet-name>New_event</servlet-name>
<servlet-class>my_root_package.servlets.controllers.New_event</servlet-class>
</servlet>
<servlet>
<servlet-name>Inscription</servlet-name>
<servlet-class>my_root_package.servlets.controllers.Inscription</servlet-class>
</servlet>
<servlet>
<servlet-name>InscriptionStep1</servlet-name>
<servlet-class>my_root_package.servlets.controllers.InscriptionStep1</servlet-class>
</servlet>
<servlet>
<servlet-name>InscriptionStep2</servlet-name>
<servlet-class>my_root_package.servlets.controllers.InscriptionStep2</servlet-class>
</servlet>
<servlet>
<servlet-name>InscriptionConfirm</servlet-name>
<servlet-class>my_root_package.servlets.controllers.InscriptionConfirm</servlet-class>
</servlet>
<servlet>
<servlet-name>About</servlet-name>
<servlet-class>my_root_package.servlets.controllers.About</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminDashboard</servlet-name>
<servlet-class>my_root_package.servlets.controllers.AdminDashboard</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminAuthentification</servlet-name>
<servlet-class>my_root_package.servlets.secutity.controllers.AdminAuthentification</servlet-class>
</servlet>
<servlet>
<servlet-name>AdminPassReset</servlet-name>
<servlet-class>my_root_package.servlets.secutity.controllers.AdminPassReset</servlet-class>
</servlet>
<servlet>
<servlet-name>Search</servlet-name>
<servlet-class>my_root_package.servlets.controllers.Search</servlet-class>
</servlet>
<!-- SERVLETS MAPPING -->
<servlet-mapping>
<servlet-name>Welcome</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Statistic</servlet-name>
<url-pattern>/statistic</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Genea_Tree</servlet-name>
<url-pattern>/genea_tree</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Genea_TreeEdit</servlet-name>
<url-pattern>/genea_tree/DetailEdit</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Genea_TreeEdit</servlet-name>
<url-pattern>/genea_tree/DetailEditMore</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>New_event</servlet-name>
<url-pattern>/new_event</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Inscription</servlet-name>
<url-pattern>/inscription</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>InscriptionStep1</servlet-name>
<url-pattern>/inscription/step1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>InscriptionStep2</servlet-name>
<url-pattern>/inscription/step2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>InscriptionConfirm</servlet-name>
<url-pattern>/inscription/Confirmation</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>About</servlet-name>
<url-pattern>/about</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminAuthentification</servlet-name>
<url-pattern>/admin/Authentification</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminPassReset</servlet-name>
<url-pattern>/admin/PassReset</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin/dashboard</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin/dashboard/insertionCommit</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin/dashboard/updateCommit</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin/dashboard/deleteCommit</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin/InsertionCommitPost</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin/updateCommitPost</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AdminDashboard</servlet-name>
<url-pattern>/admin/deleteCommitPost</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Search</servlet-name>
<url-pattern>/AdvancedSearch</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Search</servlet-name>
<url-pattern>/search</url-pattern>
</servlet-mapping>
<!-- ERROR PAGES -->
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/errorManagement.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/404ErrorManagement.jsp</location>
</error-page>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
<include-prelude>/WEB-INF/taglibs.jsp</include-prelude>
</jsp-property-group>
</jsp-config>
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>my_root_package.filters.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!-- FILTERS DEFs -->
<filter>
<filter-name>multipartFilter</filter-name>
<filter-class>my_root_package.filters.MultipartFilter</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>360000</param-value>
</init-param>
</filter>
<!-- FILTERS MAPPING -->
<filter-mapping>
<filter-name>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>multipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Upvotes: 0
Views: 1561
Reputation: 11
Although the aforementioned issue is still yet to be resolved in the new Java 8 based GAE, there is an adequate solution which does not involve manually applying the include tag on all target jsp files.
The real cause of the problem is that the remote GAE is unable to map the jsp
servlet specification to an actual servlet class on Google cloud runtime for Java.
In a nutshell, there are two solution options (I recommend OPTION B):
OPTION A (shortcut solution):
1..Give your servlet the annotated name jsp
.
@WebServlet(
name = "jsp",
urlPatterns = {"/hello", "/"}
)
public class HelloAppEngine extends HttpServlet {
2..Then in your web.xml
you can freely apply your jsp-config
rules.
...
<jsp-config>
<jsp-property-group>
<description>JSP configuration for the open app</description>
<url-pattern>/WEB-INF/*</url-pattern>
<include-prelude>/WEB-INF/header.jspf</include-prelude>
<include-coda>/WEB-INF/footer.jspf</include-coda>
</jsp-property-group>
</jsp-config>
...
The issue with this approach is that (although it works for remote GAE) on local runtime it will crash (due to local jsp
servlet class conflict), so you may not be able to check development locally. To avoid the OPTION A jsp
hack and conflicts use the steps below in OPTION B.
OPTION B (adequate solution):
1..Assuming you are building with maven, add the following dependency to your pom.xml
.
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>9.4.8.v20171121</version>
</dependency>
2..Then in your web.xml
add the following config.
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
3..And also within web.xml
you can freely apply your jsp-config
rules.
...
<jsp-config>
<jsp-property-group>
<description>JSP configuration for the open app</description>
<url-pattern>/WEB-INF/*</url-pattern>
<include-prelude>/WEB-INF/header.jspf</include-prelude>
<include-coda>/WEB-INF/footer.jspf</include-coda>
</jsp-property-group>
</jsp-config>
...
Hope this solves your issue. Happy coding :)
Upvotes: 1
Reputation: 2964
Sorry, I didn't see your update. I noticed in your web.xml that you have a jsp-config
section that references a *.jsp
URL pattern, but none of your servlet mappings have a jsp
suffix.
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
<include-prelude>/WEB-INF/taglibs.jsp</include-prelude>
</jsp-property-group>
</jsp-config>
GAE pre-compiles JSPs as part of the deployment process, so I'm not sure this type of processing will work. Could you try inlining the reference to taglibs.jsp
within your JSPs instead? You should be able to do something like:
<%@ include file="/WEB-INF/taglibs.jsp" %>
Update: I came across a post from a Google engineer announcing that <jsp-config>
options like you have should work. If the inclusion works, then it would be best to open a bug on the issue tracker.
Upvotes: 1