ObjectListDataProvider Tutorial

This is a tutorial for using the ObjectListDataProvider in a Visual Web Project. A ObjectListDataProvider is useful if the underlaying data is from a datasource not supported by NetBeans. Some samples for such datasources are a JPA or hibernate connection, other legacy systems such SAP or Lotus Notes and files in various formats.

In this tutorial we use a text file with customer records as datasource for our application.

Creating the project

In the first step you create a normal VWP project named OldpSample:

Project settings OLDP

Address POJO

For data storage we use a simple POJO object. Right click the oldpsample package under «Source Packages» and select «New -> Java Class». Name the class Address.

Create Address class

  1. package oldpsample;
  2.  
  3. public class Address {
  4.  
  5. private String id;
  6. private String title;
  7. private String lastname;
  8. private String firstname;
  9. private String street;
  10. private String city;
  11. private String state;
  12. private String country;
  13.  
  14. /** Creates a new instance of Address */
  15. public Address() {
  16. }
  17.  
  18. public String getId() {
  19. return id;
  20. }
  21.  
  22. public void setId(String id) {
  23. this.id = id;
  24. }
  25.  
  26. public String getTitle() {
  27. return title;
  28. }
  29.  
  30. public void setTitle(String title) {
  31. this.title = title;
  32. }
  33.  
  34. public String getLastname() {
  35. return lastname;
  36. }
  37.  
  38. public void setLastname(String lastname) {
  39. this.lastname = lastname;
  40. }
  41.  
  42. public String getFirstname() {
  43. return firstname;
  44. }
  45.  
  46. public void setFirstname(String firstname) {
  47. this.firstname = firstname;
  48. }
  49.  
  50. public String getStreet() {
  51. return street;
  52. }
  53.  
  54. public void setStreet(String street) {
  55. this.street = street;
  56. }
  57.  
  58. public String getCity() {
  59. return city;
  60. }
  61.  
  62. public void setCity(String city) {
  63. this.city = city;
  64. }
  65.  
  66. public String getState() {
  67. return state;
  68. }
  69.  
  70. public void setState(String state) {
  71. this.state = state;
  72. }
  73.  
  74. public String getCountry() {
  75. return country;
  76. }
  77.  
  78. public void setCountry(String country) {
  79. this.country = country;
  80. }
  81.  
  82. }

Create AddressDataProvider

Now we create the class AddressDataProvider. We create a new class and derive it from ObjectListDataProvider. Right click the oldpsample package under «Source Packages» and select «New -> Java Class».

Create AdressDataProvider class

Our class stores all data in a ArrayList, so we need a member variable of type ArrayList. In the constructor we must tell the underlying ObjectListDataProvider where the data comes from (method setList) and of which type the data is (method setObjectType). We also need methods to load the data from file or stream.

  1. package oldpsample;
  2.  
  3. import com.sun.data.provider.impl.ObjectListDataProvider;
  4. import java.io.BufferedReader;
  5. import java.io.FileInputStream;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.util.ArrayList;
  9.  
  10. public class AddressDataProvider extends ObjectListDataProvider {
  11.  
  12. private ArrayList addressList = new ArrayList();
  13.  
  14. /** Creates a new instance of AddressDataProvider */
  15. public AddressDataProvider() {
  16. setList( addressList );
  17. setObjectType( Address.class );
  18. }
  19.  
  20. public void load(InputStream istream ) {
  21. try {
  22. InputStreamReader sr = new InputStreamReader( istream );
  23.  
  24. while ( br.ready() ) {
  25. String line = br.readLine();
  26. String[] cols = line.split( ";" );
  27.  
  28. if ( cols.length == 8 ) {
  29. Address address = new Address();
  30. address.setId( cols[0] );
  31. address.setTitle( cols[1] );
  32. address.setLastname( cols[2] );
  33. address.setFirstname( cols[3] );
  34. address.setStreet( cols[4] );
  35. address.setCity( cols[5] );
  36. address.setState( cols[6] );
  37. address.setCountry( cols[7] );
  38. getList().add( address );
  39. }
  40. }
  41.  
  42. } catch ( Exception e ) {
  43. e.printStackTrace();
  44. }
  45. }
  46.  
  47. public void load(String filename) {
  48. try {
  49. FileInputStream fs = new FileInputStream( filename );
  50. load( fs );
  51. } catch ( Exception e ) {
  52. e.printStackTrace();
  53. }
  54. }
  55.  
  56. }

Add AddressDataProvider to SessionBean1

In the outline view right click on SessionBean1 and select «Add->Property» from the context menu. Name the property «addressDataProvider» and enter «AddressDataProvider» as Type. Leave all other options on the default values.

New Property addressDataProvider

Double click SessionBean1 in the outline view. Find the line

  1. private AddressDataProvider addressDataProvider;

and change it to

  1. private AddressDataProvider addressDataProvider = new AddressDataProvider();

You must build, close and reopen your VWP project now (as of NetBeans 5.5.1). If not, NetBeans doesn't detect our ObjectListDataProvider. This should hopefully not been necessary in future NetBeans releases.

Design Web Page

The project wizard has generated a default web page Page1.jsp. Open this page and the visual designer starts.

Select a table component from the palette and drop it onto your page. Right click the table component and select «Bind to Data...». Select «addressDataProvider (SessionBean1)» from the dropdown list. Reorder the fields with the «Up» and «Down» buttons, so it look like this:

Select Data Provider

Press «OK» and our page has a table component bound to the AddressDataProvider.

To show some data in the table component we let the user upload a CSV file. Drop a File Upload and a Button component from the palette onto the page. Set the text property of the button to «Upload file». Your page should look like this:

Page Design

Double click on the «Upload file» button and enter the following code into the event handler:

  1. public String button1_action() {
  2. if ( fileUpload1.getUploadedFile().getSize() > 0 ) {
  3. try {
  4. getSessionBean1().getAddressDataProvider().load(
  5. getFileUpload1().getUploadedFile().getInputStream() );
  6. } catch ( Exception e ) {
  7. e.printStackTrace();
  8. }
  9. }
  10. return null;
  11. }

Run your project. Use this sample CSV data file to test the application:

1;Mr.;Able;Tony;216 King St;San Francisco;CA;USA
2;Mr.;Black;Tom;655 Divisadero St;San Francisco;CA;USA
3;Mr.;Kent;Richard;509 Valencia St;San Francisco;CA;USA
4;Mr.;Chen;Larry;407 Ellis St;San Francisco;CA;USA
5;Mrs.;Donaldson;Sue;314 Columbus Ave;San Francisco;CA;USA
6;Mr.;Murrell;Tony;4124 Geary Blvd;San Francisco;CA;USA

This sample project can also be downloaded.

3 Comments

  1. Robert Manigk:

    Sehr geehrter Herr Gascoyne,

    ich habe versucht das Beispiel aus Ihrem Tutorial auf ein anderes Projekt zu übertragen. Die Datenquelle ist hierbei eine JPA-Verbindung, die Hibernate als Persistence Manager. Das Problem ist nun, dass die Daten zwar nach dem Betätigen des “submit-Buttons” in den “ObjectListDataProvider” geladen werden, was ich durch eine simple Konsolenausgabe sehen konnte, aber nicht in der Tabelle erscheinen.
    Vielleicht wären Sie so freundlich, mir einen kleinen Hinweis zu geben?

    Mit freundlichem Gruß,
    Robert Manigk
    —————– Code ObjectListDataProvider ———————————-
    package de.mas.web;

    import com.sun.data.provider.impl.ObjectListDataProvider;
    import de.mas.user.core.Language;
    import de.mas.user.core.UserManager;
    import java.util.ArrayList;

    /**
    *
    * @author rmanigk
    */
    public class LanguageDataProvider extends ObjectListDataProvider {

    private ArrayList languages = new ArrayList();

    /**
    * Creates a new instance of LanguageDataProvider.
    */
    public LanguageDataProvider() {
    setList(languages);
    setObjectType(Language.class);
    }

    public void load() {
    this.languages = UserManager.getInstance().getAllLanguages();
    for(Language l : languages){
    System.out.println(l.getId());
    System.out.println(l.getLanguage());
    System.out.println(l.getShortcut());
    }
    }
    }

  2. Robert Manigk:

    Dear Mr. Gascoyne,

    I’ve found my misstake by myself and it’s a little embarrassing for me that I’ve abused your blog. I’m sorry for using german language in the previous post. The mistake is the use of this.languages instead of getList().addAll(…); in the load()-method.
    Thank you very much for this tutorial.

    with best regards,
    Robert Manigk

  3. Alexei Larramendi:

    I understood very well your code. It is very nice, clean and very useful but I have a question regarding the code when I’m building the table dynamically instead. So I do not have any jsp file to bind the AddressDataProvider to the table. I create my table dynamically and the dataprovider to i.e I create those objects on a .java file. My question is how I can bind the dataprovider and the Table or TableRowGroup together using valueExpression I supose. Can you please help me out for that question. I appreciate your help. Thanks in advance.

    Sincerely
    Alexei Larramendi

Leave a comment