Przesyłanie parametru pomiędzy stronami.

Przesyłanie parametru pomiędzy stronami.
O1
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam. Mam stronę, na której wyświetlam tabelę i mam możliwość edycji, dodania i usunięcia. Dodawanie i usuwanie działało od początku ok. Z edycją miałem problem, udało mi się naprawić, ale mam wątpliwości czy zrobiłem to w prawidłowy sposób. Czy nie ma jakiejś lepszej praktyki.

Moja strona:

Kopiuj
            <h:form id="form">
                <p:dataTable styleClass="table" value="#{userMB.allAdmins}" var="admin" paginator="true" rows="15" rowKey="#{admin.id}" selection="#{userMB.user}" selectionMode="single">
                    
                    <f:facet name="header">
                        Lista administratorów
                    </f:facet>

                    <p:column headerText="#{msg.firstName}">
                        <h:outputText value="#{admin.firstName}" />
                    </p:column>

                    <p:column headerText="#{msg.lastName}">
                        <h:outputText value="#{admin.lastName}" />
                    </p:column>

                    <p:column headerText="#{msg.personalId}">
                        <h:outputText value="#{admin.personalId}" />
                    </p:column>
                                        <p:column headerText="#{msg.personalId}">
                        <h:outputText value="#{admin.id}" />
                    </p:column>
                    <f:facet name="footer">

                        <p:commandButton id="viewButton" value="#{msg.info}" icon="ui-icon-search"  
                                         update=":form:display" oncomplete="userDialog.show()"/>
                        <p:commandButton action="#{userMB.createStart()}" value="#{msg.add}" icon="ui-icon-plus" />
                        <p:commandButton action="#{userMB.editStart()}" value="#{msg.edit}" >
                        </p:commandButton>
                        <p:commandButton action="#{userMB.deleteUser()}" value="#{msg.delete}" icon="ui-icon-close"/>
                    </f:facet>
                </p:dataTable>

                <p:dialog id="dialog" header="Administrator" widgetVar="userDialog" resizable="false"
                          width="300" showEffect="clip" hideEffect="explode">

                    <h:panelGrid id="display" columns="2" cellpadding="4">

                        <f:facet name="header">
                            <p:graphicImage value="./../../images/person4.png" width="150" height="150"/>
                        </f:facet>

                        <h:outputText value="#{msg.firstName}" />
                        <h:outputText value="#{userMB.user.firstName}" />

                        <h:outputText value="#{msg.lastName}" />
                        <h:outputText value="#{userMB.user.lastName}" />

                        <h:outputText value="#{msg.personalId}" />
                        <h:outputText value="#{userMB.user.personalId}" />

                    </h:panelGrid>
                </p:dialog>

            </h:form> 

Więc tak przy edycji

Kopiuj
<p:commandButton action="#{userMB.editStart()}" value="#{msg.edit}" >

wywołuję metodę editStart:

Kopiuj
    public String editStart() {
        return "editStart";
    }

które przekierowuje mnie na stronę adminEdit:

Kopiuj
        <navigation-case>
            <from-outcome>editStart</from-outcome>
            <to-view-id>/protected/admin/adminEdit.xhtml</to-view-id>
            <redirect/>
        </navigation-case>

I tu cały problem. Za każdym razem kiedy przechodziłem na stronę edit wyświetlały mi się puste pola, w których docelowo miały znajdować się dane edytowanego Usera. Próbowałem różnych sposobów, np takiego przesyłania parametrów:

Kopiuj
                        <p:commandButton action="#{userMB.editStart()}" value="#{msg.edit}" >
                                         <f:param name=toEdit value="UserMB.user.id">
                        </p:commandButton>

i odbierania w metodzie:

Kopiuj
    public String editStart() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap();
        String userIdStr = requestParameterMap.get("toEdit").toString();
        System.out.println("haha" + userIdStr);
        Integer userId = Integer.parseInt(userIdStr);
        this.user = userDao.find(userId);
        System.out.println(user.getFirstName());
        return "editStart";
    } 

Wszystko było odbierane prawidłowo. Sprawdzałem printlanem i było ok. Ale przy przejściu na stronę nadal były puste pola. Problem minął gdy usunąłem z faces-config przy tej stronie

Kopiuj
<redirect/>

I tutaj moje pytanie czy to dobre podejście? Takie usunięcie przeadresowania? Czy są może jakieś inne wyjścia? Domyślam się, że wcześniej nie działało bo przy przeadresowaniu traciliśmy naszego usera, ponieważ jest on beanem ustawionym na request.
Czy taka praktyka jest prawidłowa? Są jakieś inne, lepsze wyjścia?

O1
  • Rejestracja: dni
  • Ostatnio: dni
0

Pomoże ktoś?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Nie bardzo rozumiem pytanie. Jeśli masz bean ze scopem request to jest on ważny tylko pomiędzy jedną wymianą request-response. Przekierowanie to jest nowy request i nowy response. To nie jest tylko "zmiana adresu". Innym rozwiązaniem jest ustawienie scope beana na session ;] Ale to pewnie wiesz.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.