Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > ObjectInput/Output streams and byte[]

Reply
Thread Tools

ObjectInput/Output streams and byte[]

 
 
Ike
Guest
Posts: n/a
 
      09-26-2003
When reading a Blob, using JDBC, without using a servlet as an intermediary,
I am able to succesfully read the Blob and decode to an ImageIcon as:

blob = rs.getBlob( 1 );
if(blob!=null){
iLength = (int)(blob.length());
ii = new ImageIcon(blob.getBytes( 1, iLength ));

However, I have problems now when I put a servlet as the intermediary
between my applet and the (MySql) database.Since Blobs are not serializable,
I am converting the blob to a byte[] within the servlet, sending the byte[]
to the Applet, where I try to instantiate an ImagIcon from the byte[].

My applet side thus looks like this:

//calling the data from teh servlet...
Vector h = new Vector();
Vector d = new Vector()
execSQL("select * from table", h,d);

//later, I retrieve the byte[] and go to create the ImageIcon...
byte[] jack = (byte[])v2.elementAt(u); //jack[] is now filled with data and
appears to be the right size
ImageIcon ii = new ImageIcon(jack);

The byte[] IS coming over, but somehow it is being transformed. I fear I
have something REALLY stupid in the code that follows, but I cannot discern
what it is. -Ike

public String execSQL(String sqlField,Vector headers,Vector rows) {
try {
int i;
String s;
String host = applet.getDocumentBase().getHost();
int port = applet.getDocumentBase().getPort();
if (port != -1) host += ":" + port;
URL servletURL = null;
servletURL = new URL("http://" + host + servletURLstring);
URLConnection uc = servletURL.openConnection();
uc.setDoOutput(true);
uc.setDoInput(true);
uc.setUseCaches(false);

uc.setRequestProperty("Content-type","application/octet-stream");
ObjectOutputStream objOut = new
ObjectOutputStream(uc.getOutputStream());
String conArray[] = new String[5];
conArray[0] = driverField;
conArray[1] = urlField;
conArray[2] = userField;
conArray[3] = passwordField;
conArray[4] = sqlField;
if(hacking) System.out.println("send to servlet: " + sqlField);
objOut.writeObject(conArray);
objOut.flush();
objOut.close();

// get objects from servlet (1. message-string, 2. headers
3.resultset-vector)
ObjectInputStream objIn = new ObjectInputStream
(uc.getInputStream());
String returnString = (String)objIn.readObject();
headers.addAll( (Vector)(objIn.readObject()) );

// get results of the query
rows.addAll( (Vector)(objIn.readObject()) );
objIn.close();
return returnString;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
};


public class TestServlet2 extends HttpServlet {
public boolean DEBUG;
/** Creates a new instance of TestServlet2 */
public TestServlet2() {
}
public void init(ServletConfig config) throws ServletException {
// This method initializes the servlet and only gets call once.
// Allocate all of the servlet resources here.
super.init(config);
}

public void destroy() {
// Once this method is called then any instance of this class can be
garbage collected
// Here is where all servlets resources can be deallocated.
}

// public synchronized void service (HttpServletRequest request,
HttpServletResponse response)
public void service(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
try {
String returnString = "OK";;
Vector headers = new Vector();
Vector rows = new Vector();

// get an input stream from the applet
(driver,url,userid,password,query-string)
ObjectInputStream inputFromApplet = new
ObjectInputStream(request.getInputStream());
String connArray[] = (String[])inputFromApplet.readObject();
inputFromApplet.close();
String driver = connArray[0];
String url = connArray[1];
String user = connArray[2];
String password = connArray[3];
String SQLString = connArray[4];

// perform query
int numberOfRows = 0;
Statement st = null;
Connection con = null;
try {
Class.forName(driver).newInstance();
con = DriverManager.getConnection(url,user,password);
st = con.createStatement();
st.execute(SQLString);

int updRows = st.getUpdateCount(); // -1 if no updates
if (updRows > 0) { // update,insert......
returnString = ("Rows affected: " + updRows);
}
else if (updRows == 0) { // no updates
returnString = ("Error, no rows affected");
}
else { // result of a sql-select
ResultSet rs = st.getResultSet();
ResultSetMetaData md = rs.getMetaData();

// headers
int numberOfColumns = md.getColumnCount();
for(int column = 0; column < numberOfColumns; column++)
{
headers.addElement(md.getColumnLabel(column+1));
}

// result
while (rs.next()) {
numberOfRows++;
Vector newRow = new Vector();
for (int i = 1; i <= numberOfColumns; i++) {

if(((String)headers.get(i-1)).equals("picture")){
try{
Blob blob = rs.getBlob(i);
if(blob!=null){
int iLength = (int)(blob.length());
byte[] jack = blob.getBytes( 1,
iLength );
newRow.addElement(jack);
}
}catch(Exception ex){returnString=
ex.toString();}
} else
newRow.addElement(rs.getObject(i));
}
rows.addElement(newRow);
}
rs.close();
if (numberOfRows == 0) returnString = "no rows
selected";
}
st.close();
con.close();
}
catch (SQLException e) {
if (st != null) st.close();
if (con != null) con.close();
returnString = e.toString();
}
// send objects back to applet
ObjectOutputStream outputToApplet = new
ObjectOutputStream(response.getOutputStream());
outputToApplet.writeObject(returnString); // sql-message
outputToApplet.writeObject(headers); // fieldnames
outputToApplet.writeObject(rows); // result-vector
outputToApplet.flush();
outputToApplet.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}


 
Reply With Quote
 
 
 
 
Ike
Guest
Posts: n/a
 
      09-26-2003
Wow, got it solved here.....after ii = new ImageIcon(blob.getBytes( 1,
iLength ));

and before I go do something with ii, I need to insert:

if(ii.getImageLoadStatus() == MediaTracker.COMPLETE)

//Ike

"Ike" <(E-Mail Removed)> wrote in message
news:USYcb.6720$(E-Mail Removed) ink.net...
> When reading a Blob, using JDBC, without using a servlet as an

intermediary,
> I am able to succesfully read the Blob and decode to an ImageIcon as:
>
> blob = rs.getBlob( 1 );
> if(blob!=null){
> iLength = (int)(blob.length());
> ii = new ImageIcon(blob.getBytes( 1, iLength ));
>
> However, I have problems now when I put a servlet as the intermediary
> between my applet and the (MySql) database.Since Blobs are not

serializable,
> I am converting the blob to a byte[] within the servlet, sending the

byte[]
> to the Applet, where I try to instantiate an ImagIcon from the byte[].
>
> My applet side thus looks like this:
>
> //calling the data from teh servlet...
> Vector h = new Vector();
> Vector d = new Vector()
> execSQL("select * from table", h,d);
>
> //later, I retrieve the byte[] and go to create the ImageIcon...
> byte[] jack = (byte[])v2.elementAt(u); //jack[] is now filled with data

and
> appears to be the right size
> ImageIcon ii = new ImageIcon(jack);
>
> The byte[] IS coming over, but somehow it is being transformed. I fear I
> have something REALLY stupid in the code that follows, but I cannot

discern
> what it is. -Ike
>
> public String execSQL(String sqlField,Vector headers,Vector rows) {
> try {
> int i;
> String s;
> String host = applet.getDocumentBase().getHost();
> int port = applet.getDocumentBase().getPort();
> if (port != -1) host += ":" + port;
> URL servletURL = null;
> servletURL = new URL("http://" + host + servletURLstring);
> URLConnection uc = servletURL.openConnection();
> uc.setDoOutput(true);
> uc.setDoInput(true);
> uc.setUseCaches(false);
>
> uc.setRequestProperty("Content-type","application/octet-stream");
> ObjectOutputStream objOut = new
> ObjectOutputStream(uc.getOutputStream());
> String conArray[] = new String[5];
> conArray[0] = driverField;
> conArray[1] = urlField;
> conArray[2] = userField;
> conArray[3] = passwordField;
> conArray[4] = sqlField;
> if(hacking) System.out.println("send to servlet: " +

sqlField);
> objOut.writeObject(conArray);
> objOut.flush();
> objOut.close();
>
> // get objects from servlet (1. message-string, 2. headers
> 3.resultset-vector)
> ObjectInputStream objIn = new ObjectInputStream
> (uc.getInputStream());
> String returnString = (String)objIn.readObject();
> headers.addAll( (Vector)(objIn.readObject()) );
>
> // get results of the query
> rows.addAll( (Vector)(objIn.readObject()) );
> objIn.close();
> return returnString;
> }
> catch (Exception e) {
> e.printStackTrace();
> }
> return null;
> };
>
>
> public class TestServlet2 extends HttpServlet {
> public boolean DEBUG;
> /** Creates a new instance of TestServlet2 */
> public TestServlet2() {
> }
> public void init(ServletConfig config) throws ServletException {
> // This method initializes the servlet and only gets call once.
> // Allocate all of the servlet resources here.
> super.init(config);
> }
>
> public void destroy() {
> // Once this method is called then any instance of this class can

be
> garbage collected
> // Here is where all servlets resources can be deallocated.
> }
>
> // public synchronized void service (HttpServletRequest request,
> HttpServletResponse response)
> public void service(HttpServletRequest request, HttpServletResponse
> response) throws ServletException, IOException {
> try {
> String returnString = "OK";;
> Vector headers = new Vector();
> Vector rows = new Vector();
>
> // get an input stream from the applet
> (driver,url,userid,password,query-string)
> ObjectInputStream inputFromApplet = new
> ObjectInputStream(request.getInputStream());
> String connArray[] = (String[])inputFromApplet.readObject();
> inputFromApplet.close();
> String driver = connArray[0];
> String url = connArray[1];
> String user = connArray[2];
> String password = connArray[3];
> String SQLString = connArray[4];
>
> // perform query
> int numberOfRows = 0;
> Statement st = null;
> Connection con = null;
> try {
> Class.forName(driver).newInstance();
> con = DriverManager.getConnection(url,user,password);
> st = con.createStatement();
> st.execute(SQLString);
>
> int updRows = st.getUpdateCount(); // -1 if no updates
> if (updRows > 0) { //

update,insert......
> returnString = ("Rows affected: " + updRows);
> }
> else if (updRows == 0) { // no updates
> returnString = ("Error, no rows affected");
> }
> else { // result of a sql-select
> ResultSet rs = st.getResultSet();
> ResultSetMetaData md = rs.getMetaData();
>
> // headers
> int numberOfColumns = md.getColumnCount();
> for(int column = 0; column < numberOfColumns;

column++)
> {
> headers.addElement(md.getColumnLabel(column+1));
> }
>
> // result
> while (rs.next()) {
> numberOfRows++;
> Vector newRow = new Vector();
> for (int i = 1; i <= numberOfColumns; i++) {
>
> if(((String)headers.get(i-1)).equals("picture")){
> try{
> Blob blob = rs.getBlob(i);
> if(blob!=null){
> int iLength =

(int)(blob.length());
> byte[] jack = blob.getBytes( 1,
> iLength );
> newRow.addElement(jack);
> }
> }catch(Exception ex){returnString=
> ex.toString();}
> } else
> newRow.addElement(rs.getObject(i));
> }
> rows.addElement(newRow);
> }
> rs.close();
> if (numberOfRows == 0) returnString = "no rows
> selected";
> }
> st.close();
> con.close();
> }
> catch (SQLException e) {
> if (st != null) st.close();
> if (con != null) con.close();
> returnString = e.toString();
> }
> // send objects back to applet
> ObjectOutputStream outputToApplet = new
> ObjectOutputStream(response.getOutputStream());
> outputToApplet.writeObject(returnString); // sql-message
> outputToApplet.writeObject(headers); // fieldnames
> outputToApplet.writeObject(rows); // result-vector
> outputToApplet.flush();
> outputToApplet.close();
> }
> catch(Exception e) {
> e.printStackTrace();
> }
> }
> }
>
>



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Problems with image types and response streams.... =?Utf-8?B?cm9iIGx5bmNo?= ASP .Net 0 12-21-2005 05:42 PM
nio and socket, streams Ajay Java 0 10-31-2005 07:49 PM
streams and querystrings =?Utf-8?B?Sm9obiBIb3BwZXI=?= ASP .Net 2 01-21-2005 09:35 PM
how to use open with many input streams and capture output? Pawel Banys Perl 1 07-08-2004 06:32 PM
streams and threads... why? Frank Java 2 01-29-2004 01:23 AM



Advertisments