为什么在JSF 2.0中的自定义组件中没有属性渲染?

时间:2014-10-30 09:30:36

标签: java jsf jsf-2

我正在使用复合组件,JSF 2.0中的自定义组件进行概念性测试。

情况如下:

我有复合组件,它接收唯一的属性滑块,它是一个整数。 我有一个自定义组件'滑块'它有一个标签ajax捕获自定义事件' valueChange 触发该事件时,将执行侦听器#{myBean.changeInterval}。

但我不知道为什么组件outputText带有id'石斑鱼'没有执行。

我认为这是jsf中选择器的问题。但我不确定。

感谢您的帮助!

复合组件。

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"    
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:slider="http:/slider"
xmlns:chart="http:/chart">

<!-- INTERFACE --> 
<composite:interface>
  <composite:attribute name="slider" required="true"/>    
</composite:interface> 

<!-- IMPLEMENATION -->          
<composite:implementation>

                <h:form>

                    <h:inputText value="#{myBean.grouper}">
                        <f:ajax event="keyup"  render=":j_idt33:j_idt56:j_idt57:grouper :out"></f:ajax>
                    </h:inputText>

                    <h:outputText  id="grouper" value="#{myBean.grouper}"   ></h:outputText>

                    <slider:slider slider="#{cc.attrs.slider}" id="slider" >
                            <f:ajax event="valueChange" listener="#{myBean.changeInterval}" render=":j_idt33:j_idt56:j_idt57:grouper :out"    ></f:ajax>
                    </slider:slider>


                </h:form>


</composite:implementation>    

自定义组件。

ClientBehaviorHolder,Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

protected static final String FAMILY = "slider";
protected static final String RENDERTYPE = "com.component.jsf2.slider.SliderRender";
private   static final String EVENT_VALUE_CHANGE ="valueChange";

enum PropertyKeys {
    slider;

     String toString;
     PropertyKeys(String toString) { this.toString = toString; }
        PropertyKeys() { }
        public String toString() {
            return ((toString != null) ? toString : super.toString());
        }
}

@Override
public String getFamily() {
    return FAMILY;
}
@Override
public String getRendererType() {
    return RENDERTYPE;
}


@Override
public void decode(FacesContext context) {

    Map<String,String> map = context.getExternalContext().getRequestParameterMap();
    for (String key : map.keySet()) {
        System.out.println("key : " + key  + " , value  : " + map.get(key));
    }


    ExternalContext external = context.getExternalContext();
    Map<String, String> params = external.getRequestParameterMap();
    String behaviorEvent = params.get("javax.faces.behavior.event");

    if (EVENT_VALUE_CHANGE.equals(behaviorEvent)) {

        String grouper = params.get("grouper");
        if (grouper != null) {
            setSlider(Integer.parseInt(grouper));
        }

    }

    Map<String, List<ClientBehavior>> behaviors = getClientBehaviors();
    if (behaviors.isEmpty()) {
        return;
    }


    if (behaviorEvent != null) {
        List<ClientBehavior> behaviorsForEvent = behaviors.get(behaviorEvent);
        if (behaviors.size() > 0) {
            String behaviorSource = params.get("javax.faces.source");
            String clientId = getClientId(context);
            if (behaviorSource != null && behaviorSource.equals(clientId)) {
                for (ClientBehavior behavior: behaviorsForEvent) {
                    behavior.decode(context, this);
                }
            }
        }
    }
}


public Integer getSlider() {
    return (Integer) getStateHelper().eval(PropertyKeys.slider, null);
}

public void setSlider(Integer slider) {
    getStateHelper().put(PropertyKeys.slider, slider);
}   

private static final Collection<String> EVENT_NAMES = Collections.unmodifiableCollection(Arrays.asList(EVENT_VALUE_CHANGE));

@Override
public Collection<String> getEventNames() {
    return EVENT_NAMES;    
}

@Override
public String getDefaultEventName() {
  return EVENT_VALUE_CHANGE;    
}

}

带有监听器的托管Bean(Mybean)

@ViewScoped

@ManagedBean 公共类MyBean实现Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

Integer value = 1;

public void changeInterval(AjaxBehaviorEvent e)
{
    //AjaxBehavior behavior = (AjaxBehavior) e.getBehavior();
    SliderComponent componet = (SliderComponent) e.getComponent();
    value= componet.getSlider();
}


public Integer getGrouper  ( ) {

    return value;   
}


public void setGrouper (Integer value  ) {
    this.value = value;
}

}

0 个答案:

没有答案