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

时间:2010-11-08 20:10:10

标签: java google-app-engine freemarker web.xml

我正在努力让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.

感谢您的帮助。


另外一点信息是,如果我有一个<welcome-file>index.html,它就可以了。当我以任何顺序添加index.ftl时,就是我收到错误的时候。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我认为这里的问题与使用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。

我建议尝试使用相同的方法将操作设为欢迎页面。这对你的index.ftl有一个jsp fwd。

答案 1 :(得分:0)

我仍在寻找解决方案(虽然@Andy Pryor的答案可能最终是正确的)但我认为我已经注意到我已经采取了哪些措施来解决这个问题。

我最终将所有html文件移动到FreeMarker视图层次结构中,以便FreeMarker servlet处理所有HTML和FreeMarker文件。我不必支持*.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>