MyFaces Sandbox: inputSuggest Komponente furnktioniet nicht

Status
Nicht offen für weitere Antworten.

Steve™

Mitglied
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:

Code:
   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™

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

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


Code:
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™

Mitglied
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™

Mitglied
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:

Code:
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™

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

Reeny

Aktives Mitglied
*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 ... )
 
M

maki

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

Also nicht unterkriegen lassen Stevie!
 

Steve™

Mitglied
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™

Mitglied
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:

Code:
<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:

Code:
  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
Code:
 <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

Code:
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™

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

*.jsp:

Code:
<%@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}"/>
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben