我正在使用复合组件,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;
}
}