【问题标题】:How to update Primefaces datatable every time when page is downloaded?每次下载页面时如何更新 Primefaces 数据表?
【发布时间】:2012-11-06 00:06:46
【问题描述】:

我只有<p:dataTable/>。当我在另一个页面中向该表添加新行时,该表不会刷新。 RmaBean 是 managedBean 范围的会话。有什么想法吗?

<h:form id="mainMenuForm">        

            <p:dataTable id="dataTable" 
                         var="case" 
                         value="#{RmaBean.rmaModel}" 
                         widgetVar="rmaTable" 
                         editable="true" 

                         rows="10" paginator="TRUE" emptyMessage="No items found with given criteria.">

...

<p:column></p:column>
        <p:column></p:column>
        <p:column><p:commandButton action="#{MainController.talletaUusiRma}" value="#{bundle.newRma_tallenna}" immediate="true"  ajax="false" style="width: 220px;"/></p:column>
    </p:row>

当我向该表添加一个新对象时,我每次都更新rmaModel,我什至检查列表是否比以前长了一个,并且有那个新对象。 dataTable 仍然显示旧数据而没有新对象,为什么?

--------创建新的 RMA-------------

public String prepareNewRma() {
    current = new Rma();
    current.setUser("");
    return "newRma";
}

--------使用序列号将数据提取到新的 RMA--------

public String haeTiedotSarjanrolla() {
    log.info("sarjanro=" + current.getSarjanro());
    System.out.println("---------------->sarjanro=" + current.getSarjanro());

    Sarjanumerot s = helper.getSerialInfo(current.getSarjanro());

    if (s != null) {
        current.setAn8(s.getAn8());
        current.setDsc1(s.getDsc1());
        current.setDsc2(s.getDsc2());
        current.setSarjanro(s.getId().getLotn());
        current.setTuotenro(s.getId().getLitm());
    }
    return "newRma";
}

--------正在保存新的 RMA---------------

public String talletaUusiRma() {

    current.setCreated(new Timestamp(System.currentTimeMillis()));
    helper.tallennaRma(current);
    rmaNumbers = null;

   RmaBean papu = (RmaBean) JsfUtil.findBean("rmapapu");

   papu.updateTable();
    return "mainMenu";
}

助手:

 public void tallennaRma(Rma current) {
        try {
            Session session = HibernateUtil.getAsekorjausSessionFactory().getCurrentSession();
            session.beginTransaction();
            session.saveOrUpdate(current);
            session.getTransaction().commit();
        } catch (Exception e) {
            log.debug(e.getMessage());
                        JsfUtil.addErrorMessage(ResourceBundle.getBundle("resources/Bundle").getString("editRma_err_updateError"));
        }

---------在 RmaBean 中更新模型和表格-----------

public void updateTable(){

    System.out.println("updateTableupdateTableupdateTable");
    rmaModel.setWrappedData(rmaModel.getUpdatedList());
    System.out.println("1111111..........");
    List<Rma> rmat = rmaModel.getUpdatedList();
    System.out.println("22222222.......");
    Iterator iter = rmat.iterator();
    System.out.println("------------------------>PITUUS: " +rmat.size());
    while (iter.hasNext()) {
        Rma t = (Rma) iter.next();
        System.out.println("t.getRma()NUMERO------->" +t.getRma());


    }

    RmaDataModel newRMAModel = new RmaDataModel(rmat); 
    rmaModel = newRMAModel;
}

萨米

【问题讨论】:

  • 你能用在列表中添加新元素的方法来扩展你的问题吗?请更正上面的代码片段,要么发布方法的整个代码,要么只发布方法签名并标记缺失的代码片段。
  • 现在可以了吗?昨晚我太累了,所以我想快点:)

标签: java jsf datatable primefaces


【解决方案1】:

您的 dataTable 的值属性在会话范围内,因此您的数据表只会在您在此会话中的第一次请求时呈现(如果您不手动更新此视图)。

为您的视图使用视图范围 bean。如果此列表必须在会话范围内,只需将列表从任何会话范围 bean 注入到您的视图范围 bean。

【讨论】:

  • 我该如何改变它或者你的意思是 bean 范围?
【解决方案2】:

如果我很好地理解了您的问题,您希望在另一个页面中完成操作时更新一个页面,而 ajax 更新不会自动完成。必须通过推送来完成。您在 primefaces 展示中有几个例子:

http://www.primefaces.org/showcase/push/index.jsf

从第一个例子开始:

<h:form id="form">  
    <h:outputText id="out" value="#{globalCounter.count}" styleClass="ui-widget display" />  

    <br />  

    <p:commandButton value="Click" actionListener="#{globalCounter.increment}" />  
</h:form>  

  <p:socket onMessage="handleMessage" channel="/counter" /> 

bb

   public synchronized void increment() {  
        count++;  

        PushContext pushContext = PushContextFactory.getDefault();  
        pushContext.push("/counter", String.valueOf(count));  
    }  

【讨论】:

  • 我觉得这个解决方案太复杂了?应该有一些更简单的 :) 我把这个留给我最后一次机会。
【解决方案3】:

我做了一个真正的泡泡糖解决方案,因为否则我无法适应它。我只是再次将 bean 写入会话,因此它会覆盖名为“rmapapu”的旧版本。不,它正在工作。有什么后果吗?或者这真的是个坏主意吗?

    rmaModel = null;
    RmaDataModel rmaModel = new RmaDataModel(rmat);
    //rmaModel = newRMAModel;
    this.setRmaModel(rmaModel);

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
    HttpSession httpSession = request.getSession(false);
    httpSession.setAttribute("rmapapu", this);

感谢大家帮助我。我仍然会阅读有关此的 BalusC 教程,因为很高兴知道您应该如何做到这一点:)

萨米

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2014-02-16
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2019-12-11
    • 2019-09-13
    • 2021-06-10
    • 2012-07-31
    相关资源
    最近更新 更多