# MyFaces Sandbox: inputSuggest Komponente furnktioniet nicht



## Steve™ (6. Feb 2008)

1.) Hallo
2. Ich habe ein Problem: 

3.) MyFaces Sandbox jar 1.1.7: http://people.apache.org/maven-snap...ces/tomahawk/tomahawk-sandbox/1.1.7-SNAPSHOT/
4.) web.xml entsprechend erweitert
5.) Entsprechende Methode in BackinBean
6.) im header von testseite.jsp definiert:
    <%@ taglib uri="http://myfaces.apache.org/sandbox" prefix="s"%>

    ...


    <s:inputSuggest id="libarticle" required="true">
           <f:selectItems value="#{ContactBean.contactTypes}"/> //contactTypes vom Typ SelectItem
    </s:inputSuggest>


7.) Konsolenausgabe beim starten: 


```
06.02.2008 14:10:27 org.apache.catalina.core.ApplicationDispatcher invoke
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: java.util.ArrayList
	at org.apache.myfaces.custom.suggest.InputSuggestRenderer.getChoices(InputSuggestRenderer.java:224)
	at org.apache.myfaces.custom.suggest.InputSuggestRenderer.encodeBegin(InputSuggestRenderer.java:100)
	at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:515)
	at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.renderChild(RendererUtils.java:412)
	at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.renderChildren(RendererUtils.java:400)
	at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.renderChild(RendererUtils.java:417)
	at org.apache.myfaces.renderkit.html.ext.HtmlTableRenderer.renderColumnBody(HtmlTableRenderer.java:608)
	at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlTableRendererBase.encodeColumnChild(HtmlTableRendererBase.java:306)
	at org.apache.myfaces.renderkit.html.ext.HtmlTableRenderer.encodeColumnChild(HtmlTableRenderer.java:512)
	at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlTableRendererBase.encodeInnerHtml(HtmlTableRendererBase.java:282)
	at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlTableRendererBase.encodeChildren(HtmlTableRendererBase.java:134)
	at org.apache.myfaces.renderkit.html.ext.HtmlTableRenderer.encodeChildren(HtmlTableRenderer.java:187)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:527)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:414)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChildren(RendererUtils.java:400)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:417)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChildren(RendererUtils.java:400)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:417)
	at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChildren(RendererUtils.java:400)
	at org.apache.myfaces.shared_impl.renderkit.html.HtmlGroupRendererBase.encodeEnd(HtmlGroupRendererBase.java:78)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:539)
	at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.renderChild(RendererUtils.java:419)
	at org.apache.myfaces.custom.tabbedpane.HtmlTabbedPaneRenderer.writeTabsContents(HtmlTabbedPaneRenderer.java:550)
	at org.apache.myfaces.custom.tabbedpane.HtmlTabbedPaneRenderer.encodeEnd(HtmlTabbedPaneRenderer.java:232)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:539)
	at javax.faces.webapp.UIComponentTag.encodeEnd(UIComponentTag.java:498)
	at javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:366)
	at org.apache.myfaces.shared_tomahawk.taglib.UIComponentBodyTagBase.doEndTag(UIComponentBodyTagBase.java:57)
	at org.apache.jsp.main_005fperson_jsp._jspx_meth_t_005fpanelTabbedPane_005f0(main_005fperson_jsp.java:1339)
	at org.apache.jsp.main_005fperson_jsp._jspx_meth_f_005fsubview_005f3(main_005fperson_jsp.java:1120)
	at org.apache.jsp.main_005fperson_jsp._jspx_meth_h_005fform_005f1(main_005fperson_jsp.java:652)
	at org.apache.jsp.main_005fperson_jsp._jspService(main_005fperson_jsp.java:349)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:691)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
	at org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:419)
	at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
	at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
	at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:100)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
```


8. seufz


----------



## Steve™ (6. Feb 2008)

warum gibt es hier eine classcast exception: siehe hier:http://example.irian.at/example-sandbox-20080206/inputSuggest.jsf


----------



## Steve™ (7. Feb 2008)

Ok, mit einer Map funktioniert es nun. Wo auch immer das in der Doku stehen sollte ?!


```
<s:inputSuggest forceId="tru" required="true">
  <f:selectItems value="#{ContactBean.contactTypes}"/> //contactTypes vom Typ Map
</s:inputSuggest>
```



```
class ContactBean {
 
 public Map<String,String getContactTypes() {  
 }

}
```


Nun möchte ich den css style anpassen. Leider hat das Tag ja kein style oder styleClass Attribut. 
Stattdessen gibt es das Tag styleLocation. Aber auch hier finde ich ganzen Internetz keine gescheite Info oder ein Beispiel in der Doku wie das verwendet wird.


----------



## Steve™ (7. Feb 2008)

Schade eigentlich. Das sah eigentlich ganz gut aus. Aber das scheint innerhalb einer DataTable nicht zu funktionieren. Das Popup wird immer nur unter dem letzten TextFeld angezeigt und dort auch der selektierte Wert eingetragen. 
Ich klopp den Sandbox Rotz nun in die Tonne.


----------



## Steve™ (8. Feb 2008)

Hm, mal gucken was man sonst noch machen könnte. also ich brauche eine autosuggest Box. Hier gibt es ein paar schöne Beispiele:

http://www.javascript-examples.com/autocomplete-demo/


Bevor ich nun wieder Tage mit dem Quatsch verbringe.  Hat jemand sowas schonmal in einer Java Web bzw. JSF Anwendung eingesetzt ?


----------



## Steve™ (10. Feb 2008)

Hm, weiter gehts. Also am besten wäre die Verwendung der scriptacolus Bibliothek. 

http://wiki.script.aculo.us/scriptaculous/show/Ajax.Autocompleter


Allerdings weiß ich nicht, wie ich z.B. diese Funktion in einer jsp Seite verwenden kann, bzw. eigentlich gibt es nur Probleme mit dem 3.Parameter url:


```
new Ajax.Autocompleter(id_of_text_field, id_of_div_to_populate, url, options);
```

Hier soll also ein url stehen, am liebsten würde ich hier aber eine Collection übergeben. Wie könnte man diese Funktion in einer jsp Seite einsetzen.


----------



## Steve™ (11. Feb 2008)

Mist, hat auch nicht hingehaut. Auf gehts zum nächsten Versuch: RichFaces und <rich:autosuggest>. 
Hab ja noch ein paar Monate Zeit.


----------



## Reeny (12. Feb 2008)

**lol**

Irgendwie interessant zuzusehen, wie du dein Problem hier alleine löst  :lol: 

(obwohl es trotzdem blöd ist, dass dir da keiner helfen kann ... )


----------



## maki (12. Feb 2008)

Kann zwar nicht helfen, finde es aber nützlich, irgendwann wollen die User hier das bestimmt auch.

Also nicht unterkriegen lassen Stevie!


----------



## Steve™ (12. Feb 2008)

Dachte schon ich kann das hier als privaten Blog benutzen <lach>

Um die Frage nach dem Sinn und "warum nicht anders lösen" etc auch zu klären: Der Kunde möchte das so haben, deswegen gibts einfach keine Alternative.

Wenn sich ein neuer Benutzer anmeldet, gibt er seine PLZ an. Danach soll er bei der Eingabe des Ortes eben eine Box angezeigt bekommen, die gefundene Orte zu seiner eingegeben PLZ anzeigt. Gleichzeit soll er aber auch einen beliebigen Ort angeben können, für den Fall dass irgendein Kuhkaff nicht in der DB ist. Alles klar ?

Mach dann mal weiter. Das mit den RichFaces könnte hinhauen, und man muss sich doch nicht arg mit diesen ganzen divergierenden technologien rumschlagen. 

Aber die Sandbox Komponenten sind derzeit (noch) nicht zu empfehlen. Sobald etwas ein wenig angepasst oder spezieller sein soll, kann man es vergessen. Zu viele unschöne Sideeffekte. Dies gilt vor allem für die <s:suggest> und <s:modalDialog> Komponente, für die ich Tage meine Zeit verschwendt habe.


----------



## Steve™ (12. Feb 2008)

Meine sehr verehrten Damen und Herren, verehrte Ministerpräsidenten aller Länder, liebe Kinder, geehrter 
Ronald McDonald, 

hiermit beende ich den Terror und gebe bekannt, dass das gewünschte Ziel durch Einsatz der RichFaces 
Komponente 'RichFacesSuggestionBox' erreicht wurde. Einen Ansatz für das dynamische Laden von Daten
in Abhängigkeit der Nutzereingabe und Auswahl dieser Daten über eine Popup Box entnehmen Sie
bitte dem Anhang. 

<Blog ab sofort geschlossen>


Beispiel Textbox für PLZ:


```
<t:inputText id="plz" value="#{address.plz}" styleClass="doener" maxlength="5">
     <a4j:support event="onblur" actionListener="#{AddressBean.resolveCity}"/>
      <%-- row = eingegbene Wert des Benutzers --%>
     <a4j:actionparam id="zip" name="zip" value="#{row}"/>                
</t:inputText>
```


AddressBean: Verarbeiten der Action durch AjaxRequest bei onblur Event: 


```
class AddressBean {

       private List<String>availableCities;

        ...

	public void resolveCity(final ActionEvent event) {

           final String plz = ((HtmlInputText) event.getComponent().findComponent("plz")).getValue().toString();
           //DB Abfrage und Liste füllen
	   setAvailableCities(DBObject.getCitiesForPLZ(plz));
	

	}
         
        ...
   }
```



Textinput für den Ort und Anzeigen der SuggestBox bei Nutzereingabe

```
<t:inputText value="#{address.city}" id="suggest"/>                   
             <rich:suggestionbox 
                    id="box"
                    width="200" 
                    height="200"
                    for="suggest"            
                    suggestionAction="#{AddressBean.suggest}"
                    var="text"
                    fetchValue="#{text.city.name}"             
                    nothingLabel="PLZ nicht gefunden"            
              >       
              
    	    	<h:column>
	    	   <h:outputText value="#{text.city.name}"/>
        	</h:column>
             </rich:suggestionbox>
```


AdressBean: Zurückgeben der in resolveCity() ermittelten Einträge


```
public List<String> suggest (Object event) {
  
           String prefix = event.toString();

           System.out.println("Nutzereingabe: "+prefix);
           //ggfalss durch Liste iterieren und Elemente mit prefix verbinden für echte 'suggest'Action
		
	   return availableCities;
}
```


----------



## Steve™ (12. Feb 2008)

achso, in die entsprechende jsp Seite muss noch die saveState der Liste angegeben , sonst fliegen einem die Nullen um die Ohren:

*.jsp:


```
<%@page contentType="text/html; charset=utf-8"%>
<%@page pageEncoding="utf-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="t" uri="http://myfaces.apache.org/tomahawk"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%> 


<t:saveState value="#{AddressBean.availableCities}"/>
```


----------

