Статические файлы в (Java) App Engine недоступны

В документации говорится, что вам просто нужно поместить свои файлы в war/(или подкаталог), и они должны быть доступны с хоста (если они не являются JSP или WEB-INF). Например, если вы помещаете foo.css в war/then, вы должны иметь доступ к нему по адресу http://localhost:8080/foo.css. Однако это не работает для меня вообще. НЕТ моих статических файлов.

В документах appengine-web.xml говорится, что вы также можете специально обозначать определенные типы как статические. Я тоже пробовал это, и это не имеет значения.

Я пропустил что-то очевидное?

UPDATE: Оказывается, одно из отображений в моем web.xml было слишком агрессивным. Следующим был виновник:

<servlet>
    <servlet-name>Main</servlet-name>
    <servlet-class>MainServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Main</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Кажется, что он захватывал все, что не было захвачено, одним из других правил, которое я не понимаю, потому что в конце URL-адреса не было *. Это также, по-видимому, прямо противоречит документации, которая гласит:

Примечание. Статические файлы, файлы, которые дословно переданы пользователям, например изображениям, CSS или JavaScript, обрабатываются отдельно от путей, упомянутых в дескрипторе развертывания. Запрос на путь URL, который соответствует пути к файлу в WAR, который считается статическим файлом, будет обслуживать файл, независимо от отображений сервлетов и фильтров в дескрипторе развертывания. Вы можете исключить файлы из тех, которые рассматриваются как статические файлы, используя файл appengine-web.xml.

Итак, как я могу получить правило, соответствующее базе моего домена (например, http://www.example.com/) и до сих пор разрешает статические файлы для фильтрации через?

Ответы

Ответ 1

Попробуйте вручную определить статические файлы в appengine-web.xml, например

<static-files>
  <include path="/favicon.ico" expiration="1d" />
  <include path="/static/**" />
  <include path="/**.css" />      
</static-files>

Это работает для меня даже с сервлетами, например

<servlet-mapping>
 <servlet-name>testServlet</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>

и

<servlet-mapping>
 <servlet-name>testServlet</servlet-name>
 <url-pattern>/*</url-pattern>
</servlet-mapping>

Смотрите Статические файлы и файлы ресурсов

Ответ 2

... Кажется, что он захватывал все, что не было захвачено, одним из других правил, чего я не понимаю, потому что на конце шаблона url не было *....

[[К сожалению, термин "сервлет по умолчанию" перегружен, чтобы означать разные вещи, что приводит к путанице. Я постараюсь быть ясным.]]

URL-шаблон "/" является специальным (Rogue Wave называет это "сопоставление по умолчанию" ). Это определяет приложение "сервлет по умолчанию" , который используется, когда запрос URL не соответствует другим шаблонам (SRV.11.2 bullet 3 и SRV 11.1 item # 4). По-видимому, "/" обрабатывается так, как если бы вы указали "/*".

... Это также кажется прямо противоречащим документации...

Согласен, я думаю, что у приложения есть ошибка, поэтому он не следит за документацией, которую вы указали. Вот моя теория о том, что происходит. Поскольку для вашего приложения есть сервлет по умолчанию (в результате определения сервлета для шаблона url//), приложение перестает использовать "по умолчанию" "сервлет по умолчанию" , предоставляемый контейнером для приложений, которые не определяют свой собственный "сервлет по умолчанию" ". Контейнер "по умолчанию" "сервлет по умолчанию" - это то, что обеспечивает поведение по умолчанию для обслуживания статических файлов. Я думаю, что это согласуется с тем, как ведут себя некоторые контейнеры.

Интересно, что произойдет, если вы попробуете указать сервлет для шаблона URL, который соответствует статическому файлу. Будет ли он служить файлу (как указано в документах) или вызвать сервлет (как указано в этой теории).

... Итак, как я могу получить правило, соответствующее базе моего домена (например, http://www.example.com/) и все еще позволяет фильтровать статические файлы?...

Если теория верна, решения, предоставляемые jacob (адаптированные для движка google app) и zockman, похоже, что они будут работать - они сопоставляют статические файлы с контейнером "по умолчанию" "сервлет по умолчанию" .

Единственная другая идея, которую я имею, заключается в том, чтобы написать приложение "сервлет по умолчанию" для проверки запроса, чтобы проверить, есть ли запрос для "/" или нет. Если да, обработайте его. Если нет, то (каким-то образом) вызовите контейнер "по умолчанию" "сервлет по умолчанию" для обработки запроса (который, надеюсь, будет кэшировать файл). Надеемся, что после того, как статический файл будет обслуживаться один раз, кеширование в будущем будет обходить сервлет (ы).

Извините, я не могу быть более конкретным или предоставлять код - я не работаю с движком Google (пока!).


Ref:

Ответ 3

Я понимаю, что это действительно старый вопрос, но я столкнулся с той же проблемой. Я поместил css/*.css, js/*.css и favicon.ico в /war/static/ и использовал директиву public_root в своем appengine-web.xml, чтобы указать на /static. Это отлично работало на моем локальном сервере-разработчике, но не при загрузке приложения. Избавиться от /static и перемещать все до уровня, который работал у меня.

SDK v1.5.2 (Java) на Mac OSX 10.6.8 с Java SE 6 (MacOS X по умолчанию)

Ответ 4

При использовании, например, tomcat для обслуживания статических файлов, необходимо указать такие шаблоны:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

Может быть, вы могли бы попытаться сделать то же самое?