0

我尝试在resources/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 类型的 dualbrand 转换为类 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)

我应该怎么做才能正确包裹面板?

4

1 回答 1

2

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

至于您的第二个例外,那是因为您将类型声明为 ajavax.el.ValueExpression而不是表达式后面的实际对象类型,这是java.lang.StringstyleClass属性的情况下。相应地修复它:

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

对其他类型执行相同操作。有关正确类型的概述,请参阅您尝试委托给的VDL 文档。<rich:panel>

于 2012-12-03T20:50:55.733 回答