Przesyłanie parametru pomiędzy stronami.

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:

            <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

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

wywołuję metodę editStart:

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

które przekierowuje mnie na stronę adminEdit:

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

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

i odbierania w metodzie:

    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

<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?

0

Pomoże ktoś?

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1