2010-11-08 46 views
3

我试图让freemarker在Google App引擎下工作。当直接请求时,我已经获得了简单的ftl模板文件,但是我希望index.ftl能够工作(如果可以的话),否则index.html - 反之亦然。freemarker无法在Google应用引擎上处理'/'的请求

  • 如果我要求/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> 

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

  • /指数。 html
  • /ftl/index.ftl
  • /WEB-INF/...

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

Problem accessing /index.ftl/index.ftl.

感谢您的帮助。信息


一个额外的一点是,如果我有一个index.html进入<welcome-file>,它工作正常。当我按照任意顺序添加index.ftl时,就是我收到错误的时候。

感谢您的任何帮助。

回答

2

我觉得这里的问题是非常相似使用struts action as a welcome page. 从这个问题

报价达B的回答的问题没有(比使用一个jsp重定向其他更好的办法)。 Servlet的规格 (Java Servlet规范2.4, “SRV.9.10欢迎文件”例如) 状态:

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

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

我建议尝试用于使操作成为欢迎页面的相同方法。其中有一个jsp fwd给你的index.ftl。

+0

谢谢安迪。但是为什么welcome-file index.html本身能够工作,但是当我添加第二个welcome-file条目时出现错误?我认为这是一个不同的问题,因为index.jsp在其他问题中工作正常。 – Gray 2010-11-09 01:21:25

+0

我越想它,也许它们是相关的。我仍然感到惊讶的是,通过添加第二个'welcome-file'条目来影响'index.html'的处理。 – Gray 2010-11-09 01:28:02

+0

我最好的猜测是,因为“index.ftl”文件不在根目录下,而是在ftl文件夹中。 – Andy 2010-11-09 15:53:24

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> 
相关问题