【问题标题】:JSF and Primefaces datagrid, link to view pageJSF 和 Primefaces 数据网格,链接到查看页面
【发布时间】:2013-01-12 07:44:43
【问题描述】:

我有一个名为 tours 的 jsf 页面和一个 tourController,在 tours 中,我使用 primefaces 数据网格来显示我的游览项目,并使用 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>

【问题讨论】:

    标签: jsf view primefaces


    【解决方案1】:

    更新: OP自己解决了:

    This post helped Primefaces DataGrid - CommandLink is not working.&lt;p:panel&gt; tags should be inside &lt;p:column&gt; when all are inside a &lt;p:datagrid&gt; tag.


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

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

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

    &lt;servlet-mapping&gt;

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

    可能还有很多其他问题,但这些是 IMO 最常见的问题..

    另请注意

    如果您需要在浏览器中更新 URL 地址,那么您需要使用 redirect

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

    编辑

    在您的情况下它无法导航的原因可能是您的 tourController bean 的 bean 范围。由于在大多数情况下控制器 bean 是 @RequestScope-d(我认为您的情况也是如此),问题是您的 &lt;h:commandLink&gt; 被放置在迭代组件中 - &lt;p:dataGrid&gt;。 JSF 将尝试在apply request values phase 期间查找单击的commandLink 和提交的值——它会在组件上重复。

    因此,您需要确保在此阶段(与单击时)给出的组件值完全相同。

    解决方案:把你的bean放到@ViewScope或者在@PostConstruct加载数据。

    还要检查其他相关问题,请参阅 JSF 大师 BalusC 的 this post

    【讨论】:

    • 感谢您回复 Fallup。 ViewTour.xhtml 与 tours.xhtml 位于同一文件夹中,我今天使用了 ?faces-redirect=true,我的 servlet 映射类似于 Faces Servletfaces/* 你认为问题是什么?它仍然像以前那样工作。
    • @user993072 不要在 URL 映射中使用 faces/*,这是 JSF 1.x 时代过时的旧方式。像我在上面的帖子中那样使用它。其他导航对您有用吗?我的意思是你有任何其他.xhtml 导航到另一个有效的吗?尝试从您的 tours.xhtml 中删除所有内容 - 只留下带有 commandlink 和硬编码 action="ViewTour?faces-redirect=true" 的表单,看看它是否有效。
    • 是的,我还有其他与 /faces/* 一起使用的导航,但是我更改了我的 servlet 映射,并且在从 tours.xhtml 中删除所有内容时它起作用了。可能是什么问题?
    • @user993072 查看我更新的答案以了解可能的问题。还要检查建议的链接。您的问题主要是不正确的 bean 范围。
    • 再次感谢@Fallup。这篇文章有帮助:[stackoverflow.com/questions/11985305/…。当所有标签都在 标签内时, 标签应该在 内。
    猜你喜欢
    • 2011-06-19
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多