在managedBean中从GUI更改.css文件

时间:2015-05-19 13:42:21

标签: css jsf

我创建了一个带有colorpickers的jsf页面,管理员可以根据这些页面更改包含4种颜色的网站主题。 我用我的css中的主要颜色作为数字的前缀:

.element{
    background: /*1*/#333333;
}

因此,为了获得颜色,我只需浏览所有css文件,并找到该数字后面的颜色(从1到4)。它可以正常工作,但是当我尝试设置颜色并刷新页面时,我根本没有css。但是当我清理项目时,.css会以原始颜色备份。

我的代码有点时髦,但现在是:

@ManagedBean
public class SiteColorsSettings {
    private String color1, color2, color3, color4;
    private final String CSS_FOLDER_PATH = "/resources/css";
    ServletContext ctx;
    String realPath;

    public SiteColorsSettings() {
        ctx = (ServletContext) FacesContext.getCurrentInstance()
                .getExternalContext().getContext();
        realPath = ctx.getRealPath("/");
        getColors();
    }

    public void getColors() {
        try {
            File cssFolder = new File(realPath + CSS_FOLDER_PATH);
            if (!cssFolder.exists()) {
                System.out.println("css folder not found");
            }
            File[] listOfFiles = cssFolder.listFiles();

            for (int i = 0; i < listOfFiles.length; i++) {
                if (listOfFiles[i].isFile()) {
                    String currentLine;
                    BufferedReader br = new BufferedReader(new FileReader(
                            listOfFiles[i]));

                    while ((currentLine = br.readLine()) != null) {
                        if (currentLine.contains("/*1*/")) {
                            this.color1 = currentLine.substring(currentLine
                                    .lastIndexOf("/*1*/") + 6);
                        }
                        if (currentLine.contains("/*2*/")) {
                            this.color2 = currentLine.substring(currentLine
                                    .lastIndexOf("/*2*/") + 6);
                        }
                        if (currentLine.contains("/*3*/")) {
                            this.color3 = currentLine.substring(currentLine
                                    .lastIndexOf("/*3*/") + 6);
                        }
                        if (currentLine.contains("/*4*/")) {
                            this.color4 = currentLine.substring(currentLine
                                    .lastIndexOf("/*4*/") + 6);
                        }
                    }
                }
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public void setColors() {
        try {
            File cssFolder = new File(realPath + CSS_FOLDER_PATH);
            if (!cssFolder.exists()) {
                System.out.println("css folder not found");
            }
            File[] listOfFiles = cssFolder.listFiles();

            switchColors(listOfFiles);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    private void switchColors(File[] files) {
        for (int i = 0; i < files.length; i++) {
            try {
                if (files[i].isFile()) {
                    BufferedReader br = new BufferedReader(new FileReader(
                            files[i]));
                    String fileContent = "";
                    String currentLine;
                    while ((currentLine = br.readLine()) != null) {
                        fileContent += currentLine;
                    }
                    for (int j = 1; j <= 4; j++) {
                        if (fileContent.contains("/*" + j + "*/")) {
                            int endOfColorChar = fileContent
                                    .lastIndexOf("/*+j+*/") + 12;
                            String fColor = fileContent.substring(
                                    fileContent.lastIndexOf("/*+j+*/") + 6,
                                    endOfColorChar);
                            switch (j) {
                            case (1):
                                fileContent.replace("/*j*/" + fColor, "/*j*/"
                                        + this.color1);
                                break;
                            case (2):
                                fileContent.replace("/*j*/" + fColor, "/*j*/"
                                        + this.color2);
                                break;
                            case (3):
                                fileContent.replace("/*j*/" + fColor, "/*j*/"
                                        + this.color3);
                                break;
                            case (4):
                                fileContent.replace("/*j*/" + fColor, "/*j*/"
                                        + this.color4);
                                break;
                            }
                            FileWriter fw = new FileWriter(files[i]);
                            BufferedWriter bw = new BufferedWriter(fw);
                            bw.write(fileContent);

                        }
                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

那么发生了什么?在项目保持不变的情况下,我是否更改了已部署的文件?如果是这样,为什么刷新后我的页面上没有css?我检查了字符串fileContent,css就在那里......

1 个答案:

答案 0 :(得分:2)

我不建议在运行时更改文件内容。您可以使用不同的方法来解决您的问题。

  1. .css中使用表达式语言,例如:

    .element{
        background: ##{siteColorsSettings.color1};
    }
    

    请注意,这仅适用referenced via <h:outputStylesheet>而不是<link>

  2. 将getter和setter添加到托管bean中的颜色值。

  3. 将您的颜色值保留在数据库或配置(例如,colors.properties)文件中,并附带内容:

    color1=333333
    color2=777777
    ...
    

    使用Properties类访问/更改它们。