How to export a database table to a specified file format. This technique uses a servlet business object and a data source object.
You can run this technique code from:
NOTE First make sure that database is running on your localhost SilverStream server | |
|
The export data feature of the DataXpress sample application implements the following objects:
Contains an AgaData called AgaSource, which is bound to a data source object called dsoEditTableData | ||
Instantiates JDBCDataSource, which implements the AgiDataSource object for the DataXpress application | ||
Accesses the data source and populates the AgaData with the rows to be exported This object instantiates several utility objects in the JDBC package; for more information, see Developing a DSO for use by Multiple Clients |
When the user chooses the Submit button, the page gets the data the user entered on the form and stores it in a has table. Then it invokes the servlet URL using the showPage() method, passing the hashtable to the servlet:
private void handle_btnSubmit_pageActionPerformed(ActionEvent evt) throws Exception { // Reset the output box lblResults.setText(""); StringBuffer sbResults =new StringBuffer(); Hashtable htParms = new Hashtable(); try { // Get the db and table indexes String sTableName = chSourceTable.getItem( chSourceTable.getSelectedIndex()); String sDBName = chSourceDB.getItem( chSourceDB.getSelectedIndex()); if (sTableName==null) { sbResults.append("You must specify a table to export from"); return; } // Add items needed by the servlet to the hashtable htParms.put("srcdbname",sDBName); htParms.put("srctablename",sTableName); htParms.put("headers",chHeaders.getValue()); sbResults.append("<p>Table:"); sbResults.append(sTableName); htParms.put("type",chExportType.getValue()); // Call the servlet, passing the hashtable showPage("../../saveas/"+sTableName,null,null,htParms); } catch (Exception e) { sbResults.append(" Error - " + e.toString()); } finally { // Display the table name on the page lblResults.setText(sbResults.toString()); } }
The servlet gets the hashtable parameters and invokes the data source object dsoEditTableData, passing the database and table values. Then it sets the ServletResponse content type according to the file type selected by the user. Finally, it sets the servlet output by calling the local method saveAs():
public void service(javax.servlet.ServletRequest req, javax.servlet.ServletResponse res) throws javax.servlet.ServletException, java.io.IOException { try { AgoHttpRequestEvent hRequest = (AgoHttpRequestEvent) req; HttpServletResponse hResponse = (HttpServletResponse) res; // Get the values passed in; need to cast them String sdbname = (String) ((AgoHttpRequestEvent)req). getParameterAsObject("srcdbname"); String sTableName = (String) ((AgoHttpRequestEvent)req). getParameterAsObject("srctablename"); String sType = (String) ((AgoHttpRequestEvent)req). getParameterAsObject("type"); Boolean bHeaders = new Boolean((String) ((AgoHttpRequestEvent)req). getParameterAsObject("headers")); // Get the AgaData AgaData agaSource = hRequest.getAgaData("agaSource"); if (agaSource==null) System.out.println("agaSource is null"); Hashtable htParms = new Hashtable(); // Put db and table values in new hashtable htParms.put ("DBNAME", sdbname); htParms.put ("TABLENAME", sTableName); // Invoke the dso, passing the hashtable Vector vReturn = (Vector) agaSource.invokeQuery (htParms); // Set the appropriate http content type if (sType.equals("HTML")) { hResponse.setContentType("text/html; charset=iso-8859-1"); } else if (sType.equals("CSV")) { hResponse.setContentType("application/octet-stream"); hResponse.setHeader("Content-Disposition", "attachment; filename=\""+ sTableName +".csv\""); } else if (sType.equals("TAB")) { hResponse.setContentType("application/octet-stream"); hResponse.setHeader("Content-Disposition", "attachment; filename=\""+ sTableName +".tab\""); } else if (sType.equals("EXCEL")) { hResponse.setContentType("application/vnd.ms-excel"); } hResponse.setStatus(hResponse.SC_OK); // Set the servlet response ... ServletOutputStream stream = hResponse.getOutputStream(); // Pass parameters to local method to generate the response // Pass AgSource as an AgiRowCursor object saveAs(stream,sType,bHeaders.booleanValue(),(AgiRowCursor) agaSource); } catch (Exception e) { System.out.println("service -- " + e); } }
The saveAs() method reads the file type parameter and calls the appropriate method to generate the file. Then it stores the results of the generate method in a String variable, writes the String to the ServletOutputStream, and returns it to the caller:
public int saveAs(ServletOutputStream fos, String sfileType, boolean headers, AgiRowCursor m_rowcursor) { try { int rc = 0; String fileData = null; // Call one of the generate methods if (sfileType.equals("CSV")) fileData =generateCSV(headers,m_rowcursor); else if (sfileType.equals("TAB")) fileData = generateTAB(headers,m_rowcursor); else if (sfileType.equals("EXCEL")) fileData = generateTAB(headers,m_rowcursor); else if (sfileType.equals("HTML")) fileData = generateHTML(headers,m_rowcursor); if (fileData == null) rc = -1; // Write the results to the output stream fos.write (fileData.getBytes()); return rc; } catch (Exception _e) { System.out.println ("save as" + _e); return -1; } }
The saveAs()
method in the invoked evt calls the method to generate the file. This section describes the generation method for the HTML option.
First the generateHTML() method generates the format for an HTML table, then it creates a StringBuffer to store the row data.
Then, in the second half of the try block, the code loops through the AgiRowCursor object, filling each row of the html table with the row data. Each row is appended to the StringBuffer as a new HTML table row. After the try block, the StringBuffer with all of the rows is returned to the calling method.
public String generateHTML(boolean headers, AgiRowCursor m_agiRowCursor) { // Set up html formatting ... String hdrTD = "<TD VALIGN=TOP BGCOLOR=\"#2C547C\"><FONT SIZE=3 COLOR=\"#FFFFFF\" FACE=\"Helvetica\"><SPAN STYLE=\"font- size:14;\">"; String hdrTDEnd = "</SPAN></FONT></TD>"; String rowTD = "<TD VALIGN=TOP><FONT SIZE=3 FACE=\"Helvetica\"><SPAN STYLE=\"font-size:14;\">"; String rowTDColor = "<TD VALIGN=TOP BGCOLOR=\"#d2d2d2\"> <FONT SIZE=3 FACE=\"Helvetica\"><SPAN STYLE=\"font-size:14;\">"; String rowTDEnd = "</SPAN></FONT></TD>"; // Use to alternate row shading boolean toggle = false; try { // Create stringbuffer and generate the file... // System.out.println ("generating HTML"); StringBuffer sb = new StringBuffer (); sb.append("<HTML>"); sb.append("<BODY BACKGROUND=\"../SilverStream/ Objectstore/Images/ExamplesBackground.JPG\">"); int colCount = m_agiRowCursor.getPropertyCount(); sb.append ("<TABLE BORDER=1 BGCOLOR=\"#ffffff\" CELLPADDING=5 CELLSPACING=1 WIDTH=100% HEIGHT=0>\n"); // Include headers from db table? if (headers) { sb.append ("<tr>"); for (int y=0; y<colCount; y++) { sb.append (hdrTD + m_agiRowCursor. getPropertyName (y) + hdrTDEnd); } sb.append ("</tr>\n"); } // System.out.println ("generating HTML2"); // Tell the dso to start feeding the AgiRowCursor... boolean rc = m_agiRowCursor.gotoFirst(); int rowcount = 0; while (rc) { // Keep count of rows added rowcount++; sb.append ("<tr>"); // Get all of the rows from the table for ( int x = 0; x < colCount; x++) { Object obj = m_agiRowCursor.getProperty (x); if (obj==null) obj = (String) "null"; else if (obj.equals("")) obj = "empty"; // Alternate row shading if (!toggle) sb.append (rowTD + obj.toString() + rowTDEnd); else sb.append (rowTDColor + obj.toString() + rowTDEnd); } // end of for block // Add html end of row marker sb.append ("</tr>\n"); toggle = !toggle; // Get next row from the AgiRowCursor rc = m_agiRowCursor.gotoNext(); } // End of while block // Add html end-of-table marker sb.append ("</table>"); // Add text with row count sb.append("<p>Rows Retrieved: "+ new Integer(rowcount) ); // Add EOF html marker sb.append("</BODY></HTML>"); // Return table as string to caller return sb.toString(); } // End of try block catch (Exception _e) { System.out.println ("gen html:" + _e); return null; } }