【问题标题】:Why the content of <h:dataTable> is not refreshed afterb Ajax Action为什么 Ajax Action 后 <h:dataTable> 的内容没有刷新
【发布时间】:2017-10-14 08:27:51
【问题描述】:

我在更新 AJAX 后尝试更新 dataTable 的内容(触发 DB 上的更新请求) 在我的程序中,用户单击 commandLink 或单击以更新数据库中的“odm.valide_manag1”字段(使用 Datatable 执行请求,不幸的是,此阶段通过测试该字段将图像(项目符号)从红色变为绿色未正确执行测试始终未检查(不更新字段的getter) 我在@PostConstruct中调用listodm对象的重新生成,在Getter中,在验证方法中,我更改了Scope但没有成功

@ManagedBean 
@ViewScoped // or RequestScoped
public class listeOdm {
    public static Logger log=  LogManager.getLogger(listeOdm.class.getName());
    private List<odm> listOdm= new ArrayList<odm>() ; // a changer vers ListDataModel

    private odmService odmservice = new odmServiceImpl();
    FacesContext fc = FacesContext.getCurrentInstance();
    HttpSession httpsession = (HttpSession) fc.getExternalContext().getSession(false);
    private String n_odm;
    private String operation;
    private HtmlDataTable dataTable;



    @PostConstruct
    public void initMyBean()
    {   listOdm=null;
        log.info("1- debut PostConstruct   :   "  );         
        listOdm = odmservice.findByMatricule("1000"); /*(String) httpsession.getAttribute("Matricule")*/
        //listOdm = odmservice.findAll();
        log.info("1- PostConstruct NOMBRE DES ODM  :   " + listOdm.size()+ "   The Object Is "+ listOdm.hashCode());
        RequestContext.getCurrentInstance().update("basicDT");
        /*  if("edit".equals(getParam("operation")))
        {
            editOdm();
        }*/
    }

    public String getParam(String name)
    {  
        Map<String, String> params=fc.getExternalContext().getRequestParameterMap();
        return params.get(name);    
    }
    public void onValid_manag(RowEditEvent event)
    {
        odmservice.validManager(((odm) event.getObject()).getNum_odm());
       FacesMessage msg = new FacesMessage("Odm validée", ((odm) event.getObject()).getNum_odm());
       FacesContext.getCurrentInstance().addMessage(null, msg);
       // ((odm) event.getObject() ).setValide_manag1("2");
       // listOdm.clear();
       // listOdm = odmservice.findAll(); 
       listOdm = odmservice.findByMatricule("1000");
       log.info("2- on valid Method la nouvelle valeur de Valide_manage1 est :" + ((odm) event.getObject()).getValide_manag1());
       log.info("2- on valid Method  :   " + listOdm.size()+ "   The Object Is "+ listOdm.hashCode());
        RequestContext.getCurrentInstance().update("basicDT");
    }

        public void onCancel_manag(RowEditEvent event) {
              FacesMessage msg = new FacesMessage("Odm Non validée", ((odm) event.getObject()).getNum_odm());
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    public void editOdm()
    {  // setN_odm(getParam("numOdm"));
       // setOperation(getParam("operation"));
        log.info("0- edit methode  :     "+getParam("numOdm"));
     odmservice.validManager(getParam("numOdm"));
        //listOdm = odmservice.findByMatricule("1000"); /*(String) httpsession.getAttribute("Matricule")*/
        log.info("edit de l'ODM  N°:   ");
       listOdm = odmservice.findByMatricule("1000");
    }
    public void modif()
    {    log.info("on Expand Start ");
         listOdm = odmservice.findByMatricule("1000");
    }
    public void printOdm()
    {}
    public List<odm> getListOdm() {
        log.info("getter list odm"+this.listOdm.hashCode());
        if (FacesContext.getCurrentInstance().getRenderResponse()) {
            log.info("getter list odm"+this.listOdm.hashCode());
            listOdm = odmservice.findByMatricule("1000");
        }
        return listOdm ;//= odmservice.findByMatricule("1000");
    }

    public void setListOdm(List<odm> listOdm) {
        this.listOdm=listOdm ;
    }

    public String getN_odm() {
        return n_odm;
    }

    public void setN_odm(String n_odm) {
        this.n_odm = n_odm;
    }

    public String getOperation() {
        return operation;
    }

    public void setOperation(String operation) {
        this.operation = operation;
    }

    public HtmlDataTable getDataTable() {
         dataTable.clearInitialState();
        return dataTable;
    }

    public void setDataTable(HtmlDataTable dataTable) {
        this.dataTable = dataTable;
    }

}

Xhtml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet"></link>
<title>Insert title here</title>

</h:head>
<h:body>
    <ui:debug />

     <h:form id="formulaire1">
     <h:inputHidden value="#{listeOdm.n_odm}" />
     <h:inputHidden value="#{listeOdm.operation}" />
     <p:growl id="msgs" showDetail="true"/>
    <h:dataTable  id="basicDT"    var="odm" value="#{listeOdm.listOdm}" binding="#{listeOdm.dataTable}"      >

       <h:column headerText="Etat" id= "bulet">

         <h:panelGroup rendered="#{odm.valide_manag1 eq '2'}">
         <h:graphicImage   library="img" name="if_bullet-green_44189.png" width="24" height="24" style="border-style: none"/>
         </h:panelGroup>
         <h:panelGroup rendered="#{odm.valide_manag1+odm.valide_manag2 eq '1'}">
          <h:graphicImage   library="img" name="orange.gif" width="24" height="24" style="border-style: none"/>
         </h:panelGroup>
          <h:panelGroup rendered="#{odm.valide_manag1+odm.valide_manag2 eq '0'}">
          <h:graphicImage   library="img" name="if_bullet-red_44191.png" width="24" height="24" style="border-style: none"/>
         </h:panelGroup>
         </h:column>
           <h:column headerText="valid">
            <h:outputText value="#{odm.valide_manag1}" />
        </h:column>
        <h:column headerText="Num Odm">
            <h:outputText value="#{odm.num_odm}" />
        </h:column>
        <h:column headerText="Client">
            <h:outputText value="#{odm.client}" />
        </h:column>
        <h:column headerText="Station">
            <h:outputText value="#{odm.station}" />
        </h:column>
         <h:column headerText="Destination">
            <h:outputText value="#{odm.destination}" />
        </h:column>
        <h:column headerText="date dep">
            <h:outputText value="#{odm.date_dep}" pattern="dd/MM/yyyy"/>
        </h:column>
        <h:column headerText="date retour">
            <h:outputText value="#{odm.date_ret}" pattern="dd/MM/yyyy"/>
        </h:column>
        <h:column headerText="Cient">
            <h:outputText value="#{odm.client}" />
        </h:column>
         <h:column headerText="Edit" width="24">

               <h:commandLink    
                    actionListener="#{listeOdm.editOdm}" update=":formulair1:basicDT"   ajax="true">
                    <f:param name="numOdm" value="#{odm.num_odm}"></f:param>
                    <f:param name="operation" value="edit"></f:param>
                    <h:graphicImage   library="img" name="118805-128.png" width="24" height="24" style="border-style: none"/>
                    <!--  <i class="fa fa-envelope"></i> -->

                </h:commandLink>
                <h:commandLink    
                    actionListener="#{listeOdm.printOdm}" update="formulaire1">
                    <f:param name="numOdm" value="#{odm.num_odm}"></f:param>
                    <f:param name="operation" value="edit2"></f:param>
                    <h:graphicImage   library="img" name="Print-2-128.png" width="24" height="24" style="border-style: none"/>
                    <!--  <i class="fa fa-envelope"></i> -->
                </h:commandLink>
        </h:column>

    </h:dataTable>

    </h:form>

</h:body>
</html>

JSF2.2.9 Tomcat 8.5

【问题讨论】:

  • 你能正确造句吗?这太难读了。
  • 对不起,我说法语
  • 我正在尝试在 AJAX 调用后更新 dataTable 的内容
  • 我正在尝试通过在我的程序中单击 AJAX 按钮或链接(在 DB 上触发更新请求)来更新 h:dataTable 的内容,最终用户单击命令链接或命令按钮以更新数据库中的字段“odm.valide_manag1”(在 h:Datatable 中,图像(项目符号)通过测试该字段从红色变为绿色)不幸的是,此阶段未正确执行 EL 表达式 odm.valide_manag1+odm.valide_manag2 eq '0' 总是 eq 0 (不更新字段 odm.valide_manag1;odm.valide_manag2 的 getter)我调用 listodm 对象的重新生成
  • “对不起,我说法语”。废话。法语的大小写和标点规则与英语相同。英语和法语的句子都以大写字母开头,以句点结尾。这只是草率和不尊重的写作,而不是专业写作。即使你用法语写作,人们也会打电话给你。我们不关心语法。然而,我们确实关心可读性。可读性与语法关系不大。可读性与正确的格式有很大关系。作为程序员的你应该知道这一点。格式错误的代码也几乎不可读。

标签: ajax jsf primefaces


【解决方案1】:

我的问题已经解决了!!!!!! 我想与初学者分享这种经验,因为对于专家来说这是显而易见的。 DataTable 的行是对象,listner 的执行或命令&lt;p:ajax event="rowEdit" listener="#{listeOdm.onValid_manag}" update=":formulaire1:basicDT"/&gt; 更新数据库中的记录而不更新数据表行。

public void onValid_manag(RowEditEvent event)
{
   odmservice.validManager(((odm) event.getObject())); // herer was my error, before i passed a string  instead of the object  event.getObject().getNum_Odm
   listOdm = odmservice.findByMatricule("1000");   
}

在调用休眠更新的方法中,我像这样更新了数据库中的记录

public void validManager(String num_odm)
  {

     session.beginTransaction();
     Query q = session.createQuery("update odm set valide_manag1='2' where num_odm = :num_odm");
     q.setParameter("num_odm",num_odm);
     q.executeUpdate();
      session.getTransaction().commit();
    }

正确的方法是:

public void validManager(odm odm) { //object in the selected row as parameter
     session.beginTransaction();
// updating the object in memory  
     odm.setValide_manag1("2");
//hibernate execute the update query  in DB
     session.save(odm);
     session.getTransaction().commit();
}

【讨论】:

  • 嗨,有没有全局的解决方案,同时更新对象和数据库中的记录?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2015-01-18
  • 2022-01-19
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多