【问题标题】:Servlet mapping works locally but not on webserver in app engineServlet 映射在本地工作,但不在应用引擎中的网络服务器上工作
【发布时间】:2012-07-18 07:03:51
【问题描述】:

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

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

当我在本地运行它并访问 url localhost:8888/i 时,Web 服务器会正​​确重定向到 info.html 站点。但是当我推送到应用引擎并尝试访问 www.mysite.com/i 时,我收到 404 Error: 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>

【问题讨论】:

  • 您在本地使用的 Web 服务器是什么,您做了哪些更改以便 ocalhost:8888/i 重定向到正确的 jsp(除了 web.xml 中的更改)?

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


【解决方案1】:

记住AE并不完全相同:

默认情况下,App Engine 将 WAR 中的所有文件作为静态文件提供 除了 JSP 和 WEB-INF/ 中的文件之外的文件。对一个 URL 的任何请求 路径匹配一个静态文件,将文件直接提供给 浏览器——即使路径也匹配 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 中使用 RequestDispatcher 来转发 html 页面,请参阅 http://www.jguru.com/faq/view.jsp?EID=1310997

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

【讨论】:

    【解决方案2】:

    静态文件,即逐字提供给用户的文件,例如图像、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 的另一个不一致之处。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 2013-01-14
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多