Bonjour,

J'ai créé un composant jsf date de naissance dans ma page jsp, mais je n'arrive pas à récupérer les valeurs de mes 3 combos. Comment faut il faire ? A priori il n'accède pas à ma propriété valueChangeListener. Comment faut il faire ?

Le tag
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
 
public class DateDeNaissanceTag extends AbstractUIComponentELTagImpl implements EditableValueHolder {
 
	private ValueExpression valueJour;
	private ValueExpression valueMois;
	private ValueExpression valueAnnee;
	private ValueExpression message;
	private ValueExpression isRendered;
	private ValueExpression requiredMessage;
	private ValueExpression nom;
	private MethodExpression validator;
	private MethodExpression valueChangeListener;
 
	public String getComponentType() {
		return DateDeNaissanceComponent.COMPONENT_TYPE;
	}
 
	public String getRendererType() {
		// TODO Auto-generated method stub
		return null;
	}
 
	protected void setProperties(UIComponent component) {
		final DateDeNaissanceComponent dateDeNaissanceComponent = (DateDeNaissanceComponent) component;
		super.setProperties(dateDeNaissanceComponent);
 
		setComponent(dateDeNaissanceComponent);
 
		dateDeNaissanceComponent.setValueJour(TagLibUtil.convertValueExpressionToString(getValueJour()));
		dateDeNaissanceComponent.setValueMois(TagLibUtil.convertValueExpressionToString(getValueMois()));
		dateDeNaissanceComponent.setValueAnnee(TagLibUtil.convertValueExpressionToString(getValueAnnee()));
 
		dateDeNaissanceComponent.setMessage(TagLibUtil.convertValueExpressionToString(message));
		dateDeNaissanceComponent.setNom(TagLibUtil.convertValueExpressionToString(nom));
 
		this.addValueChangeListener(new MethodExpressionValueChangeListener(valueChangeListener));
		this.addValidator(new MethodExpressionValidator(validator));
 
	}
 
	/**
         * @return the jour
         */
	public ValueExpression getValueJour() {
		return valueJour;
	}
 
	/**
         * @param jour the jour to set
         */
	public void setValueJour(ValueExpression jour) {
		this.valueJour = jour;
	}
 
	/**
         * @return the mois
         */
	public ValueExpression getValueMois() {
		return valueMois;
	}
 
	/**
         * @param mois the mois to set
         */
	public void setValueMois(ValueExpression mois) {
		this.valueMois = mois;
	}
 
	/**
         * @return the annee
         */
	public ValueExpression getValueAnnee() {
		return valueAnnee;
	}
 
	/**
         * @param annee the annee to set
         */
	public void setValueAnnee(ValueExpression annee) {
		this.valueAnnee = annee;
	}
 
	/**
         * @return the rendered
         */
	public boolean isRendered() {
		return true;
	}
 
	/**
         * @return the message
         */
	public ValueExpression getMessage() {
		return message;
	}
 
	/**
         * @param message the message to set
         */
	public void setMessage(ValueExpression message) {
		this.message = message;
	}
 
	/**
         * @return the isRendered
         */
	public ValueExpression getIsRendered() {
		return isRendered;
	}
 
	/**
         * @param isRendered the isRendered to set
         */
	public void setIsRendered(ValueExpression isRendered) {
		this.isRendered = isRendered;
	}
 
	/**
         * @return the requiredMessage
         */
	public ValueExpression getRequiredMessage() {
		return requiredMessage;
	}
 
	/**
         * @param requiredMessage the requiredMessage to set
         */
	public void setRequiredMessage(ValueExpression requiredMessage) {
		this.requiredMessage = requiredMessage;
	}
 
	/**
         * @return the nom
         */
	public ValueExpression getNom() {
		return nom;
	}
 
	/**
         * @param nom the nom to set
         */
	public void setNom(ValueExpression nom) {
		this.nom = nom;
	}
 
	/**
         * @param validator the validator to set
         */
	public void setValidator(MethodExpression validator) {
		this.validator = validator;
	}
 
	/**
         * @param valueChangeListener the valueChangeListener to set
         */
	public void setValueChangeListener(MethodExpression valueChangeListener) {
		this.valueChangeListener = valueChangeListener;
	}
 
	public Object getLocalValue() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public Object getValue() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public void setValue(Object value) {
		// TODO Auto-generated method stub
 
	}
 
	public Converter getConverter() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public void setConverter(Converter converter) {
		// TODO Auto-generated method stub
 
	}
 
	public Object getSubmittedValue() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public void setSubmittedValue(Object submittedValue) {
		// TODO Auto-generated method stub
 
	}
 
	public boolean isLocalValueSet() {
		// TODO Auto-generated method stub
		return false;
	}
 
	public void setLocalValueSet(boolean localValueSet) {
		// TODO Auto-generated method stub
 
	}
 
	public boolean isValid() {
		// TODO Auto-generated method stub
		return false;
	}
 
	public void setValid(boolean valid) {
		// TODO Auto-generated method stub
 
	}
 
	public boolean isRequired() {
		// TODO Auto-generated method stub
		return false;
	}
 
	public void setRequired(boolean required) {
		// TODO Auto-generated method stub
 
	}
 
	public boolean isImmediate() {
		// TODO Auto-generated method stub
		return false;
	}
 
	public void setImmediate(boolean immediate) {
		// TODO Auto-generated method stub
 
	}
 
	public MethodBinding getValidator() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public void setValidator(MethodBinding validatorBinding) {
		// TODO Auto-generated method stub
 
	}
 
	public MethodBinding getValueChangeListener() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public void setValueChangeListener(MethodBinding valueChangeMethod) {
		// TODO Auto-generated method stub
 
	}
 
	public void addValidator(Validator validator) {
		// TODO Auto-generated method stub
 
	}
 
	public Validator[] getValidators() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public void removeValidator(Validator validator) {
		// TODO Auto-generated method stub
 
	}
 
	public void addValueChangeListener(ValueChangeListener listener) {
		// TODO Auto-generated method stub
 
	}
 
	public ValueChangeListener[] getValueChangeListeners() {
		// TODO Auto-generated method stub
		return null;
	}
 
	public void removeValueChangeListener(ValueChangeListener listener) {
		// TODO Auto-generated method stub
 
	}
Le component
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
public class DateDeNaissanceComponent extends AbstractUIComponent{
 
	public static final String DATE_DE_NAISSANCE_RENDERER = "com.toto.DateDeNaissanceRenderer";
	public static final String COMPONENT_TYPE = "com.toto.taglib.DateDeNaissanceComponent";
	public static final String COMPONENT_FAMILY = "DateDeNaissance";
 
	private String id;
	private String valueJour;
	private String valueMois;
	private String valueAnnee;
	private String message;
	private String requiredMessage;
	private String nom;
//	private MethodExpressionValidator validator;
 
	//Ici logique métier
	@Override
	public String getFamily() {
		return COMPONENT_FAMILY;
	}
 
	@Override
	public String getRendererType() {
		// Sans javascript donc rendu simple
		return "com.toto.DateDeNaissanceRenderer";
	}
 
	/**
         * @return the id
         */
	public String getId() {
		return id;
	}
 
	/**
         * @param id the id to set
         */
	public void setId(String id) {
		this.id = id;
	}
 
	/**
         * @return the valueJour
         */
	public String getValueJour() {
		return valueJour;
	}
 
	/**
         * @param valueJour the valueJour to set
         */
	public void setValueJour(String valueJour) {
		this.valueJour = valueJour;
	}
 
	/**
         * @return the valueMois
         */
	public String getValueMois() {
		return valueMois;
	}
 
	/**
         * @param valueMois the valueMois to set
         */
	public void setValueMois(String valueMois) {
		this.valueMois = valueMois;
	}
 
	/**
         * @return the valueAnnee
         */
	public String getValueAnnee() {
		return valueAnnee;
	}
 
	/**
         * @param valueAnnee the valueAnnee to set
         */
	public void setValueAnnee(String valueAnnee) {
		this.valueAnnee = valueAnnee;
	}
 
	/**
         * @return the message
         */
	public String getMessage() {
		return message;
	}
 
	/**
         * @param message the message to set
         */
	public void setMessage(String message) {
		this.message = message;
	}
 
	/**
         * @return the requiredMessage
         */
	public String getRequiredMessage() {
		return requiredMessage;
	}
 
	/**
         * @param requiredMessage the requiredMessage to set
         */
	public void setRequiredMessage(String requiredMessage) {
		this.requiredMessage = requiredMessage;
	}
 
	/**
         * @return the nom
         */
	public String getNom() {
		return nom;
	}
 
	/**
         * @param nom the nom to set
         */
	public void setNom(String nom) {
		this.nom = nom;
	}
 
}
Déclaration dans ma lib de tld :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 
<!-- Tag Date De Naissance -->
 <tag>
	<description>Tag date de naissance compose de 3 listes deroulantes</description>
	<name>dateDeNaissance</name>
	<tag-class>com.toto.taglib.DateDeNaissanceTag</tag-class>
	<body-content>empty</body-content><!-- JSP ou empty -->
	<attribute>
		<name>id</name>
		<required>true</required>
		<rtexprvalue>true</rtexprvalue>
		<type>java.lang.String</type>
	</attribute>
	<attribute>
		<description>Permet de ne pas faire le rendu du Tag.
				Différent de isSelected qui lui fait le rendu mais cache le &lt;Div&gt;
				principal du tag.
				</description>
		<name>isRendered</name>
		<required>true</required>
		<rtexprvalue>false</rtexprvalue>
		<deferred-value>
			<type>java.lang.Boolean</type>
		</deferred-value>
	</attribute>
	<attribute>
		<description>label date de naissance</description>
		<name>message</name>
		<required>true</required>
		<rtexprvalue>false</rtexprvalue>
		<deferred-value>
			<type>java.lang.String</type>
		</deferred-value>
	</attribute>
  <attribute>
   <description>
                A ValueExpression enabled attribute that, if present, will be
                used as the text of the validation message for the "required"
                facility, if the "required" facility is used.
            </description>
   <name>requiredMessage</name>
   <rtexprvalue>false</rtexprvalue>
   <deferred-value>
    <type>java.lang.String</type>
   </deferred-value>
	</attribute>
	<attribute>
   <description>
                Champs name de l'inputText
            </description>
   <name>nom</name>
   <required>true</required>
   <rtexprvalue>false</rtexprvalue>
   <deferred-value>
    <type>java.lang.String</type>
   </deferred-value>
  </attribute>
  <attribute>
   <description>
                The current value of this component.
            </description>
   <name>valueJour</name>
   <rtexprvalue>false</rtexprvalue>
   <deferred-value>
    <type>java.lang.Object</type>
   </deferred-value>
  </attribute>
  <attribute>
   <description>
                The current value of this component.
            </description>
   <name>valueMois</name>
   <rtexprvalue>false</rtexprvalue>
   <deferred-value>
    <type>java.lang.Object</type>
   </deferred-value>
  </attribute>
  <attribute>
   <description>
                The current value of this component.
            </description>
   <name>valueAnnee</name>
   <rtexprvalue>false</rtexprvalue>
   <deferred-value>
    <type>java.lang.Object</type>
   </deferred-value>
  </attribute>
  <attribute>
   <description>
                MethodExpression representing a validator method that will be called
                during Process Validations to perform correctness checks on the
                value of this component.  The expression must evaluate to a public
                method that takes FacesContext, UIComponent, and Object parameters,
                with a return type of void.
            </description>
   <name>validator</name>
   <rtexprvalue>false</rtexprvalue>
   <deferred-method>
    <method-signature>void validate(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)</method-signature>
   </deferred-method>
  </attribute>
  <attribute>
   <description>
                MethodExpression representing a validator method that will be called
                during Process Validations to perform correctness checks on the
                value of this component.  The expression must evaluate to a public
                method that takes FacesContext, UIComponent, and Object parameters,
                with a return type of void.
            </description>
   <name>valueChangeListener</name>
   <rtexprvalue>false</rtexprvalue>
   <deferred-method>
    <method-signature>void processValueChange(ValueChangeEvent event)</method-signature>
   </deferred-method>
  </attribute>
</tag>
Et le renderer :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
public class DateDeNaissanceRenderer extends Renderer {
 
	@Override
	public void encodeBegin(FacesContext context, UIComponent component)
			throws IOException {
		final ResponseWriter writer = context.getResponseWriter();
		final DateDeNaissanceComponent dateDeNaissanceComponent = (DateDeNaissanceComponent) component;
 
		writer.write(dateDeNaissanceComponent.getMessage());
 
		writer.startElement("select", dateDeNaissanceComponent);
		writer.writeAttribute("name", component.getClientId(context)+":ddnJour", null);
		writer.writeAttribute("id", component.getClientId(context)+":ddnJour", null);
 
		for (final EnumJourDateDeNaissance valeurJour : EnumJourDateDeNaissance
				.values()) {
 
			writer.startElement("option", dateDeNaissanceComponent);
 
			if(dateDeNaissanceComponent.getValueJour() != null) {
				if(dateDeNaissanceComponent.getValueJour().equals(valeurJour.getJour()))
					writer.writeAttribute("selected", "selected", null);
			}
 
			writer.writeAttribute("value", valeurJour.getJour(), null);
			writer.write(valeurJour.getJour());
			writer.endElement("option");
		}
		writer.endElement("select");
 
		writer.startElement("select", dateDeNaissanceComponent);
		writer.writeAttribute("name", component.getClientId(context)+":ddnMois", null);
		writer.writeAttribute("id", component.getClientId(context)+":ddnMois", null);
 
		for (final EnumMoisDateDeNaissance valeurMois : EnumMoisDateDeNaissance
				.values()) {
 
			writer.startElement("option", dateDeNaissanceComponent);
 
			if(dateDeNaissanceComponent.getValueMois() != null) {
				if(dateDeNaissanceComponent.getValueMois().equals(valeurMois.getMois()))
					writer.writeAttribute("selected", "selected", null);
			}
 
			writer.writeAttribute("value", valeurMois.getMois(), null);
			writer.write(valeurMois.getMois());
			writer.endElement("option");
		}
		writer.endElement("select");
 
		writer.startElement("select", dateDeNaissanceComponent);
		writer.writeAttribute("name", component.getClientId(context)+":ddnAnnee", null);
		writer.writeAttribute("id", component.getClientId(context)+":ddnAnnee", null);
 
		for (final EnumAnneeDateDeNaissance valeurAnnee : EnumAnneeDateDeNaissance
				.values()) {
 
			writer.startElement("option", dateDeNaissanceComponent);
 
			if(dateDeNaissanceComponent.getValueAnnee() != null) {
				if(dateDeNaissanceComponent.getValueAnnee().equals(valeurAnnee.getAnnee()))
					writer.writeAttribute("selected", "selected", null);
			}
 
			writer.writeAttribute("value", valeurAnnee.getAnnee(), null);
			writer.write(valeurAnnee.getAnnee());
			writer.endElement("option");
		}
 
	}
 
	@Override
	public void encodeEnd(FacesContext context, UIComponent component)
			throws IOException {
		final ResponseWriter writer = context.getResponseWriter();
		writer.endElement("select");
 
	}
 
 
}

Comment faire ?

Merci.