Freemarker не может обработать запрос на «/» в движке приложения Google

Я пытаюсь заставить freemarker работать под Google App Engine. Я получил простые файлы шаблонов ftl, работающие по запросу напрямую, однако я хотел бы, чтобы index.ftl работал, если он доступен, в противном случае index.html - или наоборот.

  • Если я запрошу /index.html, он отлично отобразится как HTML.
  • Если я запрошу /index.ftl, он отлично отобразится как шаблон FreeMarker. Переменные расширяются.
  • 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>

У меня есть следующее в каталоге war/ моего приложения Eclipse GAE:

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

Если я поменяю порядок записей index.ftl и index.html, запрос / даст следующее сообщение 404:

Problem accessing /index.ftl/index.ftl.

Спасибо за любую помощь.


Еще одна дополнительная информация заключается в том, что если у меня есть одна запись <welcome-file> из index.html, она работает нормально. Когда я добавляю index.ftl в любом порядке, я получаю ошибки.

Спасибо за любую помощь.


person Gray    schedule 08.11.2010    source источник


Ответы (2)


Я думаю, что проблема здесь очень похожа на проблему использования выставляет действие как страницу приветствия. Цитируя ответ Дэмиена Б. на этот вопрос

Нет (лучший способ, кроме использования перенаправления jsp). Спецификации сервлета (например, Спецификация сервлета Java 2.4, «Файлы приветствия SRV.9.10») гласят:

Цель этого механизма — позволить установщику указать упорядоченный список частичных URI, которые контейнер будет использовать для добавления к URI, когда есть запрос на URI, который соответствует записи каталога в WAR, не сопоставленной с веб-компонентом. .

Поскольку он сопоставлен с записью каталога, а не сопоставленным веб-компонентом, «/» не перенаправляется на сервлет freemarker, когда index.ftl является файлом приветствия.

Я предлагаю попробовать тот же подход, который использовался, чтобы сделать действия страницей приветствия. У которого есть jsp fwd для вашего index.ftl.

person Andy    schedule 09.11.2010
comment
Спасибо, Энди. Но почему файл приветствия index.html работает сам по себе, но я получаю сообщение об ошибке, когда добавляю вторую запись в файле приветствия? Я думаю, что это другая проблема, поскольку index.jsp отлично работает в этом другом вопросе. - person Gray; 09.11.2010
comment
Чем больше я думаю об этом, может быть, они связаны. Что меня до сих пор удивляет, так это то, что на обработку index.html влияет добавление второй записи welcome-file. - person Gray; 09.11.2010
comment
Мое лучшее предположение состоит в том, что файл index.ftl находится не в корневом каталоге, а в папке ftl. - person Andy; 09.11.2010

Я все еще ищу решение этой проблемы (хотя ответ @Andy Pryor может быть в конечном счете правильным), но я подумал, что отмечу, что я сделал, чтобы обойти эту проблему.

В итоге я переместил все свои HTML-файлы в иерархию представлений FreeMarker, чтобы все HTML-файлы и файлы FreeMarker обрабатывались сервлетом 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>
person Gray    schedule 09.11.2010