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

发布于 2024-10-01 09:18:44 字数 2041 浏览 4 评论 0原文

我正在尝试让 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 消息:

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

感谢您的帮助。


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

感谢您的任何帮助。

I'm trying to get freemarker working under Google App Engine. I've gotten simple ftl template files working when requested directly however I'd like to have index.ftl work if available otherwise index.html -- or vice versa.

  • If I request /index.html, it renders fine as HTML.
  • If I request /index.ftl, it renders fine as a FreeMarker template. Variables are expanded.
  • If, however, I request '/' it gives the following 404 message:

    Problem accessing /index.html/index.ftl.

I have the following in my web.xml file:

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

I have the following in the war/ directory of my Eclipse GAE application:

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

If I switch the order of the index.ftl and index.html entries, a request for / gives the following 404 message:

Problem accessing /index.ftl/index.ftl.

Thanks for any help.


One additional bit of information is that if I have one <welcome-file> entry of index.html, it works fine. When I add the index.ftl, in any order, is when I get the errors.

Thanks for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

孤单情人 2024-10-08 09:18:44

我认为这里的问题与使用 struts action 作为欢迎页面。
引用 Damien B 在该问题中的回答

没有(除了使用 jsp 重定向之外的更好的方法)。小服务程序规范
(Java Servlet 规范 2.4,
例如“SRV.9.10 欢迎文件”)
状态:

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

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

我建议尝试使用与将操作设为欢迎页面相同的方法。其中有一个jsp转发到您的index.ftl。

I think the problem here is pretty similar the problem of using a struts action as a welcome page.
Quoting Damien B's answer from that question

There isn't ( a better way other than using a jsp redirect). Servlet specifications
(Java Servlet Specification 2.4,
"SRV.9.10 Welcome Files" for instance)
state:

The purpose of this mechanism is to
allow the deployer to specify an
ordered list of partial URIs for the
container to use for appending to URIs
when there is a request for a URI that
corresponds to a directory entry in
the WAR not mapped to a Web component.

Since it is mapped to directory entry and not a mapped web component, the "/" isn't forwarding to the freemarker servlet when index.ftl is the welcome file.

I suggest trying the same approach used to make actions a welcome page. Which is have a jsp fwd to your index.ftl.

小忆控 2024-10-08 09:18:44

我仍在寻找解决方案(尽管 @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>

I'm still looking for the solution to this (although @Andy Pryor's answer may be ultimately right) but I thought that I'd note what I've done to work around this issue.

I ended up moving all of my html files into the FreeMarker view hierarchy so that all HTML and FreeMarker files are processed by the FreeMarker servlet. I don't have to support *.ftl files since I will never be rendering them directly anyway. So the only files I have in my static hierarchy are images and the like.

This seems to be working well although I had to subclass the FreemarkerServlet to block the getSession() methods made on the request since my app does not have sessions enabled. Here's my web.xml file:

<?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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文