如何在名为div的复合组件内正确包装richfaces面板

时间:2012-12-03 19:25:05

标签: jsf-2 composite-component

我试着写资源/ ui / div.xhtml:

<?xml version="1.0" encoding="utf-8"?>
<ui:component xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    >
    <composite:interface>
        <composite:attribute name="binding" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="bodyClass" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="header" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="headerClass" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="id" required="false" type="java.lang.String" />
        <composite:attribute name="ondblclick" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onkeydown" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onkeypress" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onkeyup" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onmousedown" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onmousemove" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onmouseout" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onmouseover" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onmouseup" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="rendered" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="style" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="styleClass" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="onclick" required="false"
            type="javax.el.ValueExpression" />
        <composite:attribute name="title" required="false"
            type="javax.el.ValueExpression" />
    </composite:interface>
    <composite:implementation>
        <rich:panel         
            binding="cc.attrs.binding"
            bodyClass="cc.attrs.bodyClass" header="cc.attrs.header"
            headerClass="cc.attrs.headerClass" id="cc.attrs.id"
            ondblclick="cc.attrs.ondblclick" onkeydown="cc.attrs.onkeydown"
            onkeypress="cc.attrs.onkeypress" onkeyup="cc.attrs.onkeyup"
            onmousedown="cc.attrs.onmousedown"
            onmousemove="cc.attrs.onmousemove"
            onmouseout="cc.attrs.onmouseout"
            onmouseover="cc.attrs.onmouseover"
            onmouseup="cc.attrs.onmouseup" rendered="cc.attrs.rendered"
            style="cc.attrs.style" styleClass="cc.attrs.styleClass" 
            onclick="cc.attrs.onclick" 
            title="cc.attrs.title">
            <composite:insertChildren />
        </rich:panel>
    </composite:implementation>
</ui:component>

从这里调用它:

<html
...
xmlns:u="http://java.sun.com/jsf/composite/ui">
...
<u:div styleClass="dualbrand">
    test        
</u:div>
...
</html>

但我收到了错误:

  

javax.servlet.ServletException:java.lang.String无法强制转换为   javax.faces.component.UIComponent     javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)     org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)     com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)     org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65)     org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74)

如果我将实施改为:

<composite:implementation>
    <rich:panel         
        binding="#{cc.attrs.binding}"
        bodyClass="#{cc.attrs.bodyClass}" header="#{cc.attrs.header}"
        headerClass="#{cc.attrs.headerClass}" id="#{cc.attrs.id}"
        ondblclick="#{cc.attrs.ondblclick}" onkeydown="#{cc.attrs.onkeydown}"
        onkeypress="#{cc.attrs.onkeypress}" onkeyup="#{cc.attrs.onkeyup}"
        onmousedown="#{cc.attrs.onmousedown}"
        onmousemove="#{cc.attrs.onmousemove}"
        onmouseout="#{cc.attrs.onmouseout}"
        onmouseover="#{cc.attrs.onmouseover}"
        onmouseup="#{cc.attrs.onmouseup}" rendered="#{cc.attrs.rendered}"
        style="#{cc.attrs.style}" styleClass="#{cc.attrs.styleClass}" 
        onclick="#{cc.attrs.onclick}" 
        title="#{cc.attrs.title}">
        <composite:insertChildren />
    </rich:panel>
</composite:implementation>

我会得到:

  

javax.servlet.ServletException:/WEB-INF/templates/main.xhtml @ 34,33   styleClass =“dualbrand”无法转换类型类的双品牌   java.lang.String到类javax.el.ValueExpression     javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)     org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)     com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)     org.jboss.solder.servlet.exception.CatchExceptionFilter.doFilter(CatchExceptionFilter.java:65)     org.jboss.solder.servlet.event.ServletEventBridgeFilter.doFilter(ServletEventBridgeFilter.java:74)

我该如何正确包装面板?

1 个答案:

答案 0 :(得分:2)

关于您的第一个例外,使用attributename="cc.attrs.attributename"首先完全错误。这不是它的工作原理。 EL表达式应该包含在#{}attributename="#{cc.attrs.attributename}"中。这就是规范要求它。

关于你的第二个异常,那是因为你声明了类型是javax.el.ValueExpression而不是表达式背后的实际对象类型,如果java.lang.String属性是styleClass 。相应地修复它:

<composite:attribute name="styleClass" required="false"
    type="java.lang.String" />

对其他类型做同样的事情。有关正确类型的概述,请咨询您尝试委托的<rich:panel> the VDL documentation