通过在dataTable中使用commandLink,ViewScope,JSF输出未达到预期效果

时间:2012-03-12 06:57:06

标签: java jsf jsf-2 datatable javabeans

以下是我的文件。

manageStaff.xhtml

<h:dataTable var="c" value="#{newStaffMemberServiceBean.newStaffMemberDataBeanList}"
             styleClass="order-table"
             headerClass="order-table-header"
             rowClasses="order-table-odd-row,order-table-even-row"
             border="1" id="staffListDataTable" width="100%">

    <h:column>
        <f:facet name="header">
            Staff Member Name
    </f:facet>
        <h:form>
            <h:commandLink action="viewStaffMemberProfileData" value="#{c.firstName}">
                <f:setPropertyActionListener target="#{newStaffMemberServiceBean.userId}" value="XXXYYYZZZZ"/>
            </h:commandLink>
        </h:form>
    </h:column>
</h:dataTable>

viewStaffMemberProfileData.xhtml

 My Name is -<h:outputText value="#{newStaffMemberServiceBean.userId}" />-

NewStaffMemberServiceBean.java

@ManagedBean(name = "newStaffMemberServiceBean")
//@RequestScoped
@ViewScoped
//@SessionScoped
public class NewStaffMemberServiceBean {

    private String userId;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

在输出中,我得到的是格式

Staff Member Name
++++++++++++++++++

Name 1
Name 2
Name 3
.
.
.
.

点击Name 1时,我会被重定向到viewStaffMemberProfileData.xhtml

但是 问题

  1. 要重新定位viewStaffMemberProfileData.xhtml页面,我必须点击两次链接(名称1,名称2等):(

  2. 当我重新定向到viewStaffMemberProfileData.xhtml时,我只看到输出为

    My Name is --

    我想要的是My Name is -XXXYYYZZZZ-

  3. 建议我哪里出错了。

    我有 ViewScope 中的所有bean。

    更新1

    @prajeeshkumar

    Getter setter如下

        public List<NewStaffMemberDataBean> getNewStaffMemberDataBeanList() {
        return newStaffMemberDataBeanList;
        }
    
        public void setNewStaffMemberDataBeanList(List<NewStaffMemberDataBean> newStaffMemberDataBeanList) {
        this.newStaffMemberDataBeanList = newStaffMemberDataBeanList;
        }
    

2 个答案:

答案 0 :(得分:2)

此行为的原因是newStaffMemberServiceBean的视图范围,它被销毁并再次创建...因此该值无效......这里是另一种解决方案:

没试过这个,但值得一试

更改

<h:commandLink action="viewStaffMemberProfileData" value="#{c.firstName}">
     <f:setPropertyActionListener target="#{newStaffMemberServiceBean.userId}" value="XXXYYYZZZZ"/>
</h:commandLink>

<h:link value="#{c.firstName}" outcome="nameOfXhtmlGoesHere">
     <f:param name="id" value="XXXYYYZZZZ" />
</h:link>

和viewStaffMemberProfileData.xhtml

<h:head>

之前添加此内容
<f:metadata>
    <f:viewParam name="id" value="#{newStaffMemberServiceBean.userId}" />
</f:metadata>

您还可以将<f:event type="preRenderView" listener="#{newStaffMemberServiceBean.init}" />添加到f:metadata以执行某些初始化...

基于此BalusC great article - Communication in JSF 2.0

您可以将newStaffMemberServiceBean的范围转换为SessionScope ...

答案 1 :(得分:0)

如果您在视图范围内有newStaffMemberServiceBean,那么当您要访问其他页面(视​​图)时,该范围内的该bean是否可用?我的意思是manageStaff.xhtml将有一个实例,viewStaffMemberProfileData.xhtml将有另一个实例。此处的解决方案将使用会话范围或使用h:linkh:outputLink