Partially rendering datatable - java

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}">

Related

executeSQL4List error

Im trying call an hql and fill my datatable with the records in this list.
executeSQL4List Error::::::::::::::::::::::: org.hibernate.QueryException: Unable to resolve path [data.REC_NO], unexpected token [data] [select data from org.wi.core.model.VW_VISIT_ASSN_HIST where data.REC_NO = 201]
This is the error i get.
my code for html datatable:
<p:dataTable var="Detailrec" style="width:100%" paginator="true" scrollable="false" id="_dataTable2"
value="#{visitBean.listDetReport}" rowIndexVar="rowNum" rows="8" draggableColumns="true"
paginatorPosition="top" editable="false">
<p:column style="width:10%" sortBy="#{Detailrec.START_TIME}">
<f:facet name="header">
<h:outputText value="OLD START TIME" />
</f:facet>
<h:outputText value="#{Detailrec.START_TIME}"/>
</p:column>
<p:column style="width:10%" sortBy="#{Detailrec.END_TIME}" exportable="false">
<f:facet name="header">
<h:outputText value="OLD END TIME" />
</f:facet>
<h:outputText value="#{Detailrec.END_TIME}" />
</p:column>
<p:column style="width:20%" sortBy="#{Detailrec.TT_NO}">
<f:facet name="header">
<h:outputText value="TT NO" />
</f:facet>
<h:outputText value="#{Detailrec.TT_NO}"/>
</p:column>
<p:column style="width:20%" sortBy="#{Detailrec.COMMENTS}">
<f:facet name="header">
<h:outputText value="OLD COMMENTS" />
</f:facet>
<h:outputText value="#{Detailrec.COMMENTS}"/>
</p:column>
<p:column style="width:20%">
<f:facet name="header">
<h:outputText value="NEW COMMENTS" />
</f:facet>
<h:outputText value="#{Detailrec.NEW_COMMENTS}"/>
</p:column>
<p:column style="width:20%">
<f:facet name="header">
<h:outputText value="EDIT TIME" />
</f:facet>
<h:outputText value="#{Detailrec.EDIT_TIME}"/>
</p:column>
<p:column style="width:20%">
<f:facet name="header">
<h:outputText value="SYSTEM COMMENTS" />
</f:facet>
<h:outputText value="#{Detailrec.SYSTEM_COMMENTS}"/>
</p:column>
<p:column style="width:20%">
<f:facet name="header">
<h:outputText value="EDITED BY" />
</f:facet>
<h:outputText value="#{Detailrec.EDITTED_BY_NAME}"/>
</p:column>
<p:column style="width:20%">
<f:facet name="header">
<h:outputText value="ALIAS" />
</f:facet>
<h:outputText value="#{Detailrec.ALIAS}"/>
</p:column>
</p:dataTable>
And my function in bean that fills this datatable through a commandbutton is :
public void ViewHistory(Integer REC_NUM)
{
try
{
REC_NO=REC_NUM;
SQL = "select data from VW_VISIT_ASSN_HIST where data.REC_NO ="+REC_NO;
listDetReport = glb.getEntityMgr().executeSQL4List(SQL, whereValues, VW_VISIT_ASSN_HIST.class, false);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Can anyone help me solve the issue here? Im really confused.
You are using column name as alias in your SQL. It's like:
SQL = "select data from VW_VISIT_ASSN_HIST where data.REC_NO ="+REC_NO;
Change it to remove alias as:
SQL = "select data from VW_VISIT_ASSN_HIST where REC_NO ="+REC_NO;

Primefaces 4.0 datatable pagination and filter issue

I have datatable, code is below.
<h:form id="listaPoi">
<p:dataTable id="lokacije" var="poi" value="#{poiBacking.listaPoiLokacija}"
rowIndexVar="rowIndex" styleClass="nonsortable" paginator="true" rows="20"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="20,50,100" filteredValue="#{poiBacking.filteredPoi}"
emptyMessage="Nisu pronađeni POI za traženi upit">
<p:column filterBy="grad" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="Mjesto" />
</f:facet>
<h:outputText value="#{poi.grad}" />
</p:column>
<p:column filterBy="adresa" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="Adresa" />
</f:facet>
<h:outputText value="#{poi.adresa}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Geolat" />
</f:facet>
<h:outputText value="#{poi.geolat}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Geolon" />
</f:facet>
<h:outputText value="#{poi.geolon}" />
</p:column>
<p:column>
<f:facet name="header">
</f:facet>
<p:commandButton icon="ui-icon-pencil" value="Uredi lokaciju"
actionListener="#{poiBacking.getPois(poi.geolat,poi.geolon)}"
action="#{poiBacking.setLinkUpdate()}"
oncomplete="PF('poiDialog').show()" update=":unos,:poiDialogId,:toolbar" />
</p:column>
</p:dataTable>
</h:form>
Problem is when i click on second or any other page, datatable shows only first record. If i filter, results are the same. In backing bean list for filtered values contains all values but also shows only first.
Lists in PoiBacking:
private List<PoiLokacija> listaPoiLokacija;
private List<PoiLokacija> filteredPoi;
listaPoiLokacija is fill in #PostConstruct method init().
You didn't give us your code in PoiBacking, so I have no idea if there are something wrong in PoiBacking.
However, I tried your code and find every thing work just fine.
Check this:
Page(Deleted oncomplete="PF('poiDialog').show()" update=":unos,:poiDialogId,:toolbar" since I can't find them in your code) :
<h:form id="listaPoi">
<p:dataTable id="lokacije" var="poi" value="#{poiBacking.listaPoiLokacija}"
rowIndexVar="rowIndex" styleClass="nonsortable" paginator="true" rows="3"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="20,50,100" filteredValue="#{poiBacking.filteredPoi}"
emptyMessage="Nisu pronađeni POI za traženi upit">
<p:column filterBy="grad" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="Mjesto" />
</f:facet>
<h:outputText value="#{poi.grad}" />
</p:column>
<p:column filterBy="adresa" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="Adresa" />
</f:facet>
<h:outputText value="#{poi.adresa}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Geolat" />
</f:facet>
<h:outputText value="#{poi.geolat}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Geolon" />
</f:facet>
<h:outputText value="#{poi.geolon}" />
</p:column>
<p:column>
<f:facet name="header">
</f:facet>
<p:commandButton icon="ui-icon-pencil" value="Uredi lokaciju"
actionListener="#{poiBacking.getPois(poi.geolat,poi.geolon)}"
action="#{poiBacking.setLinkUpdate()}"
/>
</p:column>
</p:dataTable>
</h:form>
Backing Bean(Set every attributes in PoiLokacija as String since you didn't mention it):
private List<PoiLokacija> listaPoiLokacija=new ArrayList<>();
private List<PoiLokacija> filteredPoi=new ArrayList<>();
#PostConstruct
public void init(){
listaPoiLokacija.add(new PoiLokacija("grad1", "adresa1", "geolat1", "geolon1"));
listaPoiLokacija.add(new PoiLokacija("grad2", "adresa2", "geolat2", "geolon2"));
listaPoiLokacija.add(new PoiLokacija("grad3", "adresa3", "geolat3", "geolon3"));
listaPoiLokacija.add(new PoiLokacija("grad4", "adresa4", "geolat4", "geolon4"));
listaPoiLokacija.add(new PoiLokacija("grad5", "adresa5", "geolat5", "geolon5"));
listaPoiLokacija.add(new PoiLokacija("grad6", "adresa6", "geolat6", "geolon6"));
filteredPoi.addAll(listaPoiLokacija);
}
public void getPois(String geolat,String geolon){
System.out.println(geolat+","+geolon);
}
public void setLinkUpdate(){
System.out.println("setLinkUpdate");
}

Why i can't refresh my dataTable, after adding data?

When i drag my panel into my 'dataTable', all works fine(my listener is called, my object is added to my DataBase) but my 'dataTable' is not updated and i need to refresh my page to see it. My xhtml:
<h:form id="formDashboard">
<p:layoutUnit id="gridLeft" position="west" size="250" style="position:absolute;">
<p:fieldset style="padding:0;padding-top:5px;">
<f:facet name="legend" id="legendId">
<p:commandButton icon="ui-icon-plus" actionListener="#{myMemosController.prepareCreate}" value="Add Memo" onclick="addMemo.show()" update=":formAdd:commentAddInput, :formAdd:chooseAddPriority" style="width:30px;height:30px;"/>
</f:facet>
<p:dataGrid id="leftData" var="item" columns="1" value="#{myMemosController.items}" style="border:none;">
<p:panel id="pnl" style="background-color:#{item.priority}}" closable="true">
<p:ajax event="close" listener="#{myMemosController.destroy}"/>
<f:facet name="header">
<h:panelGroup>
<h:outputText value="#{item.name}" styleClass=""/>
<p:commandButton icon="ui-icon-pencil" actionListener="#{myMemosController.prepareEdit}" update=":formEdit:commentEditInput, :formEdit:chooseEditPriority" onclick="editMemo.show();" style="width:19px;height:19px;"/>
</h:panelGroup>
</f:facet>
<h:panelGrid columns="1" style="width:100%">
<h:outputText value="#{item.comments}" styleClass=""/>
</h:panelGrid>
<f:facet name="footer">
<h:outputText value="#{item.date} at #{item.time}" styleClass="footerStyle"/>
</f:facet>
</p:panel>
<p:draggable for="pnl" helper="clone" handle=".ui-panel-titlebar" stack=".ui-panel" zindex="100"/>
</p:dataGrid>
</p:fieldset>
</p:layoutUnit>
<p:layoutUnit position="center" style="position:absolute;">
<p:fieldset id="selectedMemos" legend="Selected Memos" style="margin-top:20px">
<p:outputPanel id="dropArea">
<p:dataTable id="centerData" value="#{dashboardController.items}" var="item">
<p:column style="text-align:center;">
<f:facet name="header">
<h:outputText value="Priority"/>
</f:facet>
<h:outputText value="#{item.priorityname}"/>
</p:column>
<p:column style="text-align:center;">
<f:facet name="header">
<h:outputText value="Name"/>
</f:facet>
<h:outputText value="#{item.name}"/>
</p:column>
<p:column style="text-align:center;">
<f:facet name="header">
<h:outputText value="Comment"/>
</f:facet>
<h:outputText value="#{item.comments}"/>
</p:column>
<p:column style="text-align:center;">
<f:facet name="header">
<h:outputText value="Time"/>
</f:facet>
<h:outputText value="#{item.time}"/>
</p:column>
<p:column style="text-align:center;">
<f:facet name="header">
<h:outputText value="Date"/>
</f:facet>
<h:outputText value="#{item.date}"/>
</p:column>
</p:dataTable>
</p:outputPanel>
</p:fieldset>
<p:droppable for="selectedMemos" tolerance="touch" activeStyleClass="ui-state-highlight" >
<p:ajax listener="#{myMemosController.onMemoDrop}" process="#this" update="dropArea, leftData"/>
</p:droppable>
</p:layoutUnit>
</h:form>
My method onMemoDrop:
public void onMemoDrop(DragDropEvent ddEvent)
{
String[] idTokens = ddEvent.getDragId().split(String.valueOf(UINamingContainer.getSeparatorChar(FacesContext.getCurrentInstance())));
int rowIndex = Integer.parseInt(idTokens[idTokens.length - 2]);
String name = idTokens[idTokens.length - 3];
MyMemos memo = null;
if (name.equals("leftData"))
{
items.setRowIndex(rowIndex);
memo = (MyMemos) items.getRowData();
dashboardController.create(1, memo.getName(), memo.getComments(), memo.getDate(), memo.getTime(), memo.getPriority(), memo.getPriorityname());
}
}
and the create method:
public String create(int id, String name, String comment, String date, String time, String priority, String priorityName)
{
try
{
System.out.println("I am in Create() method from DashboardController");
current = new Dashboard(id, name, comment, date, time, priority, priorityName);
getFacade().create(current);
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/resources/Bundle").getString("DashboardCreated"));
return prepareCreate();
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/resources/Bundle").getString("PersistenceErrorOccured"));
return null;
}
}
May be a suggestion?
I think that this code is not working :
<p:ajax listener="#{myMemosController.onMemoDrop}" process="#this" update="dropArea, leftData"/>
, because this p:ajax cannot resolve the 'dropArea'. Ultimately, the component cannot be found and is not getting updated.
One solution to point to you datatable is set update as :
update=":#{p:component('centerData')}, :#{p:component('leftData')}"
Or maybe use widget vars
The problem was from my managed bean "DashboardController", when i removed #stateless and added an injection like: #ManagedBean(name = "dashboardController") and in MyMemosController i added: #ManagedProperty("value="#{dashboardController}""). Now my dataTable is correctly update.

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

How to update jsf datatable from back bean

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();");

Categories

Resources