- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我制作了一个带有颜色选择器的 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 在那里...
最佳答案
我不建议在运行时更改文件内容。您可以使用不同的方法来解决您的问题。
在您的 .css
中使用表达式语言,比如:
.element{
background: ##{siteColorsSettings.color1};
}
请注意,这仅在 referenced via <h:outputStylesheet>
时有效而不是通过 <link>
.
将 getter 和 setter 添加到托管 bean 中的颜色值。
将您的颜色值保存在数据库或配置(例如 colors.properties
)文件中,内容如下:
color1=333333
color2=777777
...
并使用 Properties 访问/更改它们类。
关于css - 在 managedBean 中从 GUI 更改 .css 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30327438/
好的,这是我的 session bean。我总是可以从任何 Servlet 或过滤器中检索 currentUser。那不是问题问题是fileList和currentFile。我已经用简单的 int 和
我觉得 Java EE 6 规范有些困惑。有几组注释。 我们有javax.ejb注释如 @Stateful和 @Stateless用于创建 EJB。 还有一个@javax.annotation.Man
这个问题已经有答案了: Backing beans (@ManagedBean) or CDI Beans (@Named)? (5 个回答) 已关闭 7 年前。 我刚刚创建了一个新的 Maven 项
我正在开发一个复合组件,它必须进行一些计算才能使布局正常工作。对于 EL 来说过于复杂的计算(实际上并不复杂,但我无法通过 EL 执行它们)。我可以专门为该复合组件创建一个 ManagedBean 吗
我在@ManagedBean类中使用Bean管理事务来手动管理事务, @ManagedBean(name = "clients") @ViewScoped @URLMapping(id = "sous
这个问题在这里已经有了答案: How to inject @EJB, @PersistenceContext, @Inject, @Autowired, etc in @FacesConverter
我有一个 jsf View ,它显示了来自表中托管 bean( View 范围)的一些数据,这些数据是远程检索的。 目前,数据是通过使用 primefaces 轮询组件从客户端 View 轮询来更新的
在我的网络应用程序中,当我点击登录链接时,Tomcat 网络服务器抛出以下异常: exception javax.servlet.ServletException: /aluno_jsf.xhtml:
我对应用程序中 ManagedBeans 的使用有疑问。 我有一个页面,其中包含不同的 JSP 组件,如 autoComplete、selectOneMenu、textarea、inputFields
为了获得良好的用户反馈,我在网络应用程序的多个站点上使用消息。 要添加消息,我简单地使用: FacesContext.getCurrentInstance().addMessage(null, new
我一直在为我的 bean 使用注释(我以前没有使用过它们),我发现我必须包含一些依赖项等等,如下所示: com.sun.faces
我是 richfaces 的新手,我想使用注释而不是 xml 配置来支持 bean 类 [就像 JSF 2.0] 我正在使用 richfaces 4.0 并将所有必需的 jar 包含在我的构建路径中。
我目前正在将一个项目从 JBoss 4.2.2 迁移到 JBoss 6.0.0,我还在使用 CDI 添加依赖注入(inject)并从 JSF 1.2 迁移到 JSF 2.0。我向 ejb-packag
可以将无状态 session bean 注入(inject) jsf 托管 bean 中吗? 我有 @ManagedBean(name = "imageUpload") @RequestScoped
我有一个名为 Foo 的类。还有一个名为 FooBean 的 ManagedBean。在页面(Facelet)中,我从用户那里获取新的 Foo 信息并将其插入到数据库中。首次提交数据后,将启用打印按钮
我有fileUpload的managementBean,一旦文件上传,我需要根据从解析器下拉列表中选择的值调用不同的解析器,然后在解析器中创建DetailsClass对象,其中调用该特定类的getDe
我尝试编写一个应用程序来创建 PDF 文件,它使用 JavaServer Faces。当我将文本框的值从 bean 赋予工厂类时,我遇到了一个问题,这些值丢失了。我想知道为什么会发生这种情况,已经尝试
我想知道在两个 ViewScoped bean 之间传递数据(对象)的最佳实践是什么。 由于出色解释的问题,它们需要在 View 范围内here (简而言之:在这两个 View 中,我都在 h:dat
我有 Controller-ManagedBeans 和 Model-ManagedBeans(如 MVC 模式)。 这是我的 Controller : @ManagedBean @Req
这个问题在这里已经有了答案: Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable (18 个回
我是一名优秀的程序员,十分优秀!