Nitobi
Customer Login
Services
Products
About
Blogs
Contact
Home -> Product Knowledgebase Order Online | Free Trial Downloads

Nitobi Product Knowledgebase

Saving Data (Struts 2)


When a save is invoked on the Grid on the client side, a request is made to the URL specified in the savehandler attribute.  That URL is responsible for parsing the XML we send in the request and performing the necessary inserts, updates and deletes to the persistent data. 

In a Struts 2 environment, the URL used as the savehandler will be a Struts Action.  Using the Nitobi Server Library, we can easily parse the XML request and perform the needed database action.

The Struts Action

We'll begin with the necessary imports and class definition:

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import com.nitobi.server.handler.SaveHandler;
import com.nitobi.server.tools.Record;

public class SaveHandlerAction extends ActionSupport
{
 public String execute() throws Exception
 {

Next, we'll set up the connection to the database.  This sample uses the sample data found in NitobiSamplesData.sql in the samples directory of your Complete UI installation.

  Class.forName("com.mysql.jdbc.Driver").newInstance();
  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/nitobi_testdb_v1?" +
               "user=nitobi");
  Statement st = conn.createStatement();

As stated above, we need to be able to parse the XML in the request to figure out what we need to persist to the database.  We can do this using the com.nitobi.server.handler.SaveHandler class

SaveHandler savehandler = new SaveHandler(ServletActionContext.getRequest());

SaveHandler has methods to get the records that need to be inserted (getInsertRecords()), updated (getUpdateRecords()), and deleted(getDeleteRecords()).  Let's start with the records to insert:

  Record[] insertRecords = savehandler.getInsertRecords();
  for (int i=0; i< insertRecords.length; i++) {
   String sql="INSERT INTO tblContacts3k (ContactName, ContactEmail, JobTitle, CompanyName, PhoneNumber, Address) VALUES (";

   sql+= "'" + insertRecords[i].getField("ContactName").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("ContactEmail").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("JobTitle").replaceAll("'","''")   + "',";
   sql+= "'" + insertRecords[i].getField("CompanyName").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("PhoneNumber").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("Address").replaceAll("'","''")   + "'";
   sql+= "); ";
   st.executeUpdate(sql);
  }

From SaveHandler#getInsertRecords, we get an array of com.nitobi.server.tools.Record objects.  The fields of the Record object correspond with the fields in the Grid on the client side.  Using the Record array, we construct the appropriate SQL statement.  Updates and deletes are processed similarly, as demonstrated below:

  Record[] updateRecords = savehandler.getUpdateRecords();
  for (int i=0; i< updateRecords.length; i++) {
   String sql = "UPDATE tblContacts3k ";  
   sql+= "SET ContactName  = '" + updateRecords[i].getField("ContactName").replaceAll("'","''")  + "', "; 
   sql+= "ContactEmail  = '" + updateRecords[i].getField("ContactEmail").replaceAll("'","''")  + "', ";    
   sql+= "JobTitle   = '" + updateRecords[i].getField("JobTitle").replaceAll("'","''")   + "', ";     
   sql+= "CompanyName   = '" + updateRecords[i].getField("CompanyName").replaceAll("'","''")  + "', ";        
   sql+= "PhoneNumber   = '" + updateRecords[i].getField("PhoneNumber").replaceAll("'","''")  + "', ";
   sql+= "Address    = '" + updateRecords[i].getField("Address").replaceAll("'","''")   + "', ";   
   sql += "Country = '" + updateRecords[i].getField("Country").replaceAll("'", "''") + "' ";
   sql+=" WHERE ContactID = " + updateRecords[i].getID();
   st.executeUpdate(sql);
  }
  Record[] deleteRecords = savehandler.getDeleteRecords();
  for (int i=0; i< deleteRecords.length; i++) {
   String sql = "DELETE FROM tblContacts3k WHERE ContactID = " + deleteRecords[i].getID();
   st.executeUpdate(sql);
  }

The last thing we need to do is call SaveHandler#writeToClient:

  st.close();
  conn.close(); 
  savehandler.writeToClient(ServletActionContext.getResponse());
  return null;

N.B.  Because we write to the HttpServletResponse directly, we don't need to forward to a Result for rendering, so we simply return null.

Full Source

package examples.grid.struts2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import com.nitobi.server.handler.SaveHandler;
import com.nitobi.server.tools.Record;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

public class SaveHandlerAction extends ActionSupport
{
 public String execute() throws Exception
 {
  SaveHandler savehandler = new SaveHandler(ServletActionContext.getRequest());
  Class.forName("com.mysql.jdbc.Driver").newInstance();
  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/nitobi_testdb_v1?" +
               "user=nitobi");
  Statement st = conn.createStatement();
  Record[] insertRecords = savehandler.getInsertRecords();
  for (int i=0; i< insertRecords.length; i++) {
   String sql="INSERT INTO tblContacts3k (ContactName, ContactEmail, JobTitle, CompanyName, PhoneNumber, Address) VALUES (";
   sql+= "'" + insertRecords[i].getField("ContactName").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("ContactEmail").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("JobTitle").replaceAll("'","''")   + "',";
   sql+= "'" + insertRecords[i].getField("CompanyName").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("PhoneNumber").replaceAll("'","''")  + "',";
   sql+= "'" + insertRecords[i].getField("Address").replaceAll("'","''")   + "'";
   sql+= "); ";
   st.executeUpdate(sql);
  }
  Record[] updateRecords = savehandler.getUpdateRecords();
  for (int i=0; i< updateRecords.length; i++) {
   String sql = "UPDATE tblContacts3k ";  
   sql+= "SET ContactName  = '" + updateRecords[i].getField("ContactName").replaceAll("'","''")  + "', "; 
   sql+= "ContactEmail  = '" + updateRecords[i].getField("ContactEmail").replaceAll("'","''")  + "', ";    
   sql+= "JobTitle   = '" + updateRecords[i].getField("JobTitle").replaceAll("'","''")   + "', ";     
   sql+= "CompanyName   = '" + updateRecords[i].getField("CompanyName").replaceAll("'","''")  + "', ";        
   sql+= "PhoneNumber   = '" + updateRecords[i].getField("PhoneNumber").replaceAll("'","''")  + "', ";
   sql+= "Address    = '" + updateRecords[i].getField("Address").replaceAll("'","''")   + "', ";   
   sql += "Country = '" + updateRecords[i].getField("Country").replaceAll("'", "''") + "' ";
   sql+=" WHERE ContactID = " + updateRecords[i].getID();
   st.executeUpdate(sql);
  }
  Record[] deleteRecords = savehandler.getDeleteRecords();
  for (int i=0; i< deleteRecords.length; i++) {
   String sql = "DELETE FROM tblContacts3k WHERE ContactID = " + deleteRecords[i].getID();
   st.executeUpdate(sql);
  }
  st.close();
  conn.close(); 
  savehandler.writeToClient(ServletActionContext.getResponse());
  return null;
 }
}

View Printable Version

Comments:


Name:

Type the text you see above:

Comments:


Knowledgebase

To be notified of new articles when they're available, subscribe to our RSS feed.

Support Resources

Take advantage of our knowledgebase of product tutorials and tips, and our support forums!

Search Site


Sign up for our Newsletter:

Get industry articles and Nitobi company news in your inbox every couple of months — here's a sample!

Email:




Site RSS Feed  | All contents are (c) Copyright 2006, Nitobi Software Inc. All rights Reserved