Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хранение ресурсов web-приложения в jar'e, Хотелось бы запаковать картинки и css 
:(
    Опции темы
Maksym
Дата 22.3.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Tony
Есть ли InputStream'ы, с которыми nio работать не может? Например, если они порождаются налету внутри jvm и никак средствами операционной системы к ним не достучаться..
PM MAIL   Вверх
Maksym
Дата 18.4.2007, 00:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



По ходу использования тема получила свое логическое продолжение.
Теперь наш сервлет не только отдает common ресурсы из .jar, но и:
- пакует их gzip для браузеров, поддерживающих компрессию
- устанавливает expiration date, last modified, content length в response
В результате значительно уменшилось количество IOException'ов выпадающих из этого сервлета в лог, похоже это связано с тем, что браузеры запрашивают ресурсы меньшее количество раз, а если запрашивают то точно знают объем данных которых нужно дождаться (кроме того сам объем данных уменьшился за счет компрессии).
Код

package test.framework.utils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResourcesStorageServlet extends HttpServlet {

    private static final String RESOURCES_LOCATION = "/test/framework/ui/resources";
    private static final String SERVLET_PARAM_NAME_BUFFER_SIZE = "buffer_size";
    
    private static final long STARTUP_TIME = System.currentTimeMillis();
    private static final long EXPIRATION_TIME = STARTUP_TIME + 2629743830l;//startup time + one month     

    private static int bufferSize = 4096;

    public void init() throws ServletException {
        String bufferSizeStr = getServletConfig().getInitParameter(SERVLET_PARAM_NAME_BUFFER_SIZE);
        if (bufferSizeStr != null) {
            try {
                bufferSize = Integer.parseInt(bufferSizeStr);
            } catch (NumberFormatException exp) {
                UILogger.log().warn("Buffer_size param can't be read from servlet parameter. Default is using.");
            }
        }
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String requestPath = request.getRequestURI().replaceAll(request.getContextPath(), "");
        InputStream resource = ResourcesStorageServlet.class.getResourceAsStream(RESOURCES_LOCATION + requestPath);

        if (resource != null) {
            try {
                long ifModifiedSince = request.getDateHeader("If-Modified-Since");
                if (ifModifiedSince == -1 || STARTUP_TIME - ifModifiedSince > 1000) {
                 response.setHeader("Cache-Control", "private, max-age=86400");
                 response.setDateHeader("Expires", EXPIRATION_TIME);
                 response.setDateHeader("Last-Modified", STARTUP_TIME);

                 if(requestPath.endsWith(".gif"))
                     response.setContentType("image/gif");
                 else if(requestPath.endsWith(".jpeg"))
                     response.setContentType("image/jpeg");
                 else if(requestPath.endsWith(".js"))
                     response.setContentType("text/javascript");
                 else if(requestPath.endsWith(".css"))
                     response.setContentType("text/css");
                         
                 ByteArrayOutputStream output = new ByteArrayOutputStream();
                 boolean compress = request.getHeader("Accept-Encoding").indexOf("gzip") > -1;
                 if (compress) {
                     response.setHeader("Content-Encoding", "gzip");
                     GZIPOutputStream gzip = new GZIPOutputStream(output);
                     copy(resource, gzip);
                     gzip.finish();
                 } else {
                     copy(resource, output);
                 }
                 byte[] resourceBytes = output.toByteArray();

                 response.setContentLength(resourceBytes.length);
                 response.getOutputStream().write(resourceBytes);
                } else {
                 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                 response.setDateHeader("Expires", EXPIRATION_TIME);
                }
                response.flushBuffer();       
            } catch (IOException exc) {
                UILogger.log().debug("IOException during resource (reading from file)/(sending to response): " + (RESOURCES_LOCATION + requestPath), exc);
            }
        } else {
            UILogger.log().warn("Missing resource: " + requestPath);
        }
    }
    
    private static void copy(InputStream input, OutputStream output) throws IOException {
    byte[] buf = new byte[bufferSize];
    int len = 0;
    while ((len = input.read(buf)) > -1)
        output.write(buf, 0, len);
    }     
}

PM MAIL   Вверх
Stampede
Дата 18.4.2007, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Отлично, Maksym - держи плюса!

Не совсем понятна несогласованная логика выставления Expires и max-age (через месяц безостановочной работы сервера все ресурсы будут отдаваться как уже "испарившиеся"), но да ладно. Все равно полезная вещь, а подправить под себя всегда можно при желании.


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Maksym
Дата 18.4.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 24
Всего: 62



Цитата(Stampede @  18.4.2007,  01:07 Найти цитируемый пост)
Не совсем понятна несогласованная логика выставления Expires и max-age (через месяц безостановочной работы сервера все ресурсы будут отдаваться как уже "испарившиеся"), но да ладно.

Да, точно. Спасибо за замечание, исправим smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0828 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.