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.ftl 和 index.html 条目的顺序,对 / 的请求会给出以下 404 消息:
Problem accessing /index.ftl/index.ftl.
感谢您的帮助。
另外一点信息是,如果我有一个<welcome-file>
条目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客户端吗