0

ツアーと呼ばれるjsfページとtourControllerがあります。ツアーでは、primefaces datagridを使用してツアーアイテムを表示し、commandLinkを使用して各アイテムにビューリンクを追加します。問題は、リンクをクリックすると、viewTourページに移動する代わりに、tours.xhtmlの同じページが表示されることです。そしてしばらくすると、ビューが期限切れになったと表示されるので、どこかに行くようです。これが私のコードです:

TourController.java viewTourメソッド:

public String viewTour(){
    current = (Tour) getItems().getRowData();
    selectedItemIndex = pagination.getPageFirstItem()+getItems().getRowIndex();
    return "ViewTour";
}

tours.xhtmlデータグリッド:

<h:form id="list">
            <p:dataGrid var="item" value="#{tourController.items}" columns="4" rows="20" paginator="true">                
                <p:panel>
                    <p:panelGrid style="width: 180px; height: 200px">   
                        <f:facet name="header">
                            <p:row><p:column colspan="2"><h:outputText value="#{item.destination}"/></p:column></p:row>
                        </f:facet>
                        <p:row>
                            <p:column colspan="2" style="text-align: center">
                                <h:commandLink id="viewTour" action="#{tourController.viewTour()}" style="color: darkred; font-weight: bold">
                                    <h:outputText value="#{item.description}"/>
                                </h:commandLink>                                    
                            </p:column>
                        </p:row>                            
                        <p:row>
                            <p:column rowspan="2" style="vertical-align: middle">
                                <h:outputText value="#{item.company}"/><br/>                               
                                <h:outputText value="#{item.phone}"/><br/>
                                <a href="mailto:#{item.email}"><h:outputText value="#{item.email}"/></a><br/>
                                <a href="#{item.websiteurl}"><h:outputText value="#{item.websiteurl}"/></a>                        
                            </p:column>
                        </p:row>    
                        <p:row>
                            <p:column><p:graphicImage value="/resources/images/tours/#{item.imgurl}.jpg"/></p:column>
                        </p:row>
                    </p:panelGrid>
                </p:panel>
            </p:dataGrid>                
        </h:form>

ViewTour.xhtml:

<h:form>
            <h:panelGrid columns="2">   
                <h:outputText value="#{bundle.ViewTourLabel_imgurl}"/>
                <h:outputText value="#{tourController.selected.imgurl}"/>
                <h:outputText value="#{bundle.ViewTourLabel_source}"/>
                <h:outputText value="#{tourController.selected.source}" title="Source"/>
                <h:outputText value="#{bundle.ViewTourLabel_destination}"/>
                <h:outputText value="#{tourController.selected.destination}" title="Destination"/>
                <h:outputText value="#{bundle.ViewTourLabel_daysno}"/>
                <h:outputText value="#{tourController.selected.daysno}" title="Duration"/>
                <h:outputText value="#{bundle.ViewTourLabel_price}"/>
                <h:outputText value="#{tourController.selected.price}" title="Price"/>
                <h:outputText value="#{bundle.ViewTourLabel_description}"/>
                <h:outputText value="#{tourController.selected.description}" title="Description"/>
                <h:outputText value="#{bundle.ViewTourLabel_date}"/>
                <h:outputText value="#{tourController.selected.date}" title="Date of Travel:">
                    <f:convertDateTime pattern="MM/dd/yyyy" />
                </h:outputText>
                <h:outputText value="To book this trip contact:"/>
                <h:outputText value="#{bundle.ViewTourLabel_phone}"/>                    
                <h:outputText value="#{tourController.selected.phone}" title="Phone:"/>
                <h:outputText value="#{bundle.ViewTourLabel_email}"/>
                <h:outputText value="#{tourController.selected.email}" title="Email:"/>                                        
                <h:outputText value="#{bundle.ViewTourLabel_purpose}"/>
                <h:outputText value="#{tourController.selected.purpose}" title="Special Purpose Tour:"/>                    
                <h:outputText value="#{bundle.ViewTourLabel_company}"/>
                <h:outputText value="#{tourController.selected.company}" title="Arranged by:"/>
                <h:outputText value="#{bundle.ViewTourLabel_websiteurl}"/>
                <h:outputText value="#{tourController.selected.websiteurl}" title="Website:"/>
                <h:outputText value="#{bundle.ViewTourLabel_rating}"/>
                <h:outputText value="#{tourController.selected.rating}"/>                    
            </h:panelGrid>                                
        </h:form>
4

1 に答える 1

1

更新: OPは自分でそれを解決しました:

This post helped PrimefacesDataGrid-CommandLinkが機能していません<p:panel> tags should be inside <p:column> when all are inside a <p:datagrid> tag.


だから私があなただったらチェックすること:

正しく呼び出されて実行されると思いviewTour()ます。

  • ViewTour.xhtmlがtours.xhtmlと同じフォルダーにあるかどうかを確認します。そうでない場合は、正しいパスを指定する必要があります。
  • サーブレットマッピングが.jsfファイル用に正しく構成されているかどうかを確認してください。構成ファイルにあるweb.xmlを開き、サーブレットのマッピングが次のようになっていることを確認します。

<servlet-mapping>

    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
 </servlet-mapping>

他にも多くの問題が発生する可能性がありますが、これらはIMOで最も頻繁に発生します。

また注

ブラウザでURLアドレスを更新する必要がある場合は、リダイレクトを使用する必要があります。

別のページにリダイレクト?faces-redirect=trueするには、を使用する必要があります。このようにリターン文字列に追加しますreturn "ViewTour?faces-redirect=true";。これがないと、サーバー側で完全に発生している転送メカニズムのみを使用しているため、URLがブラウザーで更新されません。

編集

あなたのケースでナビゲートされない理由は、あなたのBeanのBeanスコープtourControllerである可能性があります。ほとんどの場合、コントローラーBeanは@RequestScope-dであるため(私もそうだと思います)、問題は、<h:commandLink>反復コンポーネント内に配置されていることです- <p:dataGrid>JSFは、リクエスト値commandLinkの適用フェーズでクリックされて送信された値を見つけようとします。コンポーネントを繰り返し処理します。

そのため、このフェーズでは、コンポーネントの値が(クリックされたときと)まったく同じになるようにする必要があります。

解決策:Beanをに配置する@ViewScopeか、データをにロードします@PostConstruct

また、他の関連する問題を確認するには、JSFの第一人者であるBalusCによるこの投稿を参照してください。

于 2013-01-12T10:55:42.390 に答える