【问题标题】:How to get @ViewScoped bean property in CSS resource?如何在 CSS 资源中获取 @ViewScoped bean 属性?
【发布时间】:2015-08-05 15:07:49
【问题描述】:

我有一个@ViewScoped 豆:

@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,那么它可以工作,但我不希望这样。

【问题讨论】:

  • 你为什么不想使用

标签: css jsf el view-scope


【解决方案1】:

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

要么选择另一个 bean 范围,要么将其内联到 HTML 页面的 <style> 元素中。请求、会话或应用程序范围的 bean 应该可以工作。另见How to choose the right bean scope?

【讨论】:

  • 非常感谢,怀疑是答案,但还是创建一个session bean对那个不好,最好的办法是让xhtml中的样式(我认为)和是否是更好的做法使用<h: outputStylesheet />,最好有更好的选择
【解决方案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;
}

如果会话或类似情况需要,您可以使用上下文参数。

为此,必须使用标签 h:outputStylesheet 将 CSS 放入页面中,例如: <h:outputStylesheet library="css" name="my.css">

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

【讨论】:

  • 有效吗?遇到什么问题?如果答案是“是”和“否”,则可以使用(但我认为这应该是一个新问题!)
  • Kukeltje 不是问题,是为初始化参数更改托管 bean 的可能答案,但我现在只是尝试这样做,直到现在都很好。
  • 抱歉,您没有回答关于 @ViewScoped bean 在 CSS 资源中不可引用的具体问题。
猜你喜欢
  • 2012-03-15
  • 2012-11-19
  • 1970-01-01
  • 2021-11-14
  • 2011-10-12
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多