Bonjour,
Je réalise un composant qui me permettra de simplifier la tâche de création de page web.
Pour l'instant je bloque lors de la récupération de la valeur des attributs du composant.
Lorsque un attribut est de type String, j'ai une belle exception.
Ce qui n'est pas le cas s'il s'agit de type ValueExpression (${bean.property}). Mais cela ne foncionne pas pour autant car, j'ai un log dans la console qui me dit que le label est vide...
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 java.lang.IllegalArgumentException: Cannot convert toto of type class java.lang.String to class javax.el.ValueExpression at org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:380) at org.apache.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:46) at com.sun.facelets.tag.BeanPropertyTagRule$LiteralPropertyMetadata.applyMetadata(BeanPropertyTagRule.java:45) at com.sun.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:36) at com.sun.facelets.tag.MetaTagHandler.setAttributes(MetaTagHandler.java:62) at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:144) at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47) at com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314) at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169) at com.sun.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:64) at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:131) at com.sun.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:310) at com.sun.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:280) at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:68) at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47) at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49) at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47) at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25) at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248) at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294) at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273) at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:144) at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:113) at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49) at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25) at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95) at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:524) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) +- Component Tree <UIViewRoot locale="fr" renderKitId="HTML_BASIC" rendered="true" transient="false" viewId="/proxy.xhtml"> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> <title>Facelets: Number Guess Tutorial</title> <style type="text/css"> <!-- body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: small; } --> </style> </head> <body> <h1> </h1> <p> </UIViewRoot>
Quels sont mes erreurs? Merci d'avance pour votre aide et vos commentaires
JD
Voici le source de ma page xhtml
Voici le code java de ce composant
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 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:tm="http://ui.proxy.com/sample"> <body> <ui:composition template="/template.xhtml"> <ui:define name="title"></ui:define> <ui:define name="body"> <h:form id="helloForm"> <h:inputText value="#{samplebean.myDate}"></h:inputText><br/> <tm:input type="checkbox" label="#{samplebean.myDate}" ></tm:input><br/> <tm:input type="date" value="#{samplebean.myDate}"></tm:input><br/> <h:commandButton type="submit" id="submit" action="success" value="Submit"/> </h:form> </ui:define> This text will not be displayed. </ui:composition> </body> </html>
qui extend
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 public class UIIProxy extends UIIHtmlCommons { // public static final String COMPONENT_TYPE = "javax.faces.Input"; private String type; private ValueExpression label; private ValueExpression data; private ValueExpression value; public UIIProxy() { // FacesContext.getCurrentInstance(); // this.label = (ValueExpression) getAttributes().get("label"); } public String getFamily() { return "ui.proxy"; } public String getRendererType(){ return null; } public void decode(FacesContext context) { List<UIComponent> children = this.getChildren(); for (UIComponent child : children) if (child instanceof HtmlInputHidden) type = (String) ((HtmlInputHidden) child).getValue(); } void setUIInputChildren() { if (!getChildren().isEmpty()) return; UIInputFactory factory = new UIInputFactory(); UIInput input = factory.getUIInput(type); if (input == null) { System.out.println("no input, input is null."); return; } List<UIComponent> children = getChildren(); HtmlInputHidden h = new HtmlInputHidden(); HtmlOutputLabel l = null; children.add(h); if (label != null) { l = new HtmlOutputLabel(); if (label instanceof ValueExpression) l.setValueExpression("value", (ValueExpression) label); else l.setValue(label); } else { System.out.println("label not set for component"); } h.setValue(type); children.add(input); input.setValueExpression("value", value); if (factory.getLabelPosition() > 0 && l != null) { children.add(l); } } public String getType() { return type; } public void setType(String type) { this.type = type; } public ValueExpression getData() { return data; } public void setData(ValueExpression data) { this.data = data; } public ValueExpression getValue() { return value; } public void setValue(ValueExpression value) { System.out.println("value is " + value); this.value = value; } public void setLabel(ValueExpression label) { this.label = label; } }
Mon composant est déclaré dans le fichier sample.taglib.xml suivant
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 public abstract class UIIHtmlCommons extends UIComponentBase { protected String accesskey; protected String alt; protected String lang; protected int maxlength; protected String onblur; protected String onchange; protected String onclick; protected String ondblclick; protected String onfocus; protected String onkeydown; protected String onkeypress; protected String onkeyup; protected String onmousedown; protected String onmousemove; protected String onmouseout; protected String onmouseover; protected String onmouseup; protected String onselect; protected int size; protected String style; protected String styleClass; protected String tabindex; protected String title; // protected ValueExpression autocomplete; // protected ValueExpression converter; // protected ValueExpression converterMessage; // protected ValueExpression dir; // protected ValueExpression disabled; // protected ValueExpression immediate; // protected ValueExpression readonly; // protected ValueExpression required; // protected ValueExpression requiredMessage; // protected ValueExpression validatorMessage; // protected MethodExpression validator; // protected MethodExpression valueChangeListener; abstract void setUIInputChildren(); public UIIHtmlCommons() { } public void encodeBegin(FacesContext context) throws IOException { setUIInputChildren(); super.encodeBegin(context); } public String getDebugString() { return (new StringBuilder()).append("id: ").append(getId()).append(" class: ").append(getClass().getName()).toString(); } public String getAccesskey() { return accesskey; } public void setAccesskey(String accesskey) { this.accesskey = accesskey; } public String getAlt() { return alt; } public void setAlt(String alt) { this.alt = alt; } public String getLang() { return lang; } public void setLang(String lang) { this.lang = lang; } public int getMaxlength() { return maxlength; } public void setMaxlength(int maxlength) { this.maxlength = maxlength; } public String getOnblur() { return onblur; } public void setOnblur(String onblur) { this.onblur = onblur; } public String getOnchange() { return onchange; } public void setOnchange(String onchange) { this.onchange = onchange; } public String getOnclick() { return onclick; } public void setOnclick(String onclick) { this.onclick = onclick; } public String getOndblclick() { return ondblclick; } public void setOndblclick(String ondblclick) { this.ondblclick = ondblclick; } public String getOnfocus() { return onfocus; } public void setOnfocus(String onfocus) { this.onfocus = onfocus; } public String getOnkeydown() { return onkeydown; } public void setOnkeydown(String onkeydown) { this.onkeydown = onkeydown; } public String getOnkeypress() { return onkeypress; } public void setOnkeypress(String onkeypress) { this.onkeypress = onkeypress; } public String getOnkeyup() { return onkeyup; } public void setOnkeyup(String onkeyup) { this.onkeyup = onkeyup; } public String getOnmousedown() { return onmousedown; } public void setOnmousedown(String onmousedown) { this.onmousedown = onmousedown; } public String getOnmousemove() { return onmousemove; } public void setOnmousemove(String onmousemove) { this.onmousemove = onmousemove; } public String getOnmouseout() { return onmouseout; } public void setOnmouseout(String onmouseout) { this.onmouseout = onmouseout; } public String getOnmouseover() { return onmouseover; } public void setOnmouseover(String onmouseover) { this.onmouseover = onmouseover; } public String getOnmouseup() { return onmouseup; } public void setOnmouseup(String onmouseup) { this.onmouseup = onmouseup; } public String getOnselect() { return onselect; } public void setOnselect(String onselect) { this.onselect = onselect; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public String getStyle() { return style; } public void setStyle(String style) { this.style = style; } public String getStyleClass() { return styleClass; } public void setStyleClass(String styleClass) { this.styleClass = styleClass; } public String getTabindex() { return tabindex; } public void setTabindex(String tabindex) { this.tabindex = tabindex; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
lui même déclaré dans mon web.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <?xml version="1.0"?> <!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd"> <facelet-taglib> <namespace>http://ui.proxy.com/sample</namespace> <tag> <tag-name>input</tag-name> <component> <component-type>ui.proxy</component-type> </component> </tag> </facelet-taglib>
voici le fichier faces-config.xml
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 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- Use Documents Saved as *.xhtml --> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <!-- Special Debug Output for Development --> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/facelets/tags/sample.taglib.xml;</param-value> </context-param> <!-- Optional JSF-RI Parameters to Help Debug --> <context-param> <param-name>com.sun.faces.validateXml</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>com.sun.faces.verifyObjects</param-name> <param-value>true</param-value> </context-param> <!-- Faces Servlet --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <security-constraint> <display-name>welcome page</display-name> <web-resource-collection> <web-resource-name>No-JSP-JSF-Page</web-resource-name> <url-pattern>/welcomeJSF.jsp</url-pattern> </web-resource-collection> <auth-constraint> <description>Pas de rôles, donc pas daccès direct</description> </auth-constraint> </security-constraint> </web-app>
ai oublié la UIInputFactory
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 <?xml version='1.0' encoding='UTF-8'?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2"> <component> <component-type>ui.proxy</component-type> <component-class>com.sample.UIIProxy</component-class> </component> <managed-bean> <managed-bean-name>samplebean</managed-bean-name> <managed-bean-class>com.sample.SampleBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> <application> <!-- facelets configuration --> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> <!-- --> <resource-bundle> <base-name>jsf_messages</base-name> <var>bundle</var> </resource-bundle> <message-bundle>jsf_messages</message-bundle> <locale-config> <default-locale>en</default-locale> <supported-locale>de</supported-locale> <supported-locale>fr</supported-locale> <supported-locale>es</supported-locale> </locale-config> </application> <navigation-rule> <from-view-id>/index.xhtml</from-view-id> </navigation-rule> </faces-config>
et enfin mon bean
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 public class UIInputFactory { private int labelPosition = 0; private boolean containsList; UIInput getUIInput(String type) { System.out.println("getUIInput for type:" + type); UIInput ui = new HtmlInputText(); if (type == null) return ui; if (type.equals("checkbox")) { ui = new UISelectBoolean(); labelPosition = 1; else if (type.equals("date")) ui = new HtmlInputText(); return ui; } public int getLabelPosition() { return labelPosition; } public boolean isContainsList() { return containsList; } }
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 public class SampleBean implements Serializable { private String myString="not null"; private Date myDate=new Date(); private Boolean myBoolean; private boolean myBoolean2; private Date[] myDates; private int myInt; private Integer myInteger; public String getMyString() { return myString; } public void setMyString(String myString) { this.myString = myString; } public Date getMyDate() { return myDate; } public void setMyDate(Date myDate) { this.myDate = myDate; } public Boolean getMyBoolean() { return myBoolean; } public void setMyBoolean(Boolean myBoolean) { this.myBoolean = myBoolean; } public boolean isMyBoolean2() { return myBoolean2; } public void setMyBoolean2(boolean myBoolean2) { this.myBoolean2 = myBoolean2; } public Date[] getMyDates() { return myDates; } public void setMyDates(Date[] myDates) { this.myDates = myDates; } public int getMyInt() { return myInt; } public void setMyInt(int myInt) { this.myInt = myInt; } public Integer getMyInteger() { return myInteger; } public void setMyInteger(Integer myInteger) { this.myInteger = myInteger; } }
Partager