2011-08-11 24 views
10

benim JSF sayfaNeden selectOneMenu ItemLabel'i dönüştürücüye gönderelim? bu olur neden


<h:form> 
    <h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}">     
    <p:ajax event="change" process="studlist" update="studdep" ></p:ajax> 
    <f:selectItems value="#{studBean.student}" var="s" 
        itemValue="#{s.studid}" itemLabel="#{s.name}"/> 
    <f:converter converterId="studentconverter"/> 
    </h:selectOneMenu> 
</h:form> 

dönüştürücü sınıfı bu dönüştürücü üzerinde (StudentConverter)


public Object getAsObject(FacesContext context, UIComponent component, String value) { 

Student studConvert= new Student(); 
List<Student> students=new ArrayList<Student>(); 
students=(ArrayList<Student>)((UISelectItems  
      component.getChildren().get(0)).getValue(); 
} 

Argüman 'Dize değeri' itemLabel i verir ?? i

cevap

17

getAsObject() içinde öğe değeri yerine öğe etiketini neden aldığınızdan emin değilim. Belki de getAsString() yanlış yapıyor ve öğrenci kimliğine göre öğrenci adını döndürüyor.

Herhangi bir şekilde, itemValue numaranızın kesinlikle doğru olmadığını söyleyebilirim.

<h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}"> 
    <f:selectItems value="#{studBean.student}" var="s" 
     itemValue="#{s.studid}" itemLabel="#{s.name}" /> 
    <f:converter converterId="studentconverter" /> 
</h:selectOneMenu> 

A dönüştürücü karmaşık bir Java nesne ve bir HTTP isteği parametre olarak sarılabilen, böylece, bir String gösterimi arasında dönüştürmek için kullanılacak amaçlanır. Ancak, öğrenci kimliğini tüm öğrenci nesnesinin yerine öğe değeri olarak belirtirsiniz. Bunun yerine tüm öğrenci nesnesini belirtmeniz gerekir. Ayrıca, #{studBean.selectedStudent}'un, öğrenci kimliğini temsil eden Long mülküne değil, Student özelliğine başvurduğundan emin olmalısınız. aşağıdaki gibi itemValue düzeltmek zaman

: o zaman

public String getAsString(FacesContext context, UIComponent component, Object value) { 
    // This method is called when item value is to be converted to HTTP request parameter. 
    // Normal practice is to return an unique identifier here, such as student ID. 
    Student student = (Student) value; 
    Long id = student.getStudid(); 
    return String.valueOf(id); 
} 

public Object getAsObject(FacesContext context, UIComponent component, String value) { 
    // This method is called when HTTP request parameter is to be converted to item value. 
    // You need to convert the student ID back to Student. 
    Long id = Long.valueOf(value); 
    Student student = someStudentService.find(id); 
    return student; 
} 

işe gerektiğini:

<h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}"> 
    <f:selectItems value="#{studBean.student}" var="s" 
     itemValue="#{s}" itemLabel="#{s.name}" /> 
    <f:converter converterId="studentconverter" /> 
</h:selectOneMenu> 

ve aşağıdaki gibi dönüştürücü (önemsiz nullchecks atlanmıştır). Başlangıçta vardı

Alternatif olarak, itemValue tutmak ve tamamen <f:converter> kaldırmak, ancak o zaman öğrenci kimliğini temsil eden bir Long özelliğine işaret etmek #{studBean.selectedStudent} değiştirmek zorunda.

+0

her zamanki gibi BalusC! Teşekkür – Mariah

1

Böyle olacak h:selectOneMenu

Sizin sayfanın f:selecitems özelliğinde selectItem listesini kullanmak zorunda bu ipe itemValue değnek;

<h:form> 
    <h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}"> 
    <p:ajax event="change" process="studlist" update="studdep" ></p:ajax>  
    <f:selectItems value="#{studBean.studentSelectItemList}" />  
    <f:converter converterId="studentconverter"/>  
    </h:selectOneMenu> 
</h:form> 

Arka kısımda, studentSelectItemList selectitem'ini doldurmanız gerekir.

private List<SelectItem> studentSelectItemList; 

//fill studentSelectItemList at the appropriate place 
    studentSelectItemList.add(new SelectItem(studentId,studentName)); 

Bu ayarlardan sonra, öğrenci kimliğini seç değeri olarak almalısınız.

+0

Bu herhangi bir değişiklik yaratmıyor. – BalusC

0

Bugün aynı problemi yaşadım.

yanlış render kaynaklanır:

<select ...> 
    <option>None</option> 
    <option value="1">First</option> 
    <option value="2">Second</option> 
</select> 

bir Boş dize yerine etiketi göndererek "Yok" seçeneği sonucu için value="" atlayarak.

Ancak bu çözmek ve ilk seçenek için oluşturucu yazma value="" sadece getAsString() boş döndürür asla emin olun yerine "" (boş dize) dönmek için.


@BalusC

<h:form id="form"> 
    ... 

    <p:selectOneMenu id="targetStep" value="#{action.targetStep}" required="true"> 
     <o:converter converterId="omnifaces.ListIndexConverter" list="#{entity.stepList}" /> 
     <f:selectItems var="step" value="#{entity.stepList}" itemLabel="#{step.name}" 
      itemValue="#{step}" /> 
    </p:selectOneMenu> 

    <p:commandButton process="@this" update="@widgetVar(stepDialog)" 
     oncomplete="PF('stepDialog').show()" icon="#{icons.addStep}" 
     value="#{bundle.addStep}"> 
     <f:setPropertyActionListener target="#{viewScope.step}" 
      value="#{s:newInstance('it.shape.edea2.jpa.WorkflowStep')}" /> 
    </p:commandButton> 

    <p:message for="targetStep" /> 

    ... 
</h:form> 

<p:dialog widgetVar="stepDialog" header="#{bundle.addStep}" modal="true" dynamic="true" 
    resizable="false"> 
    <h:form> 
     <p:panelGrid columns="2" styleClass="app-full-width"> 
      <h:outputLabel value="#{bundle.name}" /> 
      <h:panelGroup> 
       <p:inputText id="name" value="#{step.name}" required="true" /> 
       <p:message for="name" /> 
      </h:panelGroup> 

      ... 

      <f:facet name="footer"> 
       <p:commandButton process="@form" update="@form :form" 
        oncomplete="hideDialog('stepDialog', args)" icon="#{icons.confirm}" 
        value="#{bundle.confirm}"> 
        <p:collector value="#{step}" addTo="#{entity.stepList}" /> 
        <f:setPropertyActionListener target="#{action.targetStep}" 
         value="#{step}" /> 
       </p:commandButton> 
      </f:facet> 
     </p:panelGrid> 
    </h:form> 
</p:dialog> 

Sizin kurtarma :)

+0

Katılmıyorum. '# {S.studid} 'null (büyük olasılıkla bir Hizmet tarafından yüklenmemiş olan yeni bir Öğrenci örneği) ve' getAsString()', null submitValue (büyük olasılıkla) için null döndürüyorsa, bu durum ortaya çıkabilir. Ve bu snippet açıklıyor * Neden selectOneMenu ItemLabel'i dönüştürücüye gönderelim? *. Ancak, bu soruyu birkaç saat önce bulsaydım, o saatlerden kurtulurdum :) –

+0

Sık rastlanmadığını biliyorum, ancak bazen bu senaryoyla karşılaşıyorum, kullanıcının bir varlığı seçmesi ve seçim alanını genişletmesi gerekiyor. kendisi. Güncellenmiş cevapta gerçek kullanım durumu. –

0

BalusC (tekrar) için omnifaces.ListIndexConverter benim için bu çivilenmiş. Aynı sorun vardı ve daha önce BalusC dikkat çektim, dönüştürücümün getAsString() yöntemi, nesnemin "ad" özelliğini döndürdü.

@Override kamu Dize getAsString (FacesContext bağlam, UIComponent bileşen, Nesne değer) {

if (value == null || value.equals("")) { 
     return ""; 
    } 
    else { 
     return String.valueOf(((Employee) value).getfirstname()); 
    } 

} 

ben id dönmek için bu değişti ve beklendiği gibi çalışmaya başladı.

@Override kamu Dize getAsString (FacesContext bağlam, UIComponent bileşen, Nesne değer) {teorisini açıklamak için

if (value == null || value.equals("")) { 
     return ""; 
    } 
    else { 
     return String.valueOf(((Employee) value).getId()); 
    } 

} 

BalusC sizin çaba derece takdir edilmektedir. Sen harikasın!

İlgili konular