deleting a row in integration of jsf spring hibernate primefaces - java

i am using integration of jsf hibernate spring primfaces in my project. i want to delete row in my primefaces data table. but i am not sure about delete method in my managed bean. when i want to delete i have following error. please help me to write correct deletePersonel method.
/personel.xhtml #95,74 actionListener="#{personelMB.deletePersonel()}": java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
Personel.java
#Entity
#Table(name="TBLPERSONEL")
public class Personel {
#Id
#Column(name="PERSONEL_ID")
private int personel_id;
#Column(name="PNAME")
private String pname;
#Column(name="PFAMILY")
private String pfamily;
#Column(name="PADDRESS")
private String paddress;
#Column(name="PPHONE")
private String pphone;
#OneToOne
#PrimaryKeyJoinColumn
private Manager manager;
#OneToMany(mappedBy="personel")
private Set<Stufftransfer> stufftransfers;
public Personel(){
}
//getter and setter
PersonelDao
public class PersonelDao implements IPersonelDao {
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void deletePersonel(Personel personel) {
getSessionFactory().getCurrentSession().delete(personel);
}
PersonelService
#Transactional(readOnly=true)
public class PersonelService implements IPersonelService{
IPersonelDao personeldao;
public IPersonelDao getPersoneldao() {
return personeldao;
}
public void setPersoneldao(IPersonelDao personeldao) {
this.personeldao = personeldao;
}
#Transactional(readOnly=false)
#Override
public void deletePersonel(Personel personel) {
getPersoneldao().deletePersonel(personel);
}
PersonelBean
#ManagedBean(name="personelMB")
#SessionScoped
public class PersonelBean implements Serializable{
private static final long serialVersionUID = 1L;
#ManagedProperty(value="#{PersonelService}")
IPersonelService personelservice;
List<Personel> personelList;
private int personel_id;
private String pname;
private String pfamily;
private String paddress;
private String pphone;
public IPersonelService getPersonelservice() {
return personelservice;
}
public void setPersonelservice(IPersonelService personelservice) {
this.personelservice = personelservice;
}
public List<Personel> getPersonelList() {
personelList=new ArrayList<Personel>();
personelList.addAll(getPersonelservice().getPersonels());
return personelList;
}
public void setPersonelList(List<Personel> personelList) {
this.personelList = personelList;
}
public void addPersonel(){
Personel personel=new Personel();
personel.setPaddress(getPaddress());
personel.setPersonel_id(getPersonel_id());
personel.setPfamily(getPfamily());
personel.setPname(getPname());
personel.setPphone(getPphone());
getPersonelservice().addPersonel(personel);
}
public void deletePersonel(){
Personel personel=(Personel)personelservice.getPersonelId(personel_id);
getPersonelservice().deletePersonel(personel);
}
//getter and setter
personel.xhtml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="rtl"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>اطلاعات پرسنلی</title>
</h:head>
<h:body>
<h1>اضافه کردن پرسنل جدید</h1>
<h:form>
<h:panelGrid columns="4" >
شماره پرسنلی :
<h:inputText id="id" value="#{personelMB.personel_id}"
size="20" required="true"
label="id" >
</h:inputText>
<br></br>
نام :
<h:inputText id="name" value="#{personelMB.pname}"
size="20" required="true"
label="Name" >
</h:inputText>
نام خانوادگی:
<h:inputText id="family" value="#{personelMB.pfamily}"
size="20" required="true"
label="family" >
</h:inputText>
آدرس :
<h:inputTextarea id="address" value="#{personelMB.paddress}"
cols="30" rows="10" required="true"
label="Address" >
</h:inputTextarea>
تلفن:
<h:inputText id="tel" value="#{personelMB.pphone}"
size="20" required="true"
label="tel" >
</h:inputText>
</h:panelGrid>
<h:commandButton value="درج اطلاعات" action="#{personelMB.addPersonel()}" />
</h:form>
<h2>مشاهده اطلاعات پرسنل</h2>
<h:form prependId="false">
<p:dataTable id="dataTable" var="personel" value="#{personelMB.personelList}" rowKey="#{personelMB.personel_id}">
<f:facet name="header">
اطلاعات پرسنل
</f:facet>
<p:column>
<f:facet name="header">
شماره پرسنلی
</f:facet>
<h:outputText value="#{personel.personel_id}" />
<f:facet name="footer">
کدملی
</f:facet>
</p:column>
<p:column headerText="نام">
<h:outputText value="#{personel.pname}" />
</p:column>
<p:column headerText="نام خانوادگی">
<h:outputText value="#{personel.pfamily}" />
</p:column>
<p:column headerText="آدرس">
<h:outputText value="#{personel.paddress}" />
</p:column>
<p:column headerText="تلفن">
<h:outputText value="#{personel.pphone}" />
</p:column>
<p:column>
<f:facet name="حذف">
<h:outputText value="" />
</f:facet>
<p:commandButton icon="ui-icon-close" title="حذف"
actionListener="#{personelMB.deletePersonel()}" />
</p:column>
<f:facet name="footer">
تعداد رکورد#{fn:length(personelMB.getPersonelList())} میباشد.
</f:facet>
</p:dataTable>
</h:form>
</h:body>
</html>
please help me to write correct deletePersonel in my PersonelBean.java.

Change your managed bean delete method likes this;
public void deletePersonel(int personel_id){
Personel personel=(Personel)personelservice.getPersonelId(personel_id);
getPersonelservice().deletePersonel(personel);
}
and also change your xhtml likes this;
<p:commandButton icon="ui-icon-close" title="حذف"
actionListener="#{personelMB.deletePersonel(personel.personel_id)}" />
Add refresh method to your managed bean likes this;
public String deleteAction(Personel personel) {
personelList.remove(personel);
return null;
}
and edit your p:commandButton likes this;
<p:commandButton icon="ui-icon-close" title="حذف"
actionListener="#{personelMB.deletePersonel(personel.personel_id)" action="#{personelMB.delectAction(personel)}"/>

Related

send parameter with jsf tag <f:param> to bean

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<ui:composition>
<h:form>
<h:panelGrid columns="2">
<h:outputText value="New categorie"></h:outputText>
<h:inputText value="${categorieBean.categorie.name}"></h:inputText>
<h:commandButton value="Add categorie" action="#{categorieBean.dodajKategoriju}">
<f:ajax render="#form" execute="#form"></f:ajax>
</h:commandButton>
</h:panelGrid>
<h:dataTable value="${categorieBean.categories}" var="categor">
<h:column>
<f:facet name="header">Name</f:facet>
<h:outputText value="${categor.name}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">DELETE</f:facet>
<h:commandButton value="Delete-${categor.id}" action="#{categorieBean.obrisiKategoriju()}"
style="width: 64px;background-color: green;color: white;border: none;height: 27px;border-radius:
5px;">
<f:ajax render="#form" execute="#form"></f:ajax>
<f:param value="${categor.id}" name="id"></f:param>
</h:commandButton>
</h:column>
</h:dataTable>
</h:form>
</ui:composition>
</html>
#ManagedBean(name="categorieBean")
#SessionScoped
public class CategorieBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 7281388938441323040L;
private List<Categorie> categories=new ArrayList<Categorie>();
private Categorie categorie=new Categorie();
public CategorieBean() {
// TODO Auto-generated constructor stub
}
public List<Categorie> getCategories() {
categories=CategorieDAO.readAll();
return categories;
}
public void setCategories(List<Categorie> categories) {
this.categories = categories;
}
public Categorie getCategorie() {
return categorie;
}
public void setCategorie(Categorie categorie) {
this.categorie = categorie;
}
public String obrisiKategoriju() {
System.out.println("hocu da obrisem kategoriju");
HttpServletRequest req=(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
System.out.println(req.getParameter("id"));
Map<String,String> mapa=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
for(Entry<String,String>pom:mapa.entrySet()) {
System.out.println(pom.getKey()+" "+pom.getValue());
}
if(mapa.containsKey("id")) {
System.out.println("Usao sam");
int id=Integer.parseInt(mapa.get("id"));
CategorieDAO.delete(id);
}
return "";
}
public String dodajKategoriju() {
CategorieDAO.insert(categorie);
return "";
}
}
I do not send id param to Bean in method obrisiKategoriju() when I print value of requestparammap I get only j_idt6 j_idt6
j_idt6:j_idt9
j_idt6:j_idt11:0:j_idt17 Delete-1
javax.faces.ViewState 9066186310981453487:-2255221033905007338 someone have idea? I have another Bean but it work perfect, with these it does not, I tried everything

p:ajax change event request returns 500 error

I am trying to set up 2 chained select boxes using JSF and PrimeFaces. I have created them as in the example on the official site, however:
When i enter the page using the new button(no existing record to be displayed) the change event will return a 500 error from the controller
When i enter the page using the edit button(there is an existing record) the change event will not return a 500 error, however the id from the select is not mapped to the record.
Any help would be appreciated.
Relevant code bits below:
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:o="http://omnifaces.org/ui"
template="/WEB-INF/templates/page.xhtml">
<f:metadata>
<o:viewParam name="userUploadedWorkId" value="#{userUploadedWorkController.userUploadedWork}"
converter="#{userUploadedWorkConverter}"
converterMessage="Solicitare eronata. Va rugam sa navigati in aceasta pagina dintr-o lista de lucrari"/>
</f:metadata>
<ui:define name="bread-crumb">
<p:menuitem value="Lucrarile mele" outcome="user-uploaded-work-list?faces-redirect=true"/>
<p:menuitem
value="#{userUploadedWorkController.userUploadedWork.id eq null ? 'Lucrare noua' : userUploadedWorkController.userUploadedWork.title}"
url="#"/>
</ui:define>
<ui:define name="page-content">
<h:form>
<p:panelGrid columns="2" columnClasses="right-aligned,raw" id="user-uploaded-work-details">
<f:facet name="header">Detalii lucrare</f:facet>
<p:outputLabel value="Titlu" for="uuwTitle"/>
<p:inputText id="uuwTitle" value="#{userUploadedWorkController.userUploadedWork.title}" required="true"
style="width: 400px"/>
<p:outputLabel value="Capitol" for="chapter"/>
<p:selectOneMenu style="width: 400px" required="true" id="chapter" value="#{userUploadedWorkController.userUploadedWork.criterion eq null?'':userUploadedWorkController.userUploadedWork.criterion.chapter.id}" effect="fade">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{chapters}" var="ch" itemLabel="#{ch.name}" itemValue="#{ch.id}"/>
<p:ajax update="uuwCriterion" listener="#{userUploadedWorkController.chapterChange}"/>
</p:selectOneMenu>
<p:outputLabel value="Criteriu" for="uuwCriterion"/>
<p:selectOneMenu style="width: 400px" required="true" id="uuwCriterion" value="#{userUploadedWorkController.userUploadedWork.criterion eq null?'':userUploadedWorkController.userUploadedWork.criterion.id}" effect="fade">
<f:selectItem itemLabel="Select One" itemValue="" />
<f:selectItems value="#{userUploadedWorkController.criteria}" var="criterion" itemLabel="#{criterion.name}" itemValue="#{criterion.id}"/>
</p:selectOneMenu>
<f:facet name="footer">
<p:message for="uuwTitle"/>
<p:message for="uuwCriterion"/>
<p:message for="uuwChapter"/>
<p:commandButton action="#{userUploadedWorkController.save}" value="Salveaza atribute" process="#form"
update="#form :messages" icon="ui-icon-disk"/>
<p:button outcome="user-uploaded-work-list?faces-redirect=true" value="Lista lucrari"
icon="ui-icon-arrowreturnthick-1-e"/>
</f:facet>
</p:panelGrid>
</h:form>
</ui:define>
The managed bean:
#Named
#ViewScoped
public class UserUploadedWorkController implements Serializable {
private static final long serialVersionUID = -4736897416993974840L;
#Inject
private OrganizationalChartService service;
private UserUploadedWork userUploadedWork = new UserUploadedWork();
private List<Criterion> criteria;
public UserUploadedWork getUserUploadedWork() {
return userUploadedWork;
}
public void setUserUploadedWork(UserUploadedWork userUploadedWork) {
this.userUploadedWork = userUploadedWork;
}
#PostConstruct
public void init() {
criteria = service.findAllCriteria();
}
public List<Criterion> getCriteria() {
return criteria;
}
public void setCriteria(List<Criterion> criteria) {
this.criteria = criteria;
}
public String save() {
userUploadedWork.setCriterion(service.findById(Criterion.class, userUploadedWork.getCriterion().getId()));
userUploadedWork.setUser(service.findBySimpleProperty(User.class, "email", LoginController.getRequest().getUserPrincipal().getName()));
userUploadedWork = service.merge(userUploadedWork);
Messages.addFlashGlobalInfo("Salvare efectuata cu succes");
return "user-uploaded-work-list?faces-redirect=true";
}
public void chapterChange() {
if (userUploadedWork.getChapter() != null
&& userUploadedWork.getChapter().getId() != null) {
criteria = service.findCriteriaByChapter(userUploadedWork.getChapter().getId());
} else {
criteria = new ArrayList<Criterion>();
}
}
}

Why this table In-Cell editor, doesnt work?

I am trying to figure out, how the primefaces in-cell editor works.
For some reason, it does not work. I just see it activating and also i can type, but the values do not change. What is missing?
<?xml version='1.0' encoding='UTF-8' ?>
<!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:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:form>
<p:dataTable id="allSubjects" var="subject" value="#{subjectControllerUpdate.retrieve()}" paginator="true" rows="7" >
<p:column headerText="Name" sortBy="#{subject.name}" style="width:200px" >
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{subject.name}"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{subject.name}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column sortBy="#{subject.description}" headerText="Description">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{subject.description}"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{subject.description}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column sortBy="#{subject.credits}" headerText="Credits" style="width:50px">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{subject.credits}"/>
</f:facet>
<f:facet name="input">
<p:inputText value="#{subject.credits}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Options" style="width:50px">
<p:rowEditor />
</p:column>
</p:dataTable>
</h:form>
</html>
This is the managed bean
package controllers;
import crudfacades.SubjectFacade;
import entities.Subject;
import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
#Named("subjectControllerUpdate")
#SessionScoped
public class SubjectControllerUpdate implements Serializable {
private List<Subject> subjects;
private Subject currentSubject;
#EJB
private SubjectFacade ejbFacade;
//INITIALIZATION
public SubjectControllerUpdate() {
currentSubject = new Subject();
}
//RETRIEVE
public List<Subject> retrieve() {
return getSubjectFacade().findAll();
}
//UPDATE
//HELP METHODS
//RETURN THE FACADE FOR DATA MANIPULATION(Best practice)
private SubjectFacade getSubjectFacade() {
return ejbFacade;
}
//GETTERS AND SETTERS
public Subject getCurrentSubject() {
return currentSubject;
}
public void setCurrentSubject(Subject currentSubject) {
this.currentSubject = currentSubject;
}
public List<Subject> getSubjects() {
return subjects;
}
public void setSubjects(List<Subject> subjects) {
this.subjects = subjects;
}
}
but when i click comfirm, the value in the UI is not changed
You've bound the value of the <p:dataTable> to retrieve() instead of getSubjects(). So every single getter call will get the values straight from the DB instead of the model.
and i see no changes in the database
You are not saving anything in the DB.
Fix your controller as follows:
#Named
#SessionScoped
public class SubjectControllerUpdate implements Serializable {
private DataModel<Subject> subjects;
#EJB
private SubjectFacade ejbFacade;
#PostConstruct
public void init() {
subjects = new ListDataModel<Subject>(ejbFacade.findAll());
}
public void save() {
ejbFacade.save(subjects.getRowData());
}
public List<Subject> getSubjects() {
return subjects;
}
}
with
<h:form>
<p:dataTable value="#{subjectControllerUpdate.subjects}" ...>
        <p:ajax event="rowEdit" listener="#{subjectControllerUpdate.save}" />
...
</p:dataTable>
</h:form>
Using DataModel<Subject> instead of List<Subject> is necessary in order to be able to get the current row.

h:commandButton not working within PrimeFaces p:dataTable

I have a PrimeFaces datatable. For each row in this table, I want to allow the user to update/delete the row entry (a user).
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
<link type="text/css" rel="stylesheet" href="themes/bluesky/skin.css" />
</h:head>
<h:body>
<center>
<h:form>
<p:panel id="viewUsersPanel" header="View Users">
<p:dataTable var="user" value="#{uController.users}"
emptyMessage="No Users Found.">
<p:column style="text-align: center;">
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{user.name}" />
</p:column>
<p:column style="text-align: center;">
<f:facet name="header">
<h:outputText value="Postal Address" />
</f:facet>
<h:outputText value="#{user.address}" />
</p:column>
<p:column style="text-align: center;">
<f:facet name="header">
<h:outputText value="Phone Number" />
</f:facet>
<h:outputText value="#{user.phone}" />
</p:column>
<p:column style="text-align: center;">
<f:facet name="header">
<h:outputText value="Email Address" />
</f:facet>
<h:outputText value="#{user.email}" />
</p:column>
<p:column style="text-align: center;">
<f:facet name="header">
<h:outputText value="DOB" />
</f:facet>
<h:outputText value="#{user.dob}">
<f:convertDateTime pattern="dd-MMM-yyyy" />
</h:outputText>
</p:column>
<p:column style="text-align: center;">
<f:facet name="header">
<h:outputText value="No. Memberships" />
</f:facet>
<h:outputText value="#{user.numberOfMemberships}" />
</p:column>
<p:column style="text-align: center;">
<f:facet name="header">
<h:outputText value="Actions" />
</f:facet>
<h:commandButton value="Update" action="#{uController.update}" />
<h:commandButton value="Delete" action="#{uController.delete}" />
</p:column>
</p:dataTable>
<h:panelGrid columns="2" cellpadding="2" id="footerPanelGrid"
border="0">
<h:commandButton action="#{uController.home}" value="Home Page" />
</h:panelGrid>
</p:panel>
</h:form>
</center>
</h:body>
</html>
However, neither of the buttons work. Instead they appear to simply refresh the view page. I have ran the app in debug and neither update or delete method is hit.
I suspect this may be due to using h:commandButton within a p:dataTable. However, I have also tried p:commandButton but to no avail.
For reference, here is a snippet of the UserController class:
#ManagedBean(name="uController")
public class UserController extends AbstractController {
private Collection<User> users;
...
public String update() {
System.out.println("Ready for update");
return "update-user";
}
public String delete() {
System.out.println("Ready for delete");
return "delete-user";
}
...
}
I have found the solution using a ViewScoped bean. The article that I came across for this:
Learning JSF2: Managed beans
I changed my h:commandButton to:
<h:commandButton value="Delete" action="#{userList.delete}">
<f:setPropertyActionListener target="#{userList.selectedUser}"
value="#{user}" />
I also re-designed my UserController class and it became UserList:
import java.util.Collection;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
#ManagedBean(name="userList")
#ViewScoped
public class UserList {
private Collection<User> users;
private User selectedUser;
#ManagedProperty(value="#{userService}")
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
#PostConstruct
public void populateList() {
users = userService.getUsers();
}
public void delete() {
// TODO remove from DB
users.remove(selectedUser);
}
public User getSelectedUser() {
return selectedUser;
}
public void setSelectedUser(User selectedUser) {
this.selectedUser = selectedUser;
}
public Collection<User> getUsers() {
return users;
}
}
Thanks for your responses Zenzen.

Submit Listener Method in the BackBean is not getting invoked

My result tables/images will be displayed in the same page. But the submit button is not invoked. I have two drop downs on which the values of the other two drop downs are dependent. If I am writting immediate="true" the method is invoked but only two values are set with whom I have associated processValueChange action the other selected values are not updated in the bean.
The jsp page is as follows:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%#taglib uri="http://www.ibm.com/jsf/html_extended" prefix="hx"%>
<%#taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%#taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%#taglib
uri="http://www.ibm.com/jsf/BrowserFramework" prefix="odc"%>
<html>
<head>
<script language="javascript" src="Validation.js"></script>
<link rel="stylesheet" href="../css/style.css" type="text/css">
<title>SLA DASHBOARD</title>
</head>
<f:view>
<body>
<hx:scriptCollector id="scriptCollector1">
<div id="mDiv" class="pStyle">
<h:form styleClass="form" id="LoginForm" ><br>
<br>
<div id="Header" class="hStyle">
<h:outputText value= "WELCOME TO SLA DASHBOARD" />
</div>
<br><br>
<div id="fDiv" >
<fieldset class="fStyle">
<legend style="text-align: left;padding: 6px; font-weight:bold; font-size: 14">PLEASE MAKE YOUR SELECTION</legend><br>
<h:outputText value="BU"/>
<h:selectOneMenu id="slaBU" value="#{LoginForm.slaPeriod}"
onchange="this.form.submit();" valueChangeListener="#{LoginForm.processBUChange}">
<f:selectItems value="#{LoginForm.buList}" />
</h:selectOneMenu>
<h:outputText>Application</h:outputText>
<h:selectOneMenu id="slaApplication" style="width:160px" value="#{LoginForm.slaApp}" required="true">
<f:selectItems value="#{LoginForm.appList}" />
</h:selectOneMenu>
<h:outputText>Period</h:outputText>
<h:selectOneMenu id="slaPeriod" value="#{LoginForm.slaPeriod}" onchange="this.form.submit()"
valueChangeListener="#{LoginForm.processPeriodChange}" >
<f:selectItems value="#{LoginForm.periodList}" />
</h:selectOneMenu>
<h:selectOneMenu id="slaPeriod1" style="width:100px"
value="#{LoginForm.slaPeriod1}" required="true">
<f:selectItems value="#{LoginForm.periodList1}" />
</h:selectOneMenu>
<h:selectOneMenu id="slaPeriod2" value="#{LoginForm.slaPeriod2}" required="true">
<f:selectItems value="#{LoginForm.periodList2}" />
</h:selectOneMenu>
<h:outputText value="SLA Group" />
<h:selectOneMenu id="slaGroup" value="#{LoginForm.slaGroup}" required="true">
<f:selectItems value="#{LoginForm.groupList}" />
</h:selectOneMenu>
<h:outputText>View</h:outputText>
<h:selectOneMenu id="slaView" value="#{LoginForm.slaView}" required="true">
<f:selectItems value="#{LoginForm.viewList}" />
</h:selectOneMenu>
<h:commandButton id="submitButton" value="Submit"
type="submit"
style="width:60px;" action="#{LoginForm.processSubmit}"
/>
<br>
<br>
</fieldset>
</div><br><br><br>
<div id="tDiv" >
<h:dataTable id="bTable" value="#{LoginForm.BT}" var="BillingTable"
style="font-weight: bold; text-align: center;" bgcolor="#D4D7FE"
border="4" cellpadding="1" width="60%"
rendered="#{LoginForm.btDisplay}">
<f:facet name="header">
<h:outputText value="Billing Report" style="font-weight: bold"/>
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="Buisness Unit" />
</f:facet>
<h:outputText value="#{BillingTable.buName}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Completion Date" />
</f:facet>
<h:outputText value="#{BillingTable.completionDate}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Target Date" />
</f:facet>
<h:outputText value="#{BillingTable.targetDate}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Billing Cycle" />
</f:facet>
<h:outputText value="#{BillingTable.billingCyle}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Status" />
</f:facet>
<h:outputText value="#{BillingTable.status}"></h:outputText>
</h:column>
</h:dataTable>
<br>
<h:dataTable id="uTable" value="#{LoginForm.UT}" var="UptimeTable"
style="text-align: center" bgcolor="#D4D7FE"
border="4" cellpadding="1" width="60%" rendered="#{LoginForm.utDisplay}">
<f:facet name="header">
<h:outputText value="Uptime Report" style="font-style: normal; font-weight: bold"/>
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="Application Name" style="width:60px" />
</f:facet>
<h:outputText value="#{UptimeTable.applicationName}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Application Class" />
</f:facet>
<h:outputText value="#{UptimeTable.applicationClass}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Availability-Actual" />
</f:facet>
<h:outputText value="#{UptimeTable.actual}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Availability-Target" />
</f:facet>
<h:outputText value="#{UptimeTable.target}"></h:outputText>
</h:column>
</h:dataTable>
<br>
<h:dataTable id="tTable" value="#{LoginForm.TT}" var="TATTable"
style="font-weight: bold; text-align: center" bgcolor="#D4D7FE"
border="4" cellpadding="1" width="60%"
rendered="#{LoginForm.ttDisplay}">
<f:facet name="header">
<h:outputText value="Turn Around Time Report" />
</f:facet>
<h:column>
<f:facet name="header">
<h:outputText value="Application Name" />
</f:facet>
<h:outputText value="#{TATTable.applicationName}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Application Class" />
</f:facet>
<h:outputText value="#{TATTable.applicationClass}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="TAT Average" />
</f:facet>
<h:outputText value="#{TATTable.tatAverage}" />
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="TAT Target" />
</f:facet>
<h:outputText value="#{TATTable.tatTarget}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Request Count" />
</f:facet>
<h:outputText value="#{TATTable.reqCount}"></h:outputText>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Request Type" />
</f:facet>
<h:outputText value="#{TATTable.reqType}"></h:outputText>
</h:column>
</h:dataTable>
</div>
<br>
<h:graphicImage styleClass="graphicImage" id="reportImage" alt="Sorry records not found !!"
value="#{LoginForm.imageLocation}" width="700" height="250" rendered="#{LoginForm.viewImage}">
</h:graphicImage><br>
<h3><h:outputText value="Sorry records not found !!" rendered="#{LoginForm.notFoundMsg}"/></h3>
</h:form>
</div>
</hx:scriptCollector></body>
</f:view>
</html>
My backing bean Login Form is as follows:
package sla.dashboard.form;
import sla.dashboard.Search.SearchManager;
import sla.dashboard.drop_down_components.*;
import sla.dashboard.datatables.*;
import java.util.*;
import javax.faces.context.FacesContext;
import javax.faces.event.*;
import javax.faces.model.*;
public class LoginForm implements ValueChangeListener,ActionListener
{
private String slaBU=null,slaPeriod1=null,slaPeriod2=null,slaGroup=null,
periodType=null,periodSelected=null,slaView=null,period=null,
imageResult=null,imageLocation=null;
private int slaPeriod,slaApp;
Boolean btDisplay,utDisplay,ttDisplay,viewImage,notFoundMsg;
//Table Lists
List <BillingTable> BT;
List <UptimeTable> UT;
List <TATTable> TT;
DropDownComponents ddC;
List<SelectItem> buList;
List<SelectItem> periodList;
List<SelectItem> periodList1;
List<SelectItem> periodList2;
List<SelectItem> groupList;
List<SelectItem> appList;
List<SelectItem> viewList;
ArrayList<String> result= new ArrayList<String>();
public LoginForm()
{
ddC=new DropDownComponents();
buList=ddC.getBuList();
this.reset();
BT=new ArrayList<BillingTable>();
UT=new ArrayList<UptimeTable>();
TT=new ArrayList<TATTable>();
System.out.println("\n Back Bean Object Instantiated");
}
public int getSlaApp() {
return slaApp;
}
public Boolean getBtDisplay() {
return btDisplay;
}
public void setBtDisplay(Boolean btDisplay) {
this.btDisplay = btDisplay;
}
public Boolean getUtDisplay() {
return utDisplay;
}
public void setUtDisplay(Boolean utDisplay) {
this.utDisplay = utDisplay;
}
public Boolean getTtDisplay() {
return ttDisplay;
}
public void setTtDisplay(Boolean ttDisplay) {
this.ttDisplay = ttDisplay;
}
public void setSlaApp(int slaApp) {
this.slaApp = slaApp;
}
public int getSlaPeriod() {
return slaPeriod;
}
public void setSlaPeriod(int slaPeriod) {
this.slaPeriod = slaPeriod;
}
public String getPeriod() {
return period;
}
public void setPeriod(String period)
{
this.period = period;
}
public List<SelectItem> getViewList() {
return viewList;
}
public void setViewList(List<SelectItem> viewList) {
this.viewList = viewList;
}
public List<SelectItem> getPeriodList() {
return periodList;
}
public void setPeriodList(List<SelectItem> periodList) {
this.periodList = periodList;
}
public List<SelectItem> getBuList()
{
return buList;
}
public String getPeriodType() {
System.out.println("Inside getPeriodType " + periodType);
return periodType;
}
public void setPeriodType(String periodType) {
System.out.println("Inside setPeriodType "+ periodType);
this.periodType = periodType;
}
public void setBuList(List<SelectItem> buList) {
this.buList = buList;
}
public String getSlaBU() {
return slaBU;
}
public void setSlaBU(String slaBU)
{
this.slaBU = slaBU;
}
public String getSlaPeriod1()
{
return slaPeriod1;
}
public void setSlaPeriod1(String slaPeriod1) {
this.slaPeriod1 = slaPeriod1;
}
public String getSlaPeriod2() {
return slaPeriod2;
}
public void setSlaPeriod2(String slaPeriod2) {
this.slaPeriod2 = slaPeriod2;
}
public String getPeriodSelected() {
return periodSelected;
}
public void setPeriodSelected(String periodSelected) {
this.periodSelected = periodSelected;
}
public List<SelectItem> getPeriodList1() {
return periodList1;
}
public void setPeriodList1(List<SelectItem> periodList1) {
this.periodList1 = periodList1;
}
public List<SelectItem> getPeriodList2() {
return periodList2;
}
public void setPeriodList2(List<SelectItem> periodList2) {
this.periodList2 = periodList2;
}
public String getSlaGroup() {
return slaGroup;
}
public void setSlaGroup(String slaGroup) {
this.slaGroup = slaGroup;
}
public List<SelectItem> getGroupList() {
return groupList;
}
public void setGroupList(List<SelectItem> groupList) {
this.groupList = groupList;
}
public List<SelectItem> getAppList() {
return appList;
}
public void setAppList(List<SelectItem> appList) {
this.appList = appList;
}
public String getSlaView() {
return slaView;
}
public void setSlaView(String slaView) {
this.slaView = slaView;
}
//ValueChangeListener
public void processValueChange(ValueChangeEvent arg0) throws AbortProcessingException
{}
public void processPeriodChange(ValueChangeEvent arg0) throws AbortProcessingException
{
this.setSlaPeriod(Integer.parseInt(arg0.getNewValue().toString()));
this.setPeriodList1(ddC.getPeriodList1(Integer.parseInt(arg0.getNewValue().toString())));
System.out.println("Period Changed Value : "+this.getSlaPeriod());
FacesContext.getCurrentInstance().renderResponse();
}
public void processBUChange(ValueChangeEvent arg0) throws AbortProcessingException
{
this.setSlaBU(arg0.getNewValue().toString());
this.setAppList(ddC.getAppList(Integer.parseInt(arg0.getNewValue().toString())));
System.out.println("\n BU Slected : " + this.getSlaBU());
FacesContext.getCurrentInstance().renderResponse();
}
public void processAction(ActionEvent arg0) throws AbortProcessingException
{}
public List<BillingTable> getBT() {
return BT;
}
public void setBT(List<BillingTable> bt) {
BT = bt;
}
public List<UptimeTable> getUT() {
return UT;
}
public void setUT(List<UptimeTable> ut) {
UT = ut;
}
public List<TATTable> getTT() {
return TT;
}
public void setTT(List<TATTable> tt) {
TT = tt;
}
public void setImageLocation(String imageLocation) {
this.imageLocation = imageLocation;
}
public String getImageLocation() {
return imageLocation;
}
String getLabel(String index,List<SelectItem> lst)
{
return(lst.get(Integer.parseInt(index)).getLabel());
}
public Boolean getViewImage() {
return viewImage;
}
public void setViewImage(Boolean viewImage) {
this.viewImage = viewImage;
}
public void setImageResult(String imageResult) {
this.imageResult = imageResult;
}
public String getImageResult() {
return imageResult;
}
public Boolean getNotFoundMsg() {
return notFoundMsg;
}
public void setNotFoundMsg(Boolean notFoundMsg) {
this.notFoundMsg = notFoundMsg;
}
public void reset()
{
slaPeriod=0;
slaApp=0;
slaBU="0";
slaPeriod1="0";
slaPeriod2="0";
slaGroup="0";
slaView="0";
periodList=ddC.getPeriodList();
periodList1=ddC.getPeriodList1(slaPeriod);
periodList2=ddC.getPeriodList2();
groupList=ddC.getSlaGroupList();
appList=ddC.getAppList(slaApp);
viewList=ddC.getViewList();
this.setViewImage(false);
this.setUtDisplay(false);
this.setTtDisplay(false);
this.setBtDisplay(false);
this.setNotFoundMsg(false);
}
public String processSubmit()
{
System.out.println("Inside Process Submit ");
System.out.println(this.getSlaBU()+this.getSlaApp()+this.getSlaPeriod()+this.getSlaPeriod1()+
this.getSlaPeriod2()+this.getSlaGroup()+this.getSlaView());
this.setViewImage(false);
this.setUtDisplay(false);
this.setTtDisplay(false);
this.setBtDisplay(false);
this.setNotFoundMsg(false);
/*slaPeriod=1;
slaApp=0;
slaBU="1";
slaPeriod1="1";
slaPeriod2="2";
slaGroup="2";
slaView="1";*/
if(this.slaGroup=="1" && slaView=="1")
{
BT=new SearchManager().searchBillingTable
(slaBU,periodList.get(slaPeriod).getLabel(),
this.getSlaPeriod1(),getLabel(slaPeriod2,
periodList2),getLabel(slaGroup,groupList));
if(BT.size()!=0)
this.setBtDisplay(true);
else
this.setNotFoundMsg(true);
}
else
{
if(this.slaGroup=="2" && slaView=="1")
{
UT=new SearchManager().searchUptimeTable
(slaBU,periodList.get(slaPeriod).getLabel(),
this.getSlaPeriod1(),getLabel(slaPeriod2,
periodList2),getLabel(slaGroup,groupList));
if(UT.size()!=0)
this.setUtDisplay(true);
else
this.setNotFoundMsg(true);
}
else
{
if(this.slaGroup=="3" && slaView=="1")
{
TT=new SearchManager().searchTATTable(slaBU,periodList.get(slaPeriod).getLabel(),
this.getSlaPeriod1(),getLabel(slaPeriod2,
periodList2),getLabel(slaGroup,groupList));
if(TT.size()!=0)
this.setTtDisplay(true);
else
this.setNotFoundMsg(true);
}
else
{
if(slaView=="2")
{
imageResult=new SearchManager().searchImage(slaBU,
periodList.get(slaPeriod).getLabel(), slaPeriod1,
slaPeriod2,getLabel(slaGroup,groupList),slaView);
this.setImageLocation(imageResult);
this.setViewImage(true);
}
else
{
this.setNotFoundMsg(true);
}
}
}
}
return("Success");
}
}
How to submit the form properly?
When a form is not being submitted, sometimes it may happen from a mistaken usage of JSF component.
I see that you are using
<h:selectOneMenu id="slaView" value="#{LoginForm.slaView}" required="true">
<f:selectItems value="#{LoginForm.viewList}" />
</h:selectOneMenu>
which comes from:
viewList=ddC.getViewList();
and the selected item goes into a String value.
can you please write the code of getViewList ?
If the items are declared of int,String - than the problem is that slaView should be of type int.
You're calling FacesContext.getCurrentInstance().renderResponse(); inside a valueChangeListener method whenever a dropdown value changes. This will cause the remaining phases of the JSF lifecycle being skipped until the render response phase. Since the valueChangeListener method is invoked during validations phase, the update model values and invoke action phases are skipped. And guess what, the submit button is to be invoked during invoke action phase, but this is been skipped!
Anyway, creating dynamic dependent dropdown menus wherein the data is fully to be retrieved from the server side without any help of advanced JavaScript and Ajax is a real pain. You've to take a lot of things into account with regard to skipping validation of other fields and retaining submitted values of other fields. So also in JSF. Long story short, here's an article which describes how to do it properly: Populate child menu's.

Categories

Resources