JSF:CSS文件为byte []到String

时间:2011-01-12 13:32:47

标签: java jsf-2

我有一个.css文件,将id DB保存为byte []。现在我需要在页面正文中包含该文件的内容。我是这样做的:

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 个答案:

答案 0 :(得分:2)

return new String(b);

这样,您依赖于服务器计算机默认字符编码,这可能不是正确的字符编码本身。假设byte[]包含UTF-8字节,服务器机器配置为使用ISO-8859-1作为默认编码,则new String(b)可能返回mojibake。您想明确指定字符编码。

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

关于这种方法,我建议使用一个servlet,它返回一个完整的.css文件,然后将样式raw放在<style>中。这样,您最终得到一个较小的页面(以字节为单位),您可以控制返回的CSS文件的缓存,这样您就不必在每个请求上返回它。这在网络带宽消耗和服务器CPU /内存资源方面最终更有效。

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

文件servlet执行以下操作:

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 IO方式。

另见: