如何在CSS资源中获取@ViewScoped bean属性?

时间:2015-08-05 15:07:50

标签: css jsf el view-scope

我有一个@ViewScoped bean:

@Named
@ViewScoped
public class testBean implements Serializable {
    private static final long serialVersionUID = 1L;
    private String color;

    @PostConstruct
    public void postConstruct() {
        color = "red";
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

在我的JSF页面中,我可以通过#{testBean.color}访问属性颜色,但在我的CSS资源中它不起作用。

html, body {
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
    border: 0;
    background-color: #{testBean.color};
}

抛出以下异常:

org.jboss.weld.context.ContextNotActiveException: WELD-001303: No active contexts for scope type javax.faces.view.ViewScoped
    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:680) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:79) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:78) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
    at com.unifik.core.subdomain.admin.WidgetLoginBean$Proxy$_$$_WeldClientProxy.getWidgetLogin(Unknown Source) [classes:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.7.0_67]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [rt.jar:1.7.0_67]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [rt.jar:1.7.0_67]
    at java.lang.reflect.Method.invoke(Method.java:606) [rt.jar:1.7.0_67]
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:363) [jboss-el-api_3.0_spec-1.0.3.Final.jar:1.0.3.Final]
    ... 46 more

如果我将@ViewScoped更改为@SessionScoped,那么它可以正常运行,但我不希望如此。

2 个答案:

答案 0 :(得分:1)

bean无法查看作用域。当webbrowser在检查检索到的HTML页面之后被指示下载CSS文件时,在webbrowser发起的完全独立的GET请求期间请求CSS文件。这个CSS文件的特定请求对JSF视图状态一无所知,因此任何引用JSF视图范围bean的EL表达式都无法找到所需的bean,因为它没有JSF视图的方法在处理CSS文件请求期间的任何地方。

选择另一个bean范围,或者在HTML页面的<style>元素中内联它。请求,会话或应用程序范围的bean应该工作。另请参阅How to choose the right bean scope?

答案 1 :(得分:-2)

我在我的CSS文件中这样做并且正在运行:

.color {color: #{initParam['icons_color']} !important;}
a.color {color: #{initParam['icons_color']} !important;}
a.color:hover, a.color:focus {color: #1faabe;}
.bg-color {
     background-color: #{initParam['icons_color']} !important;
}

如果必要的话,可以使用上下文参数进行会话等。

对于这项工作,CSS必须使用标签h:outputStylesheet放在页面中,如:        <h:outputStylesheet library="css" name="my.css">

我尝试使用这样的:       <link rel="stylesheet" type="text/css" href="settings.css" /> 并且不起作用。