Using same page for Update and Create operation of an entity
gurjarniraj Jul 22, 2011 1:25 AMI have one staff table with usual fields - staffid, username, password, firstname, lastname. Now, i have a Create staff JSP page. Also, i want to use same page to update the staff record selected from Search Staff screen. Following is the page content
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib uri="http://richfaces.org/rich" prefix="rich"%> <%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%> <rich:tabPanel switchType="client" width="670" height="600"> <rich:tab label="#{empty staff.staffid ? 'Craete' : 'Update'} Staff"> <rich:layout> <rich:layoutPanel position="top" width="100%"> </rich:layoutPanel> <rich:layoutPanel position="left" width="20%"> </rich:layoutPanel> <rich:layoutPanel position="center" width="80%"> <rich:panel> <f:facet name="header"> <h:outputText value="Staff Details (* are mandatory fields)" /> </f:facet> <h:panelGrid columns="4"> <h:outputText value="Staff Id" rendered="#{! empty staff.staffid}"/> <h:inputText id="StaffId" value="#{staff.staffid}" rendered="#{! empty staff.staffid}" disabled="true"/> <h:outputText value="* Username" /> <h:inputText id="Username" value="#{staff.username}" required="true" maxlength="30"/> <h:outputText value="* Password" /> <h:inputSecret id="Password" value="#{staff.password}" required="true" maxlength="30" redisplay="true"/> </h:panelGrid> <rich:message for="Username" ></rich:message> <rich:message for="Password" ></rich:message> </rich:panel> <rich:panel> <f:facet name="header"> <h:outputText value="Personal Details (* are mandatory fields)" /> </f:facet> <h:panelGrid columns="4"> <h:outputText value="* First Name" /> <h:inputText id="FirstName" value="#{staff.firstName}" required="true"/> <h:outputText value="* Last Name" /> <h:inputText id="LastName" value="#{staff.lastName}" required="true"/> </h:panelGrid> <rich:message for="FirstName" ></rich:message> <rich:message for="LastName" ></rich:message> </rich:panel> </rich:layoutPanel> <rich:layoutPanel position="bottom"> <h:panelGrid columns="2"> <a4j:commandButton value="Submit" action="#{staff.createOrUpdate}" reRender="pagecontent"> </a4j:commandButton> <a4j:commandButton value="Cancel"> </a4j:commandButton> </h:panelGrid> </rich:layoutPanel> </rich:layout> </rich:tab> </rich:tabPanel>
following is the Staff backing bean
package app.onlinetest.staff; import java.io.Serializable; import java.util.Date; import java.util.List; import org.hibernate.Session; import app.onlinetest.HibernateUtil; import app.onlinetest.MessageHandler; public class Staff implements Serializable{ private String staffid; private String firstname; private String lastname; private String username; private String password; private Date dateofcreation = new Date(); public String getStaffid() { return staffid; } public void setStaffid(String staffid) { this.staffid = staffid; } public String getFirstName() { return firstname; } public void setFirstName(String firstname) { this.firstname = firstname; } public String getLastName() { return lastname; } public void setLastName(String lastname) { this.lastname = lastname; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getDateofcreation() { return dateofcreation; } public void setDateofcreation(Date dateofcreation) { this.dateofcreation = dateofcreation; } private String generateStaffId(){ String newStaffId = null; String query = "select max(stf.id) from Staff stf"; Session session = HibernateUtil.getSessionFactory().getCurrentSession(); List list = session.createQuery(query.toString()).list(); if(!list.isEmpty()){ String maxStaffId = (String)list.get(0); int i = 3; while (maxStaffId.charAt(i) == '0'){ i++; } int maxNumber = Integer.parseInt(maxStaffId.substring(i)); StringBuffer tmpNewStaffId = new StringBuffer("STF"); for(i=3; i < (10-String.valueOf(maxNumber+1).length()); i++){ tmpNewStaffId.append("0"); } tmpNewStaffId.append(maxNumber+1); newStaffId = tmpNewStaffId.toString(); } else newStaffId = "STF0000001"; return newStaffId; } public void createOrUpdate(){ Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); if(staffid == null || "".equals(staffid)){ this.staffid = generateStaffId(); session.save(this); MessageHandler.getInstance().setMessageBoard(MessageHandler.STAFF_CREATE_SUCCESS); }else{ session.update(this); MessageHandler.getInstance().setMessageBoard(MessageHandler.STAFF_UPDATE_SUCCESS); } session.getTransaction().commit(); return ; } @Override public String toString() { return "Staff [staffid=" + staffid + ", firstname=" + firstname + ", username=" + username + ", password=" + password + ", dateofcreation=" + dateofcreation + "]"; } }
<managed-bean> <managed-bean-name>staff</managed-bean-name> <managed-bean-class>app.onlinetest.staff.Staff</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
Now, to use the same Create staff screen to update the staff, when the user selects a staff from search screen and clicks on 'Updat' button, i set selected Staff record into the request scope using FacesContext valule binding and forward to Create Staff page. Therefore, when on update screen i see all the fields are populated. After changin fields when user clicks 'Submit' on Create Staff page 'createOrUpdate' action method is called in which i check if staffid is not null (i.e. update case) then update the record else create the record.
The problem here i am facing is that i always get 'staffid' as null whether it is update or create operation. in case of 'update' operation i get all the fields set (i.e username, password, firstname, lastname) but not staffid
what could be the reason?