webtier@glassfish.java.net

Re: (JSF) Setting converter ... in the backing PageBean: [WARNING - long]

From: <webtier_at_javadesktop.org>
Date: Wed, 07 Jan 2009 15:09:27 PST

I'm unfamiliar with the Woodstock components, but you may get some ideas from BalusC at http://balusc.blogspot.com/2006/06/using-datatables.html#PopulateDatatable. This uses straight JSF Core/HTML components, but I figure you'd be able to adapt to Visual Web JSF in NetBeans.

To be honest, if I had to create a component tree in the backing bean (I never have, and probably never will) I think I'd create it from scratch.

I've included modified code at the end of this post, which works - I have a 4 row table, and I get 4 calls to getAsString() or getAsObject() when expected. This code is an adaptation of the code presented in the link above (*), but in fact it's fairly standard stuff.

HTH, Arved

* BalusC has a fine website for JSF stuff. He just asks that his site be mentioned if code is used and adapted from there.

********** Relevant piece from web page **********

<h:form id="welcomeForm">
  <h:dataTable binding="#{welcome.dataTable}"/>
  <h:commandButton id="saveTableBtn" value="Save" action="#{welcome.doSave}" />
</h:form>

********** backing bean (modify to JSF 1.x as required) **********

package org.ahs.main;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.el.ValueExpression;
import javax.faces.component.html.HtmlColumn;
import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlOutputText;
import javax.faces.context.FacesContext;
import javax.faces.model.ManagedBean;
import javax.faces.model.RequestScoped;
import org.ahs.jsf.MyDateTimeConverter;

@ManagedBean(name="welcome")
@RequestScoped
public class Welcome {

    private List<DataType> data;
    private HtmlDataTable dataTable;

    public List<DataType> getData() {
        if (data == null) {
            populateData();
        }
        return data;
    }

    public void setData(List<DataType> data) {
        this.data = data;
    }

    public String doSave() {
        return null;
    }

    public HtmlDataTable getDataTable() {
        if (dataTable == null) {
            createTable();
        }
        return dataTable;
    }

    public void setDataTable(HtmlDataTable dataTable) {
        this.dataTable = dataTable;
    }

    private void createTable() {
        // Create <h:dataTable value="#{welcome.data}" var="dataItem">.
        dataTable = new HtmlDataTable();
        dataTable.setValueExpression("value",
            createValueExpression("#{welcome.data}", List.class));
        dataTable.setVar("dataItem");

        // Create <h:column> for 'ID' column.
        HtmlColumn idColumn = new HtmlColumn();
        dataTable.getChildren().add(idColumn);

        // Create <h:outputText value="ID"> for <f:facet name="header"> of 'ID' column.
        HtmlOutputText idHeader = new HtmlOutputText();
        idHeader.setValue("ID");
        idColumn.setHeader(idHeader);

        // Create <h:inputText value="#{dataItem.id}"> for the body of 'ID' column.
        HtmlInputText idInput = new HtmlInputText();
        idInput.setValueExpression("value",
            createValueExpression("#{dataItem.id}", Long.class));
        idColumn.getChildren().add(idInput);

        // Create <h:column> for 'Name' column.
        HtmlColumn nameColumn = new HtmlColumn();
        dataTable.getChildren().add(nameColumn);

        // Create <h:outputText value="Name"> for <f:facet name="header"> of 'Name' column.
        HtmlOutputText nameHeader = new HtmlOutputText();
        nameHeader.setValue("Name");
        nameColumn.setHeader(nameHeader);

        // Create <h:inputText value="#{dataItem.name}"> for the body of 'Name' column.
        HtmlInputText nameInput = new HtmlInputText();
        nameInput.setValueExpression("value",
            createValueExpression("#{dataItem.name}", String.class));
        nameColumn.getChildren().add(nameInput);

        // Create <h:column> for 'Entry Date' column.
        HtmlColumn entryDateColumn = new HtmlColumn();
        dataTable.getChildren().add(entryDateColumn);

        // Create <h:outputText value="Entry Date"> for <f:facet name="header"> of 'Entry Date' column.
        HtmlOutputText entryDateHeader = new HtmlOutputText();
        entryDateHeader.setValue("Entry Date");
        entryDateColumn.setHeader(entryDateHeader);

        // Create <h:inputText value="#{dataItem.entryDate}"> for the body of 'Entry Date' column.
        HtmlInputText entryDateInput = new HtmlInputText();
        entryDateInput.setValueExpression("value",
            createValueExpression("#{dataItem.entryDate}", Date.class));

        // add f:converter
        MyDateTimeConverter mdtc = new MyDateTimeConverter();
        entryDateInput.setConverter(mdtc);

        entryDateColumn.getChildren().add(entryDateInput);

    }

    private ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        return facesContext.getApplication().getExpressionFactory().createValueExpression(
            facesContext.getELContext(), valueExpression, valueType);
    }

    private void populateData() {
        data = new ArrayList<DataType>();
        data.add(this.new DataType(1L, "horse"));
        data.add(this.new DataType(2L, "cow", "20071214"));
        data.add(this.new DataType(7L, "sheep"));
        data.add(this.new DataType(13L, "pig"));
    }

    /************************************************/
    public class DataType {
        private Long id;
        private String name;
        private Date entryDate;

        public DataType(Long id, String name) {
            this.id = id;
            this.name = name;
            this.entryDate = Calendar.getInstance().getTime();
        }

        public DataType(Long id, String name, String dateStr) {
            this.id = id;
            this.name = name;
            try {
                this.entryDate = new SimpleDateFormat("yyyyMMdd").parse(dateStr);
            } catch (ParseException parseException) {
            }
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Date getEntryDate() {
            return entryDate;
        }

        public void setEntryDate(Date entryDate) {
            this.entryDate = entryDate;
        }
    }
}

********** The converter (which basically is a rudimentary f:convertDateTime) **********

package org.ahs.jsf;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

public class MyDateTimeConverter implements Converter {

    public Object getAsObject(FacesContext arg0, UIComponent arg1, String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

        Date result = null;
        try {
            result = sdf.parse(dateStr);
        } catch (ParseException ex) {
            Logger.getLogger(MyDateTimeConverter.class.getName()).log(Level.SEVERE, null, ex);
            FacesMessage message = new FacesMessage();
            message.setDetail("Date not valid: format 'yyyyMMdd' expected");
            message.setSummary("Date not valid: format 'yyyyMMdd' expected");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ConverterException(message);
        }
        return result;
    }

    public String getAsString(FacesContext arg0, UIComponent arg1, Object value) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

        Date date = (Date)value;
        String result = null;

        result = sdf.format(date);

        return result;
    }

}
[Message sent by forum member 'arveds' (arveds)]

http://forums.java.net/jive/thread.jspa?messageID=324650