Servlet映射在本地工作,但不适用于app引擎中的Web服务器

时间:2012-07-18 07:03:52

标签: java google-app-engine servlets redirect web.xml

我遇到了app引擎上的servlet映射问题。

详情
使用我的web.xml配置文件我将URL模式“/ i”映射到我的WAR路径的根目录上的重定向到info.html。

当我在本地运行并访问url localhost:8888 / i时,Web服务器正确地重定向到info.html站点。但当我推送到app引擎并尝试访问www.mysite.com/i时,我得到了404 错误:NOT_FOUND

问题
1.为什么我的服务器映射在本地但不是远程工作? 2.我是否有另一种方法可以将像www.mysite.com/i这样的网址模式映射到我的战争路径中的静态文件中?

*虽然我在app引擎上,但我认为这与其他通过web.xml使用servlet-mappings的Java服务器类似。我也知道映射到静态html文件可能看起来很奇怪,但目前我没有加载任何动态内容。

代码示例
下面我已经包含了我的web.xml文件的修剪版本以供参考。它隔离了我如何进行重定向。

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

    <servlet>
        <servlet-name>Info</servlet-name>
        <jsp-file>info.html</jsp-file>
    </servlet>

    <servlet-mapping>
        <servlet-name>Info</servlet-name>
        <url-pattern>/i</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

2 个答案:

答案 0 :(得分:1)

请记住,AE并不完全相同:

  

默认情况下,App Engine会将WAR中的所有文件作为静态文件提供   WEB-INF /中的JSP和文件除外的文件。对URL的任何请求   path匹配一个静态文件直接将文件提供给   浏览器 - 即使路径也匹配servlet或过滤器映射。您   可以配置App Engine将哪些文件视为静态文件   appengine-web.xml文件。

来自https://developers.google.com/appengine/docs/java/gettingstarted/staticfiles

配置appengine-web.xml的说明在https://developers.google.com/appengine/docs/java/config/appconfig

我会尝试明确声明:

<static-files>
    <include path="info.html" />
</static-files>

如果这不起作用,只会将我的.html页面改为jsp页面(即使没有动态内容)。

如果这不起作用,请尝试从servlet中转发html页面的RequestDispatcher,参见http://www.jguru.com/faq/view.jsp?EID=1310997

顺便说一句,我的经验是devmode服务器和部署的服务器有时会以不同的方式解析文件,即使appengine-web.xml是相同的。

答案 1 :(得分:0)

  

静态文件,逐字提供给用户的文件(如图像,CSS或JavaScript)与部署描述符中提到的路径分开处理。无论部署描述符中的servlet和过滤器映射,对URL路径的请求都与WAR 中被视为静态文件的文件的路径相匹配,该文件将为该文件提供服务。您可以使用appengine-web.xml文件从那些被视为静态文件的文件中排除文件。

也就是说,如果要将.html映射到URL,则必须确保它不是静态的;因为我们知道静态文件是为提供的,无论servlet和过滤器映射是什么

为此,您必须使用以下命令将其从静态文件中排除:

<static-files>
    <exclude path="/**.html"/>
</static-files>

这会使.html文件成为资源文件(默认情况下所有文件都是静态文件和资源文件;除了.jsp文件和web-inf文件夹中的文件)。

但遗憾的是,仍然不会让App Engine获取.html文件的URL映射(使用'jsp-file'定义)。很可能是因为servlet映射最终指向servlet,而为每个.jsp文件生成servlet,对于.html文件(或任何其他文件)也是如此。

我能想到的唯一解决方案是将.html文件重命名为.jsp(并删除静态文件排除;您不再需要它)。这样您就可以将其映射到任何URL。

有趣的是,您可以将非.jsp文件映射到开发服务器上的URL;只是与App Engine的另一个不一致。 ;)