我做了一个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 ?我检查了字符串filcontent和css在那里
我不建议在运行时更改文件内容。你可以用另一种方法来解决你的问题。
-
在您的
.css
中使用表达语言,如:.element{ background: ##{siteColorsSettings.color1}; }
请注意,这只适用于通过
<h:outputStylesheet>
而不是通过<link>
引用的情况。 -
为托管bean中的颜色值添加getter和setter。
-
将您的颜色值保存在数据库或配置文件中(例如,
colors.properties
),其内容为:color1=333333 color2=777777 ...