【问题标题】:JSF Output not coming as expected by using commandLink, ViewScope in dataTable使用 dataTable 中的 commandLink、ViewScope 未按预期输出 JSF 输出
【发布时间】:2012-03-12 06:57:05
【问题描述】:

以下是我拥有的文件。

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-

建议我哪里出错了。

注意

我在 ViewScope 中拥有所有 bean。

更新 1

@prajeeshkumar

Getter setter 如下

    public List<NewStaffMemberDataBean> getNewStaffMemberDataBeanList() {
    return newStaffMemberDataBeanList;
    }

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

【问题讨论】:

  • 又是同样的问题? stackoverflow.com/questions/9653078/…
  • 属性newStaffMemberDataBeanList的getter/setter是什么?
  • @prajeeshkumar : READ AGAIN 他们不是同一个问题。看看我列出的两个问题。现在我可以使用ViewScope 重新定向到新页面。
  • @prajeeshkumar : 对于 getter setter,请参阅 Update 1
  • 将 id 放入会话范围不是您的选择吗?

标签: java jsf jsf-2 datatable javabeans


【解决方案1】:

这种行为的原因是 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>

在视图中StaffMemberProfileData.xhtml

&lt;h:head&gt;之前添加这个

<f:metadata>
    <f:viewParam name="id" value="#{newStaffMemberServiceBean.userId}" />
</f:metadata>

您还可以将&lt;f:event type="preRenderView" listener="#{newStaffMemberServiceBean.init}" /&gt; 添加到f:metadata 以进行一些初始化...

基于此BalusC great article - Communication in JSF 2.0

你可以把newStaffMemberServiceBean的范围变成SessionScope...

【讨论】:

  • 这是工作 BUT 我在 URL 中得到?id=XXXYYYZZZZ BAD :( 还有其他解决方案吗?
  • 也知道为什么在第一次点击时会显示相同的页面,而在第二次点击时页面会被重定向到请求的页面??
  • 我想我必须在这里使用Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();。你对此有何看法??
  • 没有使用过 Flash,但是...mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope 看起来是个不错的起点
【解决方案2】:

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

【讨论】:

  • 为什么要将 id 带入会话范围内,它只适用于一个请求?
猜你喜欢
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多