android与servlet交互 通过数据库把存放的十六进制的图片数据传递到客户端

来源:互联网 发布:mysql insert 失败 编辑:程序博客网 时间:2024/06/08 11:46

servlet端:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
public class LoginAction extends HttpServlet {  

private ByteArrayOutputStream byteArrOut=null;
private  byte[] temp=new byte[10240];
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{

response.setContentType("text/html");
final  String DBURL="jdbc:sqlserver://ip地址:1433; DatabaseName=数据库名";      //链接字符串
final  String DBUSER="sa";            //数据库用户名
final  String DBPASS="sa";            //密码
FileOutputStream fop = null;
String filename =null ;
InputStream is = null ;
Connection conn = null ;
java.sql.Statement stmt =null;
java.sql.ResultSet rs=null;
   try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");          //加载驱动
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
             
   try {
conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);           //创建链接
} catch (SQLException e) {

e.printStackTrace();
}
   
   try {
stmt = conn.createStatement();
} catch (SQLException e) {

e.printStackTrace();
}
   String sql="select filename,code from fileupload where fileid=2523";    //类似存放文件的表  code代表存放图片的十六进制数据字段
   
   try {
rs = stmt.executeQuery(sql);
} catch (SQLException e) {

e.printStackTrace();
}
   
   try {
rs.next();
} catch (SQLException e) {

e.printStackTrace();
}
     try {
filename = rs.getString(1).trim();
} catch (SQLException e) {

e.printStackTrace();
}
   try {
is = rs.getBinaryStream(2);              //读取图标以二进制流的方式
} catch (SQLException e) {

e.printStackTrace();
}

   try {
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
   
  DataOutputStream out= new DataOutputStream(response.getOutputStream());          //数据包流
   
            byteArrOut = new ByteArrayOutputStream();                     //字节流

   int len = 0;    
   while ((len = is.read(temp, 0, 10240)) != -1) {  
    byteArrOut.write(temp, 0, len);         //把inputstream流 转换成byte流
   }    
   byteArrOut.flush();                             //完成写入
   byte[] bytes = byteArrOut.toByteArray();    //byte流 转换成 字节数组
      out.write(bytes);    //写入数据包流 用于响应客户端
            out.close();             //关闭流

}

}

android:

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
private ImageView  image = null ;
private HttpResponse httpResponse;

private byte[] b=new byte[10240];

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.image = (ImageView)super.findViewById(R.id.image);


HttpPost httpRequest = new HttpPost("http://
ip地址:端口/android/login");

try {
httpResponse = new DefaultHttpClient().execute(httpRequest);
} catch (ClientProtocolException e) {

e.printStackTrace();
} catch (IOException e) {

e.printStackTrace();
}
if(httpResponse.getStatusLine().getStatusCode()==200){


try {

b= EntityUtils.toByteArray((HttpEntity)httpResponse.getEntity());
this.image.setImageBitmap(BitmapFactory.decodeByteArray(b, 0, b.length));
//成功 获取了 图片 通过servlet

} catch (IOException e) {

e.printStackTrace();
}


}

   
    }
  
   
   
}
          


//tomcat 中可以在webapps 目录下 建立 android文件件  ---》WEB-INF-->(注意大小写)然后建立 classes  文件里面放置javac 编译好的.class  java文件     与classes同级放置web.xml    注意加上这一段 

<servlet>
<servlet-name>logina</servlet-name>
<servlet-class>LoginAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logina</servlet-name>
<url-pattern>/login</url-pattern>   //映射的   相当上述   http://ip地址:端口/android 后面的/login
</servlet>

补充:还有个问题就是图片的加载如果过大 会耗尽内存 报错的 解决方法:

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inSampleSize = 4; 改变采样率  在图片加载之前 可以先前通过判断 然后合适大小的图片直接加载  过大的降低清晰度的方式 加载

原创粉丝点击