Подавайте статические файлы (JavaScript) с помощью Struts 2

Я хочу поместить несколько файлов JavaScript в один из своих пакетов и заставить Struts обслуживать их как /struts/js/foo.js

Struts делает это для файлов в пакете «template» (именно там находятся файлы плагина jQuery, защищенные опцией struts.ui.templateDir). Однако я хочу поместить эти файлы в другой пакет; Если я переопределю struts.ui.templateDir, то struts перестанет работать, потому что не сможет найти свои шаблоны.

Итак, вопрос: как указать Struts обслуживать файлы в org.foo.some.package.js как /struts/js/whatever.js?


person alamar    schedule 28.10.2010    source источник
comment
Вы видели эту ссылку: struts.apache.org/development/ 2.x/docs/static-content.html?   -  person Aleksandr M    schedule 04.12.2013
comment
@AleksandrM хорошо, не знал этого. Вы хороший кандидат на награду, если хотите написать полный ответ.   -  person alamar    schedule 05.12.2013
comment
почему бы не использовать для этого какой-нибудь веб-сервер? скажем, Apache или nigix, что намного лучше и эффективнее для обслуживания статического содержимого.   -  person Umesh Awasthi    schedule 08.12.2013
comment
@UmeshAwasthi нет, если вы хотите обслуживать контент из файлов .jar, что удобно для внутренних страниц администрирования.   -  person alamar    schedule 12.12.2013


Ответы (2)


Struts2 может обслуживать статическое содержимое без дополнительной настройки. По умолчанию статический контент обслуживается DefaultStaticContentLoader реализацией StaticContentLoader. Он автоматически ищет следующие пакеты:

  • org.apache.struts2.static
  • шаблон
  • статический
  • org.apache.struts2.interceptor.debugging

Вы можете добавить дополнительные пакеты для поиска в параметре инициализации фильтра с именем «packages».

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    </filter-class>
    <init-param>
        <param-name>packages</param-name>
        <param-value>some.package another.one</param-value>
    </init-param>
</filter>

Вы можете добавить более одного пакета, использовать запятую, пробел, табуляцию или новую строку в качестве разделителя.

Кстати, вы можете контролировать, кэшируется ли статический контент браузером или нет, с помощью этой константы:

struts.serve.static.browserCache
person Aleksandr M    schedule 05.12.2013
comment
Как им удалось назвать пакеты статическими? Это зарезервированное слово :-/ - person alamar; 05.12.2013
comment
@alamar: Ну, в конце концов, это для статических ресурсов. Так что в нем нет исходных файлов. - person Aleksandr M; 05.12.2013
comment
@alamar Это не простое слово static (и оно не относится к имени метода или поля). Существуют и другие исключения для зарезервированных слов, например, у вас может быть String staticWord = "Hello";. - person Elliott Frisch; 08.12.2013

Один из способов - расширить весь шаблон и изменить templateDir, как вы уже предлагали. Если вам не нужно реализовывать собственный шаблон, это будет слишком много.

Но лучший способ, ИМХО, - забыть /struts/js/foo.js и использовать любой другой URL-адрес для загрузки js.

Несколько образцов:

JSP

WebPages
    |-->myjs.js         (a normal js file)
    |-->mydynamicjs.jsp (a .jsp file containing ONLY javascript code)
    |-->WEB-INF-->xyz.js (another .js file but accessed only through action)

Структуры

<action name="myacctionjs">
    <result>/WEB-INF/xyz.js</result>
</action>
person coding_idiot    schedule 04.12.2013
comment
Хорошо, есть ли простой способ заставить Struts обслуживать мои js по любому другому URL-адресу? - person alamar; 05.12.2013