|
Модераторы: LSD, AntonSaburov |
|
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
Собственно, сабж.
Хочется запаковать все ресурсы web-приложения в jar и положить этот jar в dependencies нескольких проектов с одинаковой идеей интерфейса. Подскажите, пожалуйста, можно ли в jsp сослаться на css или изображение, спрятанное в jar'e, и если можно то как? ЗЫ. Используется ли такая практика? или, может быть, есть другие приемы хранения и предоставления в web-интерфейсы общих ресурсов? |
|||
|
||||
MisterCleric |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1043 Регистрация: 16.2.2006 Где: Харьков, Украина Репутация: 33 Всего: 38 |
Собственно можно. Как универсально сделать не подскажу. Но покажу пример.
Я использую webwork. В его jar'e запакован FCKeditor он лежит по таком пути: webwork-2.2.2.jar\com\opensymphony\webwork\static\richtexteditor\ на странице к его js & css обращаюсь так: <script language="JavaScript" type="text/javascript" src="<%=request.getContextPath()%>/webwork/richtexteditor/fckeditor.js"></script> Как я понимаю путь ищеться от: <filter> <filter-name>webwork</filter-name> <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class> </filter> В общем и все. Других вариантов не пробовал. И как-то мысли даже не было. Пробуй -------------------- ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ... |
|||
|
||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
MisterCleric
Большое спасибо. Формат не очень нравится (<%=request.getContextPath()%>/webwork/richtexteditor/fckeditor.js>), но конечно попробую. All Нет ли еще идей? (честно говоря я рассчитывал на прямой путь, заложенный в технологию, а не на трюк) |
|||
|
||||
Stampede |
|
|||
Гносеолог Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
Maksym, идея как бы понятна: распространять модуль в виде бинарника, в котором уже запакованы все элементы его вебного интерфейса. Подтыкнул к проекту - и сразу пользуйся.
Может, и не лишено смысла. Реализовать тоже можно, и даже не особенно трудно. Щас раскажу как. Мне видятся два пути. Оба связаны с написанием кастомного сервлета. 1. Сервлет, выдающий содержимое архива. Напишем сервлет, который, скажем, по адресу "/archive/yourfile.jar/img/button.gif" понимает, что нужно пойти в стандартную папку WEB-INF/lib, найти там yourfile.jar, открыть его как архив, прочитать содержимое файла img/button.gif и выдать его в поток вывода. 2. Сервлет, выдающий ресурсы Здесь предлагается написать сервлет, который использует метод Class.getResourceAsStream(String path). Опять-таки, надо продумать шаблон пути, который будет однозначно мапиться на даный сервлет, и часть которого будет указывать на путь внутри архива. Для все того же файла кнопки в yourfile.jar УРЛ мог бы выглядеть так: "/resources/img/buton.gif". Теперь сравним варианты. Второй быстрее в реализации, поскольку поиск и разрешение пути к ресурсу за тебя сделает система, используя стандартный механизм лукапа загрузчиками классов. Кроме того, УРЛ'ы при этом получаются компактными, и в них не надо явно прописывать имя архива. С другой стороны, первый сервлет может быть более универсальным, так как теоретически мы могли бы запрограммировать его таким образом, чтобы он доставал нам статику из любого архива, который мы укажем - и не обязательно лежащего на classpath. А уж как это указать - это целиком дело фантазии разработчиков. Можно задавать через параметры инициализации сервлета, можно через собственную конфигурацию, можно через часть УРЛ, а можно все вместе. Так что дерзай. Интересно будет услышать, что и как получается. -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
Stampede
Спасибо. Первый вариант кажется более интересным с точки зрения масштабируемости и реиспользования. Удивляет отсутствие готовых решений. |
|||
|
||||
Maksym |
|
||||||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
Выкроил время и написал коротенькое решение. Работает. Прошу о code-review.
В пакет test.framework.ui.resources.img кладутся все общие изображения, в test.framework.ui.resources.css -- общие стили и т.п. Все это запаковывается в framework.jar (в Eclipse удобно создать для этих целей Utility Project и подключать его к зависимым приложениям), который подключается в j2ee dependencies тех web-приложений, которые будут использовать эти ресурсы. В web.xml этих приложений не забываем указать:
И после этого в проектах запросто можно пользоваться общими ресурсам:
Это сообщение отредактировал(а) Maksym - 19.2.2007, 18:27 |
||||||
|
|||||||
Tony |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
A ещё можно 4ерз NIO. |
|||
|
||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
Tony
Спасибо. С буфером, конечно, будет быстрее. А что даст использование nio? Добавлено @ 18:51 Размер буфера 4096 чем подсказан? исходя из чего его стоит вычислять? |
|||
|
||||
Tony |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
NIO (new IO) побыстрее работает с input/output, чем класси4еская модель in/out.
Зависит от коли4ества запросов к ресурсу. Если мало запросов и маленкие файлики(цсс,иконки...) то можно сразу весь файл загрузить в массив и выдать его, не исползуя for (как в примере выше). Нас4ёт NIO.(вариант 2)
Это сообщение отредактировал(а) Tony - 19.2.2007, 20:47 |
||||
|
|||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
Tony
Apache IO API предлагает сделать все вызовом одного метода -- IOUtils.copy(InputStream input, OutputStream output) (вариант 3) Какой способ эффективнее? Все таки речь идет о многократно повторяющейся операции |
|||
|
||||
Tony |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Да знаю 4то есть у Jakarti. Если ты хо4ешь ложить либу ради одного метода флаг в руки. Нас4ёт производительности надо сорсы смотреть. Сорри нету времени(завтра).
|
|||
|
||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
Tony
Исходник org.apache.commons.io.IOUtils.copy(InputStream input, OutputStream output):
Разницы с твоим вариантом для io, кажется, нет. Дополнительно вычисляется никому не нужный count (the number of bytes copied) и все. All Не работал с nio. Действительно ли его предпочтительнее изпользовать в подобных ситуациях? В чем заключается его оптимизация по сравнению со стандартной моделью? |
|||
|
||||
Tony |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Полно имфы (и на русском языке). statja |
|||
|
||||
Maksym |
|
|||
. Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 24 Всего: 62 |
Окончательный вариант (на данный момент). Используется в серии проектов с большим количеством общих ресурсов. Пока проблем не было.
Размер буфера параметризуется в зависимости от приложения. Для логирования используется внешний класс UILogger (helper для использования log4j). Интересно, что реалзиация через nio не заработала... Код молча отработал и в response все ушло, но к пользователю ничего не попало... |
|||
|
||||
Tony |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1159 Регистрация: 3.3.2006 Где: Riga Репутация: 6 Всего: 12 |
Вот это интерсно |
|||
|
||||
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |