JSF和Primefaces数据网格,链接到查看页面



我有一个名为tours的jsf页面和一个tourController,在tours中,我使用primefaces数据网格来显示我的tour项目,并使用commandLink为每个项目添加视图链接。问题是,当我单击链接时,它显示的不是viewTour页面,而是相同的tours.xhtml页面。过了一会儿,它说视图过期了,看起来它去了别的地方。下面是我的代码:

TourController.java viewTour method:

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

tours.xhtml datagrid:

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

更新:OP自己解决了:

This post helped Primefaces DataGrid - CommandLink不工作。 <p:panel> tags should be inside <p:column> when all are inside a <p:datagrid> tag.


如果我是你,我会检查的事情:

我想viewTour()得到正确调用和执行

  • 检查ViewTour.xhtml是否与tours.xhtml在同一文件夹中。如果不是,你必须指定正确的路径。
  • 检查您的servlet映射是否为正确配置。jsf 文件。打开配置文件中的web.xml,检查servlet映射是否如下所示:

<servlet-mapping>

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

还有很多其他的问题,但我认为这些是最常见的。

还要注意:

如果你需要更新浏览器中的URL地址,那么你需要使用重定向

重定向到另一个页面,您必须使用?faces-redirect=true。将它附加到您的返回字符串,如return "ViewTour?faces-redirect=true";。如果没有这个,你只使用转发机制,这完全发生在服务器端,所以你的URL不会在浏览器中更新。

编辑

在您的情况下,它没有导航的原因可能是您的tourController bean的bean作用域。由于控制器bean在大多数情况下是@RequestScope -d(我假设这也是您的情况),问题是您的<h:commandLink>被放置在迭代组件- <p:dataGrid>中。JSF将在应用请求值阶段尝试查找已单击的commandLink和提交的值——它将在组件上重复。

因此,您需要确保在此阶段(与单击它时一样)提供了完全相同的组件值。

解决方案:将bean放到@ViewScope或将数据加载到@PostConstruct

还可以查看其他相关问题,请参阅JSF大师BalusC的帖子。

相关内容

  • 没有找到相关文章

最新更新