JSF: файл CSS в виде байта [] в строку - PullRequest
1 голос
/ 12 января 2011

У меня есть файл .css, сохраненный id DB как байт [].Теперь мне нужно включить содержимое этого файла в тело страницы.Я делаю это так:

class FlowUtils {
    private Integer themeId;
    private ThemeDAO themeDAO;

    public String getThemeCss() {
        byte[] b = themeDAO.get(themeId).getCss();
        return new String(b);
    }
}

<h:head>
    <style type="text/css">
    #{flowUtils.themeCss}
    </style>
</h:head>

Это достаточно и безопасно?

1 Ответ

2 голосов
/ 12 января 2011
return new String(b);

Таким образом, вы зависите от кодировки символов по умолчанию на сервере, которая сама по себе может быть неправильной. Представьте, что byte[] содержит байты UTF-8 и серверный компьютер настроен на использование ISO-8859-1 в качестве кодировки по умолчанию, тогда new String(b) может возвращать mojibake . Вы хотите указать кодировку символов явно.

return new String(b, "UTF-8");

Что касается подхода, я бы порекомендовал использовать сервлет, который возвращает полноценный файл .css выше, помещая стили raw в <style>. Таким образом, вы получаете страницу меньшего размера (в байтах) и можете контролировать кэширование возвращенного файла CSS, так что вам не обязательно возвращать его при каждом запросе. Это, наконец, более эффективно с точки зрения использования полосы пропускания сети и ресурсов процессора / памяти сервера.

<link rel="stylesheet" href="cssservlet?id=123" />

где файловый сервлет делает что-то вроде этого:

byte[] bytes = themeDAO.get(request.getParameter("id"));
response.setContentType("text/css;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setDateHeader("Expires", System.currentTimeMillis() + 604800000L); // Cache for one week.
response.getOutputStream().write(bytes);

Чтобы улучшить его, пусть он возвращает InputStream вместо byte[], так что это немного более эффективно использует память (byte[] сохраняется полностью в памяти, в то время как InputStream это просто указатель). Затем запишите его в OutputStream обычным способом ввода-вывода Java с небольшим байтовым буфером.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...