How to update jsf datatable from back bean - java

I have a form that user should enter some values to get some info from a web service. Firstly user fulfills the form and then as he clicks the request button webservice is called. Until here everything works nicely. But as the webservice returns the info, I have to re-render the datatable with the new data. Here is my page:
<h:body>
<h:form id="formCus">
<h:outputLabel value="Müşteri Tipi: *"/>
<p:selectOneMenu id="customerType" value="#{customerService.musteriTipi}" style="width: 39%">
<f:selectItem itemLabel="" itemValue=" " />
<f:selectItem itemLabel="Bireysel" itemValue="BIREYSEL" />
<f:selectItem itemLabel="Tüzel" itemValue="TUZEL" />
<f:selectItem itemLabel="Yabancı" itemValue="YABANCI" />
<p:ajax event="change" update="#{customerService.musteriTipi}"/>
</p:selectOneMenu>
<h:outputLabel value="Ad/Firma Adı: *" for="customerName" />
<p:inputText id="customerName" value="#{customerService.adFirmaAdi}" title="Müşteri adı." >
<p:ajax event="change" update="#{customerService.adFirmaAdi}" />
</p:inputText>
<h:outputLabel value="Soyad/Ünvan: *" for="customerSurname" />
<p:inputText id="customerSurname" value="#{customerService.soyadUnvan}" title="Müşteriye ait soyad/ünvan." >
<p:ajax event="change" update="#{customerService.soyadUnvan}" />
</p:inputText>
<h:outputLabel value="TC Kimlik No: *" />
<p:inputText id="customerTC" value="#{customerService.tcKimlikNo}" title="TC Kimlik numarasını buraya girin.TC numarası sadece sayılardan oluşmalıdır." >
<p:ajax event="change" update="#{customerService.tcKimlikNo}" partialSubmit="true" process="#this"/>
</p:inputText>
<h:outputLabel value="Vergi No:" />
<p:inputText id="customerVergi" value="#{customerService.vergiNo}" title="TC Kimlik numarasını buraya girin.TC numarası sadece sayılardan oluşmalıdır." >
<p:ajax event="change" update="#{customerService.vergiNo}" partialSubmit="true"/>
</p:inputText>
<h:outputLabel value="Müdürlük Kodu: *" />
<p:inputText id="departmantId" value="#{customerService.mudurlukKodu}" title="Müdürlük kodunu buraya girin.Müdürlük kodu sadece sayılardan oluşmalıdır." >
<p:ajax event="change" update="#{customerService.mudurlukKodu}" partialSubmit="true"/>
</p:inputText>
<h:outputLabel value="Müşteri Kodu: " />
<p:inputText id="customerId" value="#{customerService.musteriKodu}" title="Müdürlük kodunu buraya girin.Müdürlük kodu sadece sayılardan oluşmalıdır." >
<p:ajax event="change" update="#{customerService.musteriKodu}" />
</p:inputText>
<h:outputLabel value="E-Posta Adresi: " />
<p:inputText id="customerMail" value="#{customerService.mail}" title="Müşteriye ait e-mail adresini buraya girin." >
<p:ajax event="change" update="#{customerService.mail}" partialSubmit="true"/>
</p:inputText>
<h:outputText value=" "/>
<p:commandButton id="query" value="Müşteri Sorgula" actionListener="#{customerService.request}" async="true" onsuccess="panelwv.show()">
<f:ajax execute="#form" render=":personList" ></f:ajax>
</p:commandButton>
</h:form>
<h:panelGrid columns="5">
<h:outputText value=""/>
<h:outputText value=""/>
<p:panel widgetVar="panelwv" visible="false" closable="true" header="Sorgu Yapılıyor...">
<p:graphicImage value="/resources/images/ajaxloadingbar.gif" />
</p:panel>
<h:outputText value=""/>
<h:outputText value=""/>
</h:panelGrid>
<h:outputText value="Bulunan Müşterilere Ait Bilgiler:" />
<h:form id="personList" rendered="#{not empty customerService.musteriKodu}">
<p:dataTable value="#{customerService.customer}" var="item" id="persontable" emptyMessage="Henüz müşteri eklemediniz.">
<p:column headerText="Müşteri/Firma ID">
#{item.customerId}
</p:column>
<p:column headerText="Ad/Firma Adı">
#{item.customerName}
</p:column>
<p:column headerText="Soyad/Ünvan" >
#{item.customerSurname}
</p:column>
<p:column headerText="Müşteri Tipi" >
#{item.customerType}
</p:column>
<p:column headerText="Telefon" >
#{item.customerTel}
</p:column>
<p:column headerText="Adres">
#{item.customerAddress}
</p:column>
<p:column headerText="E-Posta">
#{item.customerMail}
</p:column>
</p:dataTable>
</h:form>
</h:body>
And here is my back bean:
//some getter and setters
List<Customers> customer = new ArrayList<Customers>();
public List<Customers> getCustomer() {
return customer;
}
public void setCustomer(List<Customers> customer) {
this.customer = customer;
}
public String request() {
final RequestContext context = RequestContext.getCurrentInstance();
//System.out.println("Progress...");
//musteriSorgula(musteriSorgulaKriter());
new Thread(new Runnable() {
public void run() {
try {
musteriKodu = String.valueOf(musteriSorgula(musteriSorgulaKriter()).getMusteriBilgisi().getMusteriKodu());
List<TelefonBilgisi> tel_result = telefonSorgula(telefonSorgulaKriter(musteriKodu)).getMusteriTelefonListesi();
//telefon = tel_result.getMusteriTelefonListesi().get(0).getTelefonNo();
if (tel_result.size() > 0) {
for (TelefonBilgisi t : tel_result) {
telefon = t.getTelefonNo();
}
} else {
telefon = "No telephone.";
}
List<UavtAdresBilgisi> uavt_result = uavtAdresSorgula(uavtAdresSorgulaKriter(musteriKodu)).getMusteriUavtAdresListesi();
if (uavt_result.size() > 0) {
for (UavtAdresBilgisi u : uavt_result) {
adres = String.valueOf(u.getSehir()) + ", " + String.valueOf(u.getBucak()) + ", " + String.valueOf(u.getKasaba());
}
} else {
adres = "No address.";
}
Customers cust = new Customers(musteriTipi, BigInteger.valueOf(Long.valueOf(musteriKodu)), adFirmaAdi, soyadUnvan, telefon, adres, mail, projectId);
if (!customer.contains(cust)) {
customer.add(cust);
System.out.println("Customer has been added.");
} else {
System.out.println("Customer is still in the list.");
}
} catch (Exception ex) {
Logger.getLogger(CustomerService.class.getName()).log(Level.SEVERE, null, ex);
context.execute("alert('Try again.')");
}
}
}).start();
context.execute("panelwv.close()");
return "";
}
The back bean could connect to webservice and gether the info, I can see that in the logs. In the beginning my datatable is empty. What I want is to show the new data as the webservice responses. context.update("personList") doesn't work when I place it below:
customer.add(cust);
If someone could help me I would be greatly appriciated.

<f:ajax execute="#form" render=":personList" ></f:ajax>
Make a change as
<f:ajax execute="#form" update="persontable" render=":personList" ></f:ajax>

Ok so what you want to do is to force the client to update the data table from your server. Take a look at comet and push technology and also (if you don't need to support older browsers) WebSocket.
If you google around you'll find tutorials on how to do it using JSF. And as you are using Primefaces, not that this library has comet support: checkout p:push and atmosphere support.

This problem is easy to solve if you use RichFaces

I would prefer using RemoteCommand component as #Ömer said.
Try use it at the end of the thread(inside the thread braces) with context.execute("updater();");

Related

Update in datatable after updating data

I'm having a problem updating a column in my datatable after an edit.
I use a dialog to edit the data you want. You are saving everything in the database, the problem
Rezide in updating the table, the fields are being updated with the new values,
Only one that is not updating, just a selectOneMenu that is in the dialog.
The field that is not updating is from the Lotação, the rest is working.
My table..
<h:head>
</h:head>
<h:body>
<ui:composition template="/WEB-INF/template/template.xhtml">
<ui:define name="TituloCorpo">Alterar Impressora</ui:define>
<ui:define name="Corpo">
<div align="center">
<h:form id="form">
<!-- BOTÕES QUE GERA RELATÓRIOS EM PDF E CSV -->
<div style="width:2958px">
<h:commandLink>
<h:graphicImage value="/resources/img/icon_pdf.png" width="35" title="Relatório em PDF"/>
<p:dataExporter type="pdf" target="tab" fileName="impressoras" pageOnly="true"/>
</h:commandLink>
<h:commandLink>
<h:graphicImage value="/resources/img/icon_csv.png" width="35" title="Relatório em CSV"/>
<p:dataExporter type="csv" target="tab" fileName="impressoras" pageOnly="true" />
</h:commandLink>
</div>
<!-- SCRIPT QUE CRIA UMA TABELA -->
<p:dataTable id="tab" var="impressora" widgetVar="tab" value="#{impressoraMB.impressoras}" editable="true" reflow="true" style="width:1100px">
<p:column id="fabricante" headerText="Fabricante" filterBy="#{impressora.fabricante}" filterMatchMode="contains" style="width:170px">
<h:outputLabel value="#{impressora.fabricante}"/>
</p:column>
<p:column id="modelo" headerText="Modelo" filterBy="#{impressora.modelo}" filterMatchMode="contains" style="width:170px">
<h:outputLabel value="#{impressora.modelo}"/>
</p:column>
<p:column id="modeloCartucho" headerText="Modelo do Cartucho" filterBy="#{impressora.modeloCartucho}" filterMatchMode="contains" style="width:180px">
<h:outputLabel value="#{impressora.modeloCartucho}"/>
</p:column>
<p:column id="patrimonio" headerText="Patrimonio" filterBy="#{impressora.patrimonio}" filterMatchMode="contains" style="width:120px">
<h:outputLabel value="#{impressora.patrimonio}"/>
</p:column>
<p:column id="lotacao" headerText="Lotação" filterBy="#{impressora.nome}" filterMatchMode="contains" style="width:110px">
<h:outputLabel value="#{impressora.nome}"/>
</p:column>
<p:column headerText="Alterar" style="width:70px" exportable="false">
<p:commandButton update=":formAlterar:panelAlterar" icon="ui-icon-pencil" title="Alterar" style="height:35px;width:35px"
oncomplete="PF('alterarImpre').show()" ajax="true">
<f:setPropertyActionListener value="#{impressora}" target="#{impressoraMB.impressora}"/>
</p:commandButton>
</p:column>
<p:column headerText="Remover" style="width:90px" exportable="false">
<p:commandButton update=":formExcluir:panelExcluir" oncomplete="PF('excluirImpre').show()" icon="ui-icon-trash"
styleClass="btn btn-small" style="height:35px;width:35px" title="Excluir">
<f:setPropertyActionListener value="#{impressora}" target="#{impressoraMB.impressora}"/>
</p:commandButton>
</p:column>
</p:dataTable>
</h:form>
</div>
<!-- PAGINA COM A CAIXA DE DIALOGO -->
<ui:include src="/panel.xhtml"/>
</ui:define>
</ui:composition>
</h:body>
My dialog..
<p:dialog id="editar" header="Altere os dados desejados" widgetVar="alterarImpre" width="600" location="center"
draggable="true" modal="true" responcive="true" showEffect="fade" hideEffect="fade">
<h:form id="formAlterar">
<h6 align="center"><i>*Para abrir o campo de edição, clique em cima do valor</i></h6>
<br/>
<h:panelGrid id="panelAlterar" columns="2" cellpadding="5" width="75%">
<h:outputLabel for="fabricante" value="Fabricante:"/>
<p:inplace id="fabricante" editor="true" emptyLabel="Me edite">
<p:inputText value="#{impressoraMB.impressora.fabricante}" required="true" label="text"/>
</p:inplace>
<h:outputLabel for="modelo" value="Modelo:"/>
<p:inplace id="modelo" editor="true" emptyLabel="Me edite">
<p:inputText value="#{impressoraMB.impressora.modelo}" required="true" label="text"/>
</p:inplace>
<h:outputLabel for="modeloCartucho" value="Modelo do Cartucho: "/>
<p:inplace id="modeloCartucho" editor="true" emptyLabel="Me edite">
<h:inputText value="#{impressoraMB.impressora.modeloCartucho}" required="true" label="text"/>
</p:inplace>
<h:outputLabel for="patrimonio" value="Patrimonio"/>
<p:inplace id="patrimonio" editor="true" emptyLabel="Me edite">
<p:inputText value="#{impressoraMB.impressora.patrimonio}" required="true" label="text"/>
</p:inplace>
<h:outputLabel for="lotacoes" value="Lotações:"/>
<h:panelGroup>
<h:selectOneMenu id="lotacoes" value="#{impressoraMB.impressora.id_Lotacoes}" effect="fold" required="true"
immediate="true" style="width:100%">
<f:selectItems value="#{lotacoesMB.listLotacoes}" var="item"
itemLabel="#{item.nome}" itemValue="#{item.id}"/>
<f:ajax execute="#this"/>
</h:selectOneMenu>
</h:panelGroup>
</h:panelGrid>
<br/>
<div align="center">
<h:panelGrid>
<h:panelGroup>
<p:commandButton id="btnAlterar" value="Alterar" action="#{impressoraMB.alterar}" onclick="PF('alterarImpre').hide()"
oncomplete="PF('form').hide(); #{impressoraMB.impressora}" ajax="true" process="#form" title="Alterar">
<f:ajax execute="#all" render=":form:tab"/>
</p:commandButton>
<p:commandButton id="btnCancelar" value="Cancelar" onclick="PF('alterarImpre').hide()" title="Cancelar"/>
</h:panelGroup>
</h:panelGrid>
</div>
</h:form>
</p:dialog>
MY Bean..
public class ImpressoraMB {
private Impressora impressora;
private ImpressoraDAO dao;
private List<Impressora> impressoras;
public ImpressoraMB() {
impressora = new Impressora();
impressoras = new ArrayList<Impressora>();
dao = new ImpressoraDAO();
}
public List<Impressora> getImpressoras() {
if (impressoras.size() == 0) {
impressoras = dao.getImpressoras();
}
return impressoras;
}
public void adicionar() {
dao.adicionar(impressora);
impressora = new Impressora();
}
public void remover() {
dao.remover(impressora);
impressoras.remove(impressora);
impressora = new Impressora();
}
public void alterar() {
dao.alterar(impressora);
impressora = new Impressora();
}
public void showMsgAdicionar() {
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Impressora adicionada", "com sucesso!");
RequestContext.getCurrentInstance().showMessageInDialog(message);
}
public Impressora getImpressora() {
return impressora;
}
public void setImpressora(Impressora impressora) {
this.impressora = impressora;
}
}
Thank you very much in advance.
In your dialog you have
<h:selectOneMenu id="lotacoes" value="#{impressoraMB.impressora.id_Lotacoes}" effect="fold"
required="true" immediate="true" style="width:100%">
while your DataTable uses
<p:column id="lotacao" headerText="Lotação" filterBy="#{impressora.nome}"
filterMatchMode="contains" style="width:110px">
<h:outputLabel value="#{impressora.nome}"/>
</p:column>
If you change the value in one of the two different .xhtml files you should have the expected result
You have to use the update attribute in your command button or in your ajax call.
<p:commandButton id="btnAlterar" value="Alterar" action="#{impressoraMB.alterar}" update=":form:tab" onclick="PF('alterarImpre').hide()"
oncomplete="PF('form').hide(); #{impressoraMB.impressora}" ajax="true" process="#form" title="Alterar">
or
<f:ajax execute="#all" update=":form:tab" render=":form:tab"/>
Make sure that the object is updated in the backed bean

Forward variable on the next page

I have a Users table. Added, view and delete work. But I have problem to edit.
My list page:
<h:form id="form">
<p:dataTable styleClass="table" value="#{userMB.allAdmins}" var="admin" paginator="true" rows="15" rowKey="#{admin.id}" selection="#{userMB.user}" selectionMode="single">
<f:facet name="header">
Lista administratorów
</f:facet>
<p:column headerText="#{msg.firstName}">
<h:outputText value="#{admin.firstName}" />
</p:column>
<p:column headerText="#{msg.lastName}">
<h:outputText value="#{admin.lastName}" />
</p:column>
<p:column headerText="#{msg.personalId}">
<h:outputText value="#{admin.personalId}" />
</p:column>
<f:facet name="footer">
<p:commandButton id="viewButton" value="#{msg.info}" icon="ui-icon-search"
update=":form:display" oncomplete="userDialog.show()"/>
<p:commandButton action="#{userMB.createStart()}" value="#{msg.add}" icon="ui-icon-plus" />
<p:commandButton action="#{userMB.editStart()}" value="#{msg.edit}" >
<f:setPropertyActionListener target="#{userMB.user}" value="#{userMB.user}" />
</p:commandButton>
<p:commandButton action="#{userMB.deleteUser()}" value="#{msg.delete}" icon="ui-icon-close"/>
</f:facet>
</p:dataTable>
<p:dialog id="dialog" header="Administrator" widgetVar="userDialog" resizable="false"
width="300" showEffect="clip" hideEffect="explode">
<h:panelGrid id="display" columns="2" cellpadding="4">
<f:facet name="header">
<p:graphicImage value="./../../images/person4.png" width="150" height="150"/>
</f:facet>
<h:outputText value="#{msg.firstName}" />
<h:outputText value="#{userMB.user.firstName}" />
<h:outputText value="#{msg.lastName}" />
<h:outputText value="#{userMB.user.lastName}" />
<h:outputText value="#{msg.personalId}" />
<h:outputText value="#{userMB.user.personalId}" />
</h:panelGrid>
</p:dialog>
</h:form>
I want to send the selected user on the next page:
I use aciontListener:
<p:commandButton action="#{userMB.editStart()}" value="#{msg.edit}" >
<f:setPropertyActionListener target="#{userMB.user}" value="#{userMB.user}" />
</p:commandButton>
My edit page where I want to send user:
<h:form>
<div id="userPanel">
<h:inputHidden value="#{userMB.user}" />
<p:panel id="panelUser" header="Edytuj administratora" >
<div id="panelImage">
<img src="./../../images/person4.png" alt="person" width="150px" height="130px"/>
</div>
<h:panelGrid columns="3">
<p:outputLabel for="firstName" value="#{msg.firstName}"></p:outputLabel>
<p:inputText id="firstName" value="#{userMB.user.firstName}" label="#{msg.firstName}" required="true">
<f:validator validatorId="nameValidator" />
<p:ajax update="msgFristName" event="keyup" />
</p:inputText>
<p:message for="firstName" id="msgFristName"/>
<p:outputLabel for="lastName" value="#{msg.lastName}"></p:outputLabel>
<p:inputText id="lastName" value="#{userMB.user.lastName}" label="#{msg.lastName}" required="true">
<f:validator validatorId="nameValidator" />
<p:ajax update="msgLastName" event="keyup" />
</p:inputText>
<p:message for="lastName" id="msgLastName"/>
<p:outputLabel for="personalId" value="#{msg.personalId}"></p:outputLabel>
<p:inputText id="personalId" value="#{userMB.user.personalId}" label="#{msg.personalId}" required="true">
<f:validator validatorId="personalIdValidator" />
<p:ajax update="msgPersonalId" event="keyup" />
</p:inputText>
<p:message for="personalId" id="msgPersonalId"/>
<p:outputLabel for="password" value="#{msg.password}"></p:outputLabel>
</p:panel>
</div>
</h:form>
I added: <h:inputHidden value="#{userMB.user}" /> but I do not see data user, only empty field. How do I send this person? I used once this method in other project, a little different without primefaces and it worked. Why now does not work?
Method editStart:
public String editStart() {
return "editStart";
}
faces-config:
<navigation-case>
<from-outcome>editStart</from-outcome>
<to-view-id>/protected/admin/adminEdit.xhtml</to-view-id>
<redirect/>
</navigation-case>
When I'm on the side adminEdit I edited the pool and do editUser method:
public String editUser() {
FacesContext context = FacesContext.getCurrentInstance();
Map requestParameterMap = (Map) context.getExternalContext().getRequestParameterMap();
try {
String userRole = requestParameterMap.get("userRole").toString();
String active = requestParameterMap.get("active").toString();
Boolean act = Boolean.parseBoolean(active);
user.setRole(userRole);
user.setActive(act);
userDao.update(user);
} catch (EJBException e) {
sendErrorMessageToUser("Edit error");
return null;
}
sendInfoMessageToUser("Account edited");
return user.getRole() + "List";
}
My method editStart use only for navigation.
You can either consider Przemek's answer or use one of the 4 ways of passing a parameter to a backing bean.
1. Method expression
2. f:param
3. f:atribute
4. f:setPropertyActionListener
For very well explained full explanation refer to this
It has easy to understand examples. Take a look and pick what fits your needs.
Or simply:
In the actual managed bean...
public String navigationButtonListener(User parameter) {
FacesContext.getCurrentInstance().getExternalContext().getRequestMap()
.put("parameterAttribute", parameter);
return "my-destination-page";
}
In the destination managed bean...
#PostConstruct
public void init(){
myAttribute= (User) FacesContext.getCurrentInstance()
.getExternalContext().getRequestMap().get("parameterAttribute");
}
Good Luck!
You can pass your userid through the session.
Add a parameter to your commandLink
<p:commandButton action="#{userMB.editStart()}" value="#{msg.edit}>
<f:param name="userId" value="#{userMB.user.id}" />
</p:commandButton>
In your backing bean do this
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest myRequest = (HttpServletRequest)context.getExternalContext().getRequest();
HttpSession mySession = myRequest.getSession();
Integer userId = Integer.parseInt(myRequest.getParameter("userId"));
After that you can reload the user you want to edit with the Id you got

p:commandButton not working in p:wizard

The problem that I am facing is that <p:commandButton> with id="emailav" doesn't call the action method emailAvailability. I am using it inside p:wizard and also I have included the following block of code inside h:form.
1) xhtml
<p:tab id="personal" title="Personal">
<p:panel header="Personal Details" style="font-size:small">
<h:panelGrid columns="3" columnClasses="label, value"
styleClass="grid">
<h:outputText value="Username*" />
<p:inputText id="usrname" required="true" label="Username"
value="#{registrationBean.user.userName}"
requiredMessage="Username required" />
<p:message for="usrname"></p:message>
<h:outputText value="Firstname: *" />
<p:inputText id="frstname" required="true" label="Firstname"
value="#{registrationBean.user.firstName}"
requiredMessage="Firstname required" />
<p:message for="frstname"></p:message>
<h:outputText value="Lastname: *" />
<p:inputText id="lstname" required="true" label="Lastname"
value="#{registrationBean.user.lastName}"
requiredMessage="Lastname required" />
<p:message for="lstname"></p:message>
<h:outputText value="Password: *" />
<p:password id="pwd1" value="#{registrationBean.user.password}"
feedback="true" match="pwd2" label="Password" required="true"
requiredMessage="Password required" />
<p:message for="pwd1"></p:message>
<h:outputText value="Confirm Password: *" />
<p:password id="pwd2" value="#{registrationBean.user.password}"
label="Confirm Password" required="true"
requiredMessage="Enter the password again" />
<p:message for="pwd2"></p:message>
<h:outputText value="Date of Birth(dd/MM/yyyy):" />
<p:inputText id="dob" label="Date of Birth"
value="#{registrationBean.user.birthDate}" />
<p:message for="dob"></p:message>
<h:outputText value="Gender: " />
<p:selectOneMenu id="gender" value="#{registrationBean.user.gender}">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItem itemLabel="Male" itemValue="Male" />
<f:selectItem itemLabel="Female" itemValue="Female" />
<f:selectItem itemLabel="Other" itemValue="Other" />
</p:selectOneMenu>
<p:message for="gender"></p:message>
<h:outputText value="Relationship Status: " />
<p:selectOneMenu id="relationship"
value="#{registrationBean.user.relationship}">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItem itemLabel="Single" itemValue="Single" />
<f:selectItem itemLabel="Committed" itemValue="Committed" />
<f:selectItem itemLabel="Open relationship" itemValue="Open relationship" />
<f:selectItem itemLabel="Its comlicated" itemValue="Its complicated" />
</p:selectOneMenu>
<p:message for="relationship"></p:message>
<h:outputText value="Email: *" />
<p:inputText id="email" label="Email"
value="#{registrationBean.user.email}" required="true"
requiredMessage="Email required"/>
<p:message for="email"/>
<p:commandButton id="emailav" value="email availability"
action="#{registrationBean.emailAvailability}" update="emailav" />
<p:message for="emailav"></p:message>
<p:commandButton style="display:none"/>
<h:outputText value="Skip to last: " />
<h:selectBooleanCheckbox value="#{registrationBean.skip}" />
</h:panelGrid>
</p:panel>
</p:tab>
2)Backing bean
public String emailAvailability() {
logger.info("inside emailAvailability");
FacesContext context = FacesContext.getCurrentInstance();
Query query = em.createQuery("SELECT u FROM User u", User.class);
List<User> results = query.getResultList();
Iterator<User> it = results.listIterator();
while (it.hasNext()) {
if (it.next().getEmail().equals(user.getEmail())) {
context.addMessage(null,
new FacesMessage("Email already taken"));
}
}
context.addMessage(null, new FacesMessage("Email not taken"));
return "success";
}
try adding process="#this"
like
<p:commandButton
value="Add Site 1"
update="editor"
title="Remover"
action="#{jobEngine2MB.addSiteType1}"
process="#this" />

Primefaces populate other columns values based on selection of autocomplete

I am using Primefaces AutoComplete and I am getting records from database using Hibernate.
I am able to select values from database when I type in text. What I would like to achieve is when I select a name when I type characters, I would want my other columns in jsf page to get populated. E.g When I select employee name "SMITH" I want employee number, department to get filled with SMITH's employee number and department.
I have the following in jsf page.
<p:autoComplete value="#{myMB.selectedEmployee}"
id="basicPojo" minQueryLength="3"
completeMethod="#{myMB.complete}" var="p"
itemLabel="#{p.empName}"
converter="#{myconverter}"
forceSelection="true" >
<h:outputLabel value="Emp Number" />
<h:outputText value="#{p.employeeNumber}" />
<h:outputLabel value="Department" />
<h:outputText value="#{p.employeeDepartment}" />
</p:autoComplete>
When I select a name, other fields are not getting displayed.
What could be the reason for this? How can I achieve the desired result?
Any help is highly appreciated.
Edit 1
<p:dialog header="Create New Request" style="font-weight:bold"
widgetVar="requestNewDialog" resizable="false"
id="newDlg"
showEffect="fade" hideEffect="fade" appendToBody="true"
modal="true" position="center top" width="850" height="450">
<h:panelGrid columns="2" cellspacing="2">
<h:outputText value="New Employee No:" />
<h:outputText value="" />
</h:panelGrid>
<p:separator />
<p:panelGrid columns="6">
<h:outputLabel value="Employee # " for="emp" />
<p:autoComplete value="#
{myMB.selectedEmployee}"
id="basicPojo" minQueryLength="3"
completeMethod="#{myMB.complete}" var="p"
itemLabel="#{p.longName}"
converter="#{employeeNameConverter}"
forceSelection="true" >
<p:ajax event="itemSelect" update="num"
listener="#{myMB.handleSelect}" />
<h:outputLabel value="Name" for="name" />
<h:outputText value="#{p.employeeNumber}" />
</p:autoComplete>
<h:outputLabel id="num" value="Department" for="dept" />
<p:inputText id="dept" value="#{p.employeeNumber}" >
</p:inputText>
</p:panelGrid>
<p:separator />
</p:dialog>
ManagedBean complete Method
public List<Employee> complete(String query) {
List<Employee> suggestions;
suggestions = new ArrayList<Employee>();
try {
EmployeeQueryData q = new EmployeeQueryData ();
getService().getEmployee(q,query);
employee = q.getResult();
for (Employee p : employee) {
if (p.getEmpName().toLowerCase().contains(query));
suggestions.add(p); //
}
} catch (Exception e) {
}
return suggestions;
}
Use <p:ajax event="itemSelect"...
<p:autoComplete>...
<p:ajax event="itemSelect" update="someOtherFieldId someOtherFieldId2" />
</p:autoComplete>

Partially rendering datatable

After I save the components of a form I show it in a datatable. Interestingly if I don't refresh the page my datatable partially renders the values.
Here is the service class:
public EBSResponse uyeTeminatKaydet(UyeTeminat uyeTeminat, Kullanici sessionUser, String ipAdresi ){
Session session = null;
Transaction tx = null;
EBSException EE = new EBSException();
EBSResponse ER = new EBSResponse();
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("saved", false);
Date tarih = new Date();
if (uyeTeminat.getTarih()!= null)
tarih = uyeTeminat.getTarih();
else
uyeTeminat.setTarih(tarih);
uyeTeminat.setDurum(Boolean.TRUE);
BigDecimal teminatDegeri=null;
try {
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
teminatDegeri=calculateTeminatDegeri(uyeTeminat,tarih, session);
uyeTeminat.setTeminatDegeri(teminatDegeri);
session.save(uyeTeminat);
session.flush();
tx.commit();
List<UyeTeminat> uyeTeminatList = getTumUyeTeminatlari(session);
ER.setStringValue("teminatIslemleriBean.uyeTeminatKaydet.info1");
ER.setObjectValue(uyeTeminatList);
context.addCallbackParam("saved", true);
} catch (Exception ex) {
ex.printStackTrace();
if (tx != null) {
tx.rollback();
}
EE.setHataTipi(EBSConstants.HATA_TIPI_ERROR);
EE.setHataMesaji("teminatIslemleriBean.uyeTeminatKaydet.err1");
ER.setExceptionValue(EE);
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
return ER;
}
Here is the backing bean:
public void uyeTeminatKaydet() {
EBSResponse er = uyeServisi.uyeTeminatKaydet(uyeTeminat, sessionUser, ipAdresi);
if (er.getExceptionValue() == null) {
this.uyeTeminatList = (List<UyeTeminat>) er.getObjectValue();
FacesUtil.addMessage(FacesMessage.SEVERITY_INFO, LocaleBean.lang.getString(er.getStringValue()));
uyeTeminat = new UyeTeminat();
} else {
FacesUtil.addMessage(EBSUtils.getHataTipi(er.getExceptionValue().getHataTipi()), LocaleBean.lang.getString(er.getExceptionValue().getHataMesaji()));
}
}
Does anyone have any idea about this?
EDIT:
xhtml:
<h:outputText value="#{lang.teminatTuruAdi}: *" />
<h:selectOneMenu id="TeminatTuru" required="true" converter="teminatTurConverter" value="#{teminatTanimlamaIslemleriBean.teminat.teminatTur}">
<f:selectItem itemLabel="#{lang.seciniz}" />
<f:selectItems value="#{teminatTanimlamaIslemleriBean.teminatTurleriMenu}" />
</h:selectOneMenu>
<h:outputText value="#{lang.teminatKodu}: *" />
<p:inputText size="50" maxlength="50" required="true" value="#{teminatTanimlamaIslemleriBean.teminat.teminatKodu}"/>
<h:outputText value="#{lang.teminatAdi}: *" />
<p:inputText size="50" maxlength="50" required="true" value="#{teminatTanimlamaIslemleriBean.teminat.teminatAdi}"/>
<h:outputText value="#{lang.birimFiyat}: *" />
<p:inputText id="BirimFiyat" size="30" maxlength="50" value="#{teminatTanimlamaIslemleriBean.teminat.birimFiyati}"
style="text-align:right" onkeypress="return isNumberAndComma(event); isMaxLength(this, 14, event);" onkeyup="this.value=numberFormat(this.value,6);">
<f:converter converterId="ondalikAltiHaneConverter" />
</p:inputText>
<h:outputText value="#{lang.fiyatTipi}: *" />
<h:selectOneMenu id="FiyatTipi" required="true" value="#{teminatTanimlamaIslemleriBean.teminat.fiyatTuru}">
<f:selectItem itemLabel="#{lang.seciniz}" />
<f:selectItems value="#{genelBilgiBean.fiyatTipiListesi}" />
</h:selectOneMenu>
</h:panelGrid>
<br/>
<p:commandButton value="#{lang.kaydetButton}" onclick="confirmationKaydet.show()"/>
<br/><br/>
<p:dialog showEffect="explode" hideEffect="explode" resizable="false"
header="#{lang.uyari}" widgetVar="confirmationKaydet" appendToBody="true" modal="true">
<h:outputText value="#{lang.kayitOnayMesaji}"/>
<br/><br/>
<p:commandButton value="#{lang.evetButton}" actionListener="#{teminatTanimlamaIslemleriBean.teminatKaydet}"
update="sysMsg, dTable"
process="mf:formPanel"
onstart="waitDialog.show(),confirmationKaydet.hide()"
oncomplete="waitDialog.hide();handleComplete(xhr, status, args);" />
<p:commandButton value="#{lang.hayirButton}" onclick="confirmationKaydet.hide()" type="button" />
</p:dialog>
</p:panel>
<p:panel id="dtPanel" style="width: 80%">
<p:dataTable style="width: 100%;" id="dTable" var="tt" value="#{teminatTanimlamaIslemleriBean.teminatList}" paginator="true" rows="20"
selection="#{teminatTanimlamaIslemleriBean.selectedTeminat}" selectionMode="single" emptyMessage="#{lang.kayitBulunamadi}"
onRowSelectUpdate="mf:tabcontent" onRowSelectComplete="tvl();">
<f:facet name="header">
#{lang.menu_teminat}
</f:facet>
<p:column filterBy="#{tt.teminatId}" sortBy="#{tt.teminatId}">
<f:facet name="header">
<h:outputText value="#{lang.teminatId}" />
</f:facet>
<h:outputText value="#{tt.teminatId}" />
</p:column>
<p:column filterBy="#{tt.teminatTur.teminatTuruAdi}" sortBy="#{tt.teminatTur.teminatTuruAdi}">
<f:facet name="header">
<h:outputText value="#{lang.teminatTuruAdi}" />
</f:facet>
<h:outputText value="#{tt.teminatTur.teminatTuruAdi}" />
</p:column>
<p:column filterBy="#{tt.teminatKodu}" sortBy="#{tt.teminatKodu}">
<f:facet name="header">
<h:outputText value="#{lang.teminatKodu}" />
</f:facet>
<h:outputText value="#{tt.teminatKodu}" />
</p:column>
<p:column filterBy="#{tt.teminatAdi}" sortBy="#{tt.teminatAdi}">
<f:facet name="header">
<h:outputText value="#{lang.teminatAdi}" />
</f:facet>
<h:outputText value="#{tt.teminatAdi}" />
</p:column>
<p:column filterBy="#{tt.birimFiyati}" sortBy="#{tt.birimFiyati}" style="text-align:right">
<f:facet name="header">
<h:outputText value="#{lang.birimFiyat}" />
</f:facet>
<h:outputText value="#{tt.birimFiyati}" style="text-align:right">
<f:converter converterId="ondalikAltiHaneConverter" />
</h:outputText>
</p:column>
<p:column filterBy="#{tt.fiyatTuru}" sortBy="#{tt.fiyatTuru}">
<f:facet name="header">
<h:outputText value="#{lang.fiyatTipi}" />
</f:facet>
<h:outputText value="#{tt.fiyatTuru}" />
</p:column>
<p:column filterBy="#{tt.durum == true ? lang.kullanimda : lang.kullanimDisi}" sortBy="#{tt.durum == true ? lang.kullanimda : lang.kullanimDisi}">
<f:facet name="header">
<h:outputText value="#{lang.durum}" />
</f:facet>
<h:outputText value="#{tt.durum == true ? lang.kullanimda : lang.kullanimDisi}" />
</p:column>
<f:facet name="footer">
#{lang.toplamKayit}: #{fn:length(teminatTanimlamaIslemleriBean.teminatList)}
</f:facet>
</p:dataTable>
</p:panel>
there were two problems:
corresponding converters in Uye and Teminat did not include the necessary fields.
the correct xhtml for the same fields should have been:
d
<h:selectOneMenu id="uyeAdi" required="true" converter="uyeConverter" value="#{teminatTanimlamaIslemleriBean.uyeTeminat.uye}">
<h:selectOneMenu id="teminatTuruAdi" required="true" converter="teminatTurConverter" value="#{teminatTanimlamaIslemleriBean.uyeTeminat.teminat.teminatTur}">

Categories

Resources