freemarker 无法处理谷歌应用引擎上的“/”请求

Posted

技术标签:

【中文标题】freemarker 无法处理谷歌应用引擎上的“/”请求【英文标题】:freemarker cannot handle request for '/' on google app engine 【发布时间】:2011-05-06 20:53:39 【问题描述】:

我正在尝试让 freemarker 在 Google App Engine 下工作。当直接请求时,我已经获得了简单的 ftl 模板文件,但是如果可用,我希望 index.ftl 工作,否则 index.html - 反之亦然。

如果我请求 /index.html,它会呈现为 HTML。 如果我请求/index.ftl,它会呈现为 FreeMarker 模板。变量已展开。 但是,如果我请求“/”,它会给出以下 404 消息:

访问 /index.html/index.ftl 时出现问题。

我的 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">
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.ftl</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>file://ftl</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>
</web-app>

我的 Eclipse GAE 应用程序的 war/ 目录中有以下内容:

/index.html /ftl/index.ftl /WEB-INF/...

如果我切换 index.ftl 和 index.html 条目的顺序,对 / 的请求会给出以下 404 消息:

Problem accessing /index.ftl/index.ftl.

感谢您的帮助。


另外一点信息是,如果我有一个&lt;welcome-file&gt; 条目index.html,它工作正常。当我以任何顺序添加index.ftl 时,就会出现错误。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

我认为这里的问题与使用struts action as a welcome page. 的问题非常相似 引用 Damien B 对该问题的回答

没有(比使用 jsp 重定向更好的方法)。 Servlet 规范 (Java Servlet 规范 2.4, 例如“SRV.9.10 欢迎文件”) 状态:

这种机制的目的是 允许部署者指定一个 的部分 URI 的有序列表 用于附加到 URI 的容器 当有对 URI 的请求时 对应于目录条目 WAR 未映射到 Web 组件。

由于它映射到目录条目而不是映射的 Web 组件,因此当 index.ftl 是欢迎文件时,“/”不会转发到 freemarker servlet。

我建议尝试使用与使操作成为欢迎页面相同的方法。哪个有一个 jsp fwd 到您的 index.ftl。

【讨论】:

谢谢安迪。但是为什么welcome-file index.html 自己工作,但是当我添加第二个welcome-file 条目时出现错误?我认为这是一个不同的问题,因为 index.jsp 在其他问题中运行良好。 我想得越多,也许它们是相关的。令我惊讶的是,index.html 处理受到添加第二个 welcome-file 条目的影响。 我最好的猜测是,因为“index.ftl”文件不在根目录,而是在 ftl 文件夹中。【参考方案2】:

我仍在寻找解决方案(尽管@Andy Pryor 的回答最终可能是正确的),但我想我会记下我为解决此问题所做的工作。

我最终将我的所有 html 文件移动到 FreeMarker 视图层次结构中,以便所有 HTML 和 FreeMarker 文件都由 FreeMarker servlet 处理。我不必支持*.ftl 文件,因为无论如何我都不会直接渲染它们。所以我的静态层次结构中唯一的文件是图像等。

这似乎运行良好,尽管我必须对 FreemarkerServlet 进行子类化以阻止对请求发出的 getSession() 方法,因为我的应用程序没有启用会话。这是我的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">

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>file://views</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
</web-app>

【讨论】:

以上是关于freemarker 无法处理谷歌应用引擎上的“/”请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 freemarker(或任何其他模板引擎)处理多个嵌套模板

谷歌应用引擎上的xmpp可以将消息推送到javascript客户端吗

文件无法访问,无法在谷歌应用引擎上导入库

使用python的谷歌应用引擎上的xmpp错误

Google Apps 域上的 Google App Engine

谷歌应用引擎上的 mimetypes.mime_guess() 行为奇怪