Null Session Action and Outjected variables
earnest.dyke Oct 23, 2008 4:16 PMOk, I have been trying to find out why the tsYear property and the outjected value are both null when the page is rendered.
Here is the xhtml:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:s="http://jboss.com/products/seam/taglib" 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:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich" template="layout/template.xhtml"> <ui:define name="body"> <h:form> <table> <tr> <td class="detailLabel"><h:outputText value="Select year" /></td> <td class="detailData"><h:selectOneListbox id="tsYears" value="#{TimesheetAction.tsYear}" size="1"> <a4j:support event="onchange" action="#{TimesheetAction.loadTimesheetsForYear()}" /> <f:selectItem itemValue="" itemLabel="-- Select Year" /> <f:selectItems value="#{timesheetYears}" /> </h:selectOneListbox></td> </tr> <s:fragment rendered="#{tsYear!= null}"> <tr> <td class="detailLabel"><h:outputText value="Select timesheet" /></td> <td class="detailData"><h:selectOneListbox id="tsList" value="#{TimesheetAction.ts}" size="3" converter="#{TimesheetConverter}"> <a4j:support event="onchange" action="#{TimesheetAction.loadEmployeeTimesheetView()}" /> <f:selectItem itemValue="" itemLabel="-- Select Timesheet" /> <f:selectItems value="#{timesheets}" /> </h:selectOneListbox></td> </tr> </s:fragment> </table> <s:fragment rendered="#{TimesheetAction.viewable}" id="ts"> <table border="1" class="dr-table rich-table"> <thead class="dr-table-thead"> <tr> <th colspan="#{timesheetView.days}">Hello</th> </tr> <tr class="dr-table-header rich-table-header"> <ui:repeat value="#{timesheetView.dates}" var="d"> <th class="dr-table-headercell rich-table-headercell"><h:outputText value="#{d}" /></th> </ui:repeat> </tr> </thead> </table> </s:fragment> </h:form> <h:outputText value="#{TimesheetAction.viewable}" /> <rich:spacer width="50" /> <h:outputText value="Year? #{tsYear}" /> </ui:define> </ui:composition>
And the action:
package org.ebsinc.admin.action; import static org.jboss.seam.ScopeType.SESSION; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import javax.faces.model.SelectItem; import org.ebsinc.admin.entity.Employee; import org.ebsinc.admin.entity.EmployeeTimesheet; import org.ebsinc.admin.entity.Timesheet; import org.ebsinc.admin.entity.TimesheetView; import org.ebsinc.admin.session.TimesheetManager; import org.jboss.seam.annotations.Factory; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Out; import org.jboss.seam.annotations.Scope; @Name("TimesheetAction") @Scope(SESSION) public class TimesheetAction implements Serializable{ private static final long serialVersionUID = 1l; @In(value = "TimesheetManager", create = true) TimesheetManager tsMgr; @In FacesContext facesContext; @Out(required=false,scope=SESSION) private Integer tsYear; @Out(required=false) private Timesheet ts; private TimesheetView timesheetView; private EmployeeTimesheet employeeTimesheet; @In Employee currentEmployee; private Boolean viewable; public TimesheetAction() { if (1==1) { } } public void loadTimesheetView() { if (employeeTimesheet == null) { employeeTimesheet = tsMgr.getTimesheet(currentEmployee, ts); } timesheetView = tsMgr.getTimesheetView(employeeTimesheet); } public String loadEmployeeTimesheetView() { loadTimesheetView(); return null; } public EmployeeTimesheet getEmployeeTimesheet() { return employeeTimesheet; } public void setEmployeeTimesheet(EmployeeTimesheet employeeTimesheet) { this.employeeTimesheet = employeeTimesheet; loadTimesheetView(); } @In(required = false, scope = SESSION) @Out(scope = SESSION) private List<SelectItem> timesheetYears; @Factory("timesheetYears") public void getTimesheetYears() { List<SelectItem> l = new ArrayList<SelectItem>(10); List<Integer> yrs = tsMgr.getTimeSheetYears(); for (Integer y : yrs) { SelectItem si = new SelectItem(y.intValue(), y.toString()); l.add(si); } timesheetYears = l; } @In(required = false, scope = SESSION) @Out(required = false, scope = SESSION) private List<SelectItem> timesheets; public String loadTimesheetsForYear() { List<SelectItem> l = new ArrayList<SelectItem>(26); if (tsYear == null) { timesheets = l; return null; } List<Timesheet> timesheetsList = tsMgr.getTimesheets(tsYear); for (Timesheet ts : timesheetsList) { SelectItem si = new SelectItem(ts, getTimesheetDateRange(ts)); l.add(si); } timesheets = l; return null; } private String getTimesheetDateRange(Timesheet ts) { StringBuffer sb = new StringBuffer(); SimpleDateFormat sdf = new SimpleDateFormat("d MMM"); sb.append(sdf.format(ts.getStartDate())); sb.append(" - "); sdf = new SimpleDateFormat("d MMM yyyy"); sb.append(sdf.format(ts.getEndDate())); return sb.toString(); } public Integer getTsYear() { return tsYear; } public void setTsYear(Integer tsYear) { this.tsYear = tsYear; } public Timesheet getTs() { return ts; } public void setTs(Timesheet ts) { this.ts = ts; if (ts != null) { viewable = true; } } public Boolean getViewable() { return viewable; } public void setViewable(Boolean viewable) { this.viewable = viewable; } }
I have stepped through the code and tsYear has a value in the action and seam.debug shows a value for tsYear in the session scope but it does not display on the page and the areas that are conditionally rendered based on it are not displayed.
I have spent a day trying to figure this out and I am hoping another set of eyes will quickly see what I have overlooked.
Thanks in advance for any and all help!
Earnie!