jsf - 排除 JSF 中的资源

标签 jsf primefaces resources systemeventlistener

我正在使用 Primefaces。对于某些页面,我想排除 primefacs 包含的资源,尤其是主题资源。

<link type="text/css" rel="stylesheet" href="/context/javax.faces.resource/theme.css?ln=primefaces-owntheme" />    

我尝试使用 SystemEventListener 如下:
public class PrimeFacesResourceRemover implements javax.faces.event.SystemEventListener {


  @Override
  public void processEvent(SystemEvent event) throws AbortProcessingException {
    FacesContext context = FacesContext.getCurrentInstance();

    UIViewRoot viewRoot = context.getViewRoot();
    for (UIComponent resource : viewRoot.getComponentResources(context, "head")) {

        Map<String, Object> attrs = resource.getAttributes();
        String resourceLibrary = (String) attrs.get("library");
        String resourceName = (String) attrs.get("name");

        if ("primefaces-owntheme".equals(resourceLibrary) && "theme.css".equals(resourceName)) {

            // Remove resource from view
            context.getViewRoot().removeComponentResource(context, resource, HEAD);
        }
    }
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public boolean isListenerForSource(Object source) {
    return (source instanceof UIViewRoot);
  }
}

并在faces-config.xml
    <application>
      <system-event-listener>
        <system-event-listener-class>
          com.mycompany.mavenproject1.PrimeFacesResourceRemover
        </system-event-listener-class>
        <system-event-class>
          javax.faces.event.PostAddToViewEvent
        </system-event-class>
      </system-event-listener>
    </application>

当我手动在页面上包含资源时,这很有效,但那些不适用于 Primefaces 包含的资源。如何删除这些资源?

最佳答案

theme.css未作为动态组件资源添加,但已在 PrimeFaces 的 HeadRenderer 中硬编码. OmniFaces CombinedResourceHandler也是 struggling有了这个。

解决方案相当简单:用自定义 HeadRenderer 覆盖它(当然,在 @ResourceDependency 上没有任何 theme.css !):

public class HeadRenderer extends Renderer {

    @Override
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        context.getResponseWriter().startElement("head", component);
    }

    @Override
    public void encodeChildren(FacesContext context, UIComponent component) throws IOException {
        // NOOP.
    }

    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
        for (UIComponent resource : context.getViewRoot().getComponentResources(context, "head")) {
            resource.encodeAll(context);
        }

        context.getResponseWriter().endElement("head");
    }

}

在webapp的faces-config.xml中注册如下:
<render-kit>
    <renderer>
        <component-family>javax.faces.Output</component-family>
        <renderer-type>javax.faces.Head</renderer-type>
        <renderer-class>com.example.HeadRenderer</renderer-class>
    </renderer>
</render-kit>

关于jsf - 排除 JSF 中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20188559/

相关文章:

c++ - 如何在Visual C++项目中定义和加载资源?

jakarta-ee - 访问 EJB 中的注入(inject)资源

apache - 没有/faces/无法访问 JSF2 应用程序

jsf - 在 JSF 中生成弹出窗口

jsf - JSF id 的规则是什么?

mysql - 表更新和 Primefaces ScheduleEvent

VB.NET 添加图像,使其显示在 My.Resources.TheImageName 下

java - JSF 实体转换错误 : rich suggestionbox Conversion Error setting value '*' for 'null Converter'

jsf - 我最初如何隐藏 p :dataTable with p:columnToggler 中的列

java - primefaces 数据表中的单选按钮和复选框