2013-08-25 3 views
5

Otrzymuję następujący błąd: Nie można znaleźć pasującego przypadku nawigacyjnego z identyfikatorem widoku '/index.xhtml 'for action' # {medcontroller.getMedGeneric} 'z wynikiem' [email protected] 'Nie można znaleźć pasującego przypadku nawigacyjnego z ID-do-widoku '/index.xhtml' dla akcji: JSF

Jestem nowy w jsf i nie mam pojęcia o rozwiązaniu tego błędu. Mam ManagedBean z następującego kodu:

MedController.java

@ManagedBean(name = "medcontroller") 
@SessionScoped 

public class MedController implements Serializable { 
    int startId; 
    String gName; 
    int endId; 
    DataModel medNames; 
    //DataModel medGeneric; 
    MedicineHelper helper; 
    private int recordCount = 1000; 
    private int pageSize = 10; 
    private Medicine current; 
    private int selectedItemIndex; 

    public MedController() { 
     helper = new MedicineHelper(); 
     startId = 1; 
     endId = 10; 
    } 

    public MedController(int startId, int endId) { 
     helper = new MedicineHelper(); 
     this.startId = startId; 
     this.endId = endId; 
    } 

    public Medicine getSelected() { 
     if (current == null) { 
      current = new Medicine(); 
      selectedItemIndex = -1; 
     } 
     return current; 
    } 

    public DataModel getMedNames() { 
     if (medNames == null) { 
      medNames = new ListDataModel(helper.getMedNames(startId, endId)); 
     } 
     return medNames; 
    } 

    public String getgName() 
     { 
     return gName; 
    } 

    public void setgName(String gName) 
     { 
     this.gName = gName; 
    } 

    public DataModel getMedGeneric() { 
     if (medNames == null) { 
      medNames= new ListDataModel(helper.getMedGeneric(gName)); 
     } 
     return medNames; 
    } 

    void recreateModel() { 
     medNames = null; 
    } 

    public boolean isHasNextPage() { 
     if (endId + pageSize <= recordCount) { 
      return true; 
     } 
     return false; 
    } 

    public boolean isHasPreviousPage() { 
     if (startId-pageSize > 0) { 
      return true; 
     } 
     return false; 
    } 

    public String next() { 
     startId = endId+1; 
     endId = endId + pageSize; 
     recreateModel(); 
     return "index"; 
    } 

    public String previous() { 
     startId = startId - pageSize; 
     endId = endId - pageSize; 
     recreateModel(); 
     return "index"; 
    } 

    public int getPageSize() { 
     return pageSize; 
    } 

    public String prepareView(){ 
     current = (Medicine) getMedNames().getRowData(); 
     return "browse"; 
    } 
    public String prepareList(){ 
     recreateModel(); 
     return "index"; 
    } 

} 

I tu jest mój plik JSF

index.xhtml

<ui:define name="body"> 
    <h:form styleClass="jsfcrud_list_form"> 
    <h:commandLink action="#{medcontroller.previous}" value="Previous #{medcontroller.pageSize}" rendered="#{medcontroller.hasPreviousPage}"/> 
    <h:commandLink action="#{medcontroller.next}" value="Next #{medcontroller.pageSize}" rendered="#{medcontroller.hasNextPage}"/> 
    <h:dataTable value="#{medcontroller.medNames}" var="item" border="1" cellpadding="15" cellspacing="10" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px"> 
    <h:column> 
     <f:facet name="header"> 
      <h:outputText value="BrandName"/> 
     </f:facet> 
      <h:outputText value="#{item.brandName}"/> 
    </h:column> 
    <h:column> 
     <f:facet name="header"> 
      <h:outputText value="Generic"/> 
     </f:facet> 
      <h:outputText value="#{item.generic}"/> 
    </h:column> 
    <h:column> 
     <f:facet name="header"> 
      <h:outputText value=" "/> 
     </f:facet> 
      <h:commandLink action="#{medcontroller.prepareView}" value="View"/> 
    </h:column> 
    </h:dataTable> 

    <h:inputText value="#{medcontroller.gName}" /> 
    <h:commandButton value="Submit" action="#{medcontroller.getMedGeneric}" /> 
    </h:form> 
</ui:define> 

Proszę mi pomóc rozwiązać ten błąd. Ponadto nie mam pliku faces-config.xml. Korzystam z aplikacji internetowej netbeans ide 7.1.2 z jsf i strukturą hibernacji.

Z góry dziękuję.

+0

zapomniałeś powiedzieć, co dokładnie chcesz się zdarzyć, że po naciśnięciu przycisku „wyślij”. – BalusC

Odpowiedz

5

<h:commandButton action> musi wskazywać na metody, która wywołuje pewną logikę biznesową i powraca albo void lub String reprezentujący stronę docelową, którą chcesz (RE) wyświetlacza. Jednakże zwróciłeś cały kod ListDataModel, który nie ma żadnego sensu dla programu obsługi nawigacyjnej JSF, a zatem i dla tego błędu.

Coś jak to powinno zrobić:

public String getMedGeneric(){ 
    // Do your business logic here. 

    return "someViewId"; 
} 

Będzie nawigować do someViewId.xhtml. Jeśli jednak zamierzasz trzymać się tego samego widoku, pozwól mu zwrócić void (lub null) i ponownie wyświetli ten sam widok.

public void getMedGeneric(){ 
    // Do your business logic here. 
} 

Nawiasem mówiąc, to naprawdę biedny konwencja nazewnictwa prefiks nazwy metod działania z get. Jest to mylące i sprawia, że ​​twój kod nie jest samoporządkowany. Raczej nadaj mu nazwę loadMedGeneric() lub coś podobnego. Po prostu zgaduję, że nigdzie nie powiedziałeś o konkretnym wymaganiu funkcjonalnym, co dokładnie powinien robić ten przycisk.

+0

Dzięki, zadziałało. – GobSmack

+0

Zrobione, jeszcze raz dziękuję. – GobSmack

0

getMedGeneric powinien zwrócić java.lang.String, który reprezentuje nawigację na inną stronę opisaną w faces-config.xml. W twoim przypadku zwraca jakiś model, więc nie będzie działać niefortunnie. Postarajmy się umieścić akcję getMedGeneric() w actionListener, a następnie w action put navigation String. tj:

action="navString" actionListener="#{medcontroller.getMedGeneric}" 
+1

Dzięki za odpowiedź, ale to nie działa, nadal pokazuje błąd: Nie można znaleźć pasującego nawigatora z id-widoku '/index.xhtml' dla działania 'navString' z wynikiem 'navString' – GobSmack

-2

powinieneś spróbować właśnie

actionListener="#{medcontroller.getMedGeneric}" 
Powiązane problemy