当前位置: 首页 > 知识库问答 >
问题:

获取IllegalStateException:在将已部署的java应用程序访问到Google App Engine时没有这样的servlet:jsp

彭风华
2023-03-14

我有这样的问题(这一个),与应用程序引擎。

我刚刚开始尝试用eclipse插件将java应用程序部署到应用程序引擎,在localhost(使用tomcat服务器和应用程序引擎标准localhost)上测试了至少100次之后,它在本地运行良好。

但是当我将其部署为应用引擎标准时,我在尝试访问任何servlet时遇到了这个错误:

andler.doIllegalStateException:没有这样的servlet: jsp atandler.java:361ServletHorg.eclipse.jetty.security.映射(ServletHandler.do)atandler.java:448ServletHorg.eclipse.jetty.util.component.Start(ServletHycle.start)atycle.java:68AbstractLifeCorg.eclipse.jetty.util.component.(AbstractLifeCycle.start)atycle.java:131ContainerLifeCorg.eclipse.jetty.util.component.(ContainerLifeCycle.java:131)atorg.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:105)atorg.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)atorg.eclipse.jetty.security.SecurityHjava.lang.Start(SecurityHorg.eclipse.jetty.servlet.)atandler.updateConstraintSecurityHandler.java:1535Start(ConstraintSecurityHorg.eclipse.jetty.servlet.)atandler.doAbstractLifeCandler.java:157(AbstractLifeCorg.eclipse.jetty.util.component.)atycle.startContainerLifeCycle.java:68(ContainerLifeCorg.eclipse.jetty.util.component.)atycle.startContainerLifeC开始(ContainerLifeCycle. java: 105)at org. eclipse. jetty. server. handler. AbstractHandler. doStart(AbstractHandler. java: 61)at org. ecContextHandler. doStart(ContextHandler. java: 778)在org. eclipse. jetty. servlet。ServletContextHandler. doStart(ServletContextHandler. java: 262)在org. eclipse. jetty. webapp。WebAppContext. doStart(WebAppContext. java: 522)在org. eclipse. jetty. util。AbstractLifeCycle. start(AbstractLifeCycle. java: 68)在com. google. apphosting. runtime. jetty9。AppVersionHandlerMap. createHandler(AppVersionHandlerMap. java: 244)在com. google. apphosting. runtime. jetty9。AppVersionHandlerMap. getHandler(AppVersionHandlerMap. java: 182)在com. google. apphosting. runtime. jetty9。JettyServletEngineering Adap

我可以访问其他文件、图像、*. html。

我不知道这是否重要,我注意到应用程序引擎在我的网页上。xml文件是通过为我所有的*添加servlet和servelt映射(我认为映射到云存储)来修改的。jsp文件,但不在localhost中。

日志中的某处详细说明了“此请求导致您的应用程序启动新进程,从而导致您的应用程序代码首次加载。因此,与您应用程序的典型请求相比,此请求可能需要更长的时间并使用更多的CPU。”,我不知道这是否与我的试用帐户相关联。

我正在使用datanucleus(datanucleus-api-jdo-5.1.0-release)libs,我的网站上有一些过滤器、索引文件和错误页面jsp。xml也是。

Eclipse项目方面:
App引擎标准环境:JRE8
Servlet API:2.5
JAVA:1.8
JPA:1.0

我真的需要帮助,谢谢。

appengine-web.xml文件:

<?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文件:

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

共有2个答案

叶晋
2023-03-14

尽管上述问题在新的基于Java8的GAE中仍有待解决,但有一个适当的解决方案,它不需要在所有目标jsp文件上手动应用include标记。问题的真正原因是远程GAE无法将jspservlet规范映射到Google cloud runtime for Java上的实际servlet类。

简而言之,有两种解决方案(我推荐选项B):

选项A(快捷方式解决方案):

1...为您的servlet提供带注释的名称jsp

@WebServlet(
    name = "jsp",
    urlPatterns = {"/hello", "/"}
)
public class HelloAppEngine extends HttpServlet {

2.然后在你的网站上。xml您可以自由应用jsp配置规则。

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

这种方法的问题是(尽管它适用于远程GAE)在本地运行时会崩溃(由于本地jspservlet类冲突),因此您可能无法在本地检查开发。要避免选项Ajsphack和冲突,请使用选项B中的以下步骤。

备选方案B(适当的解决方案):

1...假设您正在使用maven构建,请将以下依赖项添加到您的pom.xml

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>apache-jsp</artifactId>
    <version>9.4.8.v20171121</version>
</dependency>

2.然后在你的网站上。xml添加以下配置。

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

3...而且还在web.xml内你可以自由应用你的jsp-config规则。

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

希望这能解决你的问题。编码愉快:)

闻人仲渊
2023-03-14

对不起,我没有看到你的更新。我在你的web.xml中注意到你有一个jsp-config部分引用了一个*. jspURL模式,但是你的servlet映射都没有jsp后缀。

<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预编译JSP作为部署过程的一部分,所以我不确定这种类型的处理是否有效。您是否可以尝试在JSP中内联对taglibs.jsp的引用?您应该能够执行以下操作:

<%@ include file="/WEB-INF/taglibs.jsp" %> 

更新:我遇到了一位Google工程师的帖子,宣布

 类似资料:
  • 我一直试图在Google App Engine应用程序上部署Spring MVCJavaWeb应用程序,但一直没有成功。我正在使用App EngineJavaSDK从我的机器上部署它。当我执行部署时,我可以通过URL访问资源(例如图像、js等)。但是当我尝试访问主页时,我得到了一个带有500状态码的响应,服务器上的错误如下: 我试图查找“No-such-servlet:jsp”错误,但没有找到任何

  • 我创建了一个JavaFX Maven应用程序,其中包含一些资源文件(在项目文件夹“src/main/resources”中)。该应用程序在NetBeans环境下运行良好。然而,当构建了自包含的JAR文件并将其复制到另一个文件夹时,应用程序的可视项(组合框、TextFields、VBoxes、...)没有正确显示(不同的颜色、错误的填充、...)。 CSS文件存在于JAR文件中,因为应用程序中(Ne

  • 我有一个web应用程序,我一直在工作。我最近不得不重新映像我的计算机,我安装了与我的计算机以前运行的映像完全相同的映像,但是web应用程序不会通过Apache Netbeans 11.1部署在Tomcat9.0服务器上。 我安装的Apache Tomcat9.0、MySQL8.0和Apache Netbeans IDE11.1版本与上一个映像中使用的版本完全相同。我已经设置了与Web服务器和MyS

  • 我正在同时试验Spring boot和openshift,不幸的是,我遇到了一个我无法找到的问题。 我用Spring启动的初始值设定项创建了一个应用程序。创建了几个Rest控制器(你好,世界喜欢) 这是我的应用程序(主) 我可以在本地启动应用程序(通过智能和冬虫)。我可以看到应用程序日志记录并访问所有endpoint,没有任何问题。 pom.xml是这样的: 因此,根据我的理解,WAR文件是根据O

  • 错误如下: 完整的控制台日志如下: null 如果有任何其他论坛我可以问这个问题,请分享评论部分的链接。提前谢谢。

  • 问题内容: 有没有像spring这样的android应用程序框架? 问题答案: 查看roboguice:http : //code.google.com/p/roboguice/ 顺便说一句,没有什么可以阻止您使用spring-因为这是纯java框架。但是它很重,可能出于您的目的而过度使用。 问题是-您想注入什么依赖关系?