2

我在应用程序引擎上遇到了 servlet 映射问题。

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

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

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

*虽然我使用的是应用程序引擎,但我认为这与其他通过 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>
4

2 回答 2

1

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

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

来自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 中使用 RequestDispatcher 来转发 html 页面,请参阅http://www.jguru.com/faq/view.jsp?EID=1310997

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

于 2012-07-18T08:04:59.597 回答
0

静态文件,即逐字提供给用户的文件,例如图像、CSS 或 JavaScript,与部署描述符中提到的路径分开处理。对与 WAR中被视为静态文件的文件的路径匹配的 URL 路径请求将为该文件提供服务,而不管部署描述符中的 servlet 和过滤器映射如何。您可以使用 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 的另一个不一致之处。;)

于 2014-08-21T13:08:57.550 回答