2012-04-02 16 views
1

Ich brauche Hilfe bei einem Problem. Ich habe eine Anwendung, die Daten aus der Datenbank anzeigt.Ist es möglich, benutzerdefinierten JSF-Konverter für UISelectOne zu verwenden, abhängig vom Wert der Bean-Eigenschaft oder des UIInputText-Werts?

In der Datenbank verwende ich eine Spalte für die Identifizierung eines Objekts mit Änderungen in der Zeit (Version des Objekts). Ich meine, dass Zeilen unterschiedliche IDs haben, aber gleiche OBJECT_ID. Sie unterscheiden sich auch durch Validität DATE Spalten (VALID_FROM und VALID_TO), so dass ich die richtige Version des Objekts in ausgewählten Zeit finden kann.

Wenn dem Benutzer die Seite angezeigt wird, legt er DATE für die Anzeige der Daten fest. Es gibt ein Formular auf der Seite mit Select-Boxen (ihre Objekte sind Objekte aus der Datenbank). Ich muss nur Elemente anzeigen, die die Gültigkeitsbedingung erfüllen. Alles ist in Ordnung vor der Formularbehandlung.

Ich benutze benutzerdefinierte Konverter, der String-Wert (ID der Zeile in der Datenbanktabelle) in Objekt meines Modells konvertiert, aber ich brauche zwei Werte für die Zeile zu finden. (ID und DATE vom Benutzerformular).

Konvertermethode getAsObject erhält nur einen VALUE-Parameter (ID aus der Auswahlbox). Wie bekomme ich den zweiten Parameter zur Arbeit? Kann ich es von Bean oder vom JSF-Eingabeobjekt finden?

Wenn es eine Möglichkeit gibt, < f: attribute /> zu verwenden, gibt es Möglichkeit, < f: Attribut /> durch Java-Code in Bean? (Das Formular wird mit der Bean-Methode generiert).

ich für mein Englisch bedaure, ich versuche mein Bestes: o)

P. S .: Datum Parameter ist wichtig in sqlMap wegen verwendet JOIN.Ich suche nach ID, aber auch andere Tabellen werden von OBJECT_ID (version) = beigetreten> und ich brauche nur nach Antworten

Dank einer Reihe zu bekommen und haben einen schönen Tag

Worsik

Edit: Select Boxen werden von diesem Code generiert:

   uiInput = new HtmlSelectOneMenu(); 
       UISelectItems items = new UISelectItems(); 
       items.setValueExpression("value", createValueExpression(
         "#{myBean.referencedList." + item.getName() + "}", 
          List.class)); 
       uiInput.getChildren().add(items); 

Converter Methode sieht wie folgt aus:

public Object getAsObject(FacesContext context, UIComponent component, String value) 
{ 
    if (value.equals("")) { 
     return null; 
    } 
    Class entityType = component.getValueExpression("value").getType(
      FacesContext.getCurrentInstance().getELContext()); 
    // TODO: need to get date value from form 
      Date day = new Date(); 
    return myService(context).findEntityById(entityType, Long.valueOf(value), day); 
} 

entityType Klasse-Modell ist für das Objekt aus der Datenbank

myService ruft Dao Objekt und sqlMap ist

select * from object_table as t1 
JOIN other_table as t2 ON t1.object_fk = t2.object_id // (or version_id) 
where t1.id = #id:INTEGER# 
and t2.valid_from <= #day:DATE# 
and t2.valid_to >= #day:DATE# 
+0

ich herausgefunden helfen wird, wie dies zu tun, indem nach Code im Konverter: 'code' Datum Tag = (Datum) component.getAttributes(). get ("dateForSearch"); 'code' und in Bean-Methode nach dem Erzeugen von SelectBox mit Code: 'code' uiInput.getAttributes(). Put ("dateForSearch", getSelectedDate()); 'code' und in Seiten ohne dynamische Erzeugung von Formen i verwendet: 'code' ... 'code' Ich hoffe, dass dies nicht nur selbst beantwortet Frage und wird jemand anderen helfen Worsik – Worsik

Antwort

1

ich herausgefunden, wie dies durch den Code in Konverter von <f:attribute/> zu tun genannt:

Date day = (Date) component.getAttributes().get("dateForSearch"); 

und in Bean-Methode nach dem Generieren von SelectBox mit Code:

uiInput.getAttributes().put("dateForSearch", getSelectedDate()); 

und in Seiten ohne dynamische Erzeugung von Formen i verwendet:

<SelectOneMenu> 
... 
<f:attribute name="dateForSearch" value="#{myBean.selectedDate}" /> 
</SelectOneMenu> 

ich, dass diese Hoffnung nicht nur Selbst Frage beantwortet wird und jemand anderes