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; 改变采样率 在图片加载之前 可以先前通过判断 然后合适大小的图片直接加载 过大的降低清晰度的方式 加载