**基于Java Servlet 构建的图片服务器**
文章目录
一.项目概述
1.1项目背景
用过的很多app中,每次去更换头像都会让你从本地相册中选择图片进行更换,还有前几天在学习通上传实验截图,也是点击后选择本地图片进行上传,还有博客的插入图片功能,还有等等等很多地方都用到了此功能,所以这个图片上传功能应用好广啊,俗话说,学以致用,我也想自己实现一个图片服务器,来让大家分享自己的各种有趣的,好玩的照片,美食,美景,美人都来进到我的服务器中吧。
如果感兴趣,那让我们往下接着看。
1.2项目介绍
1.实现一个web程序,通过url进入到图片服务器首页,直接展示所有人上传过的图片。
2.选择上传就可以从本地文件或者相册中去选择图片,点击提交后,页面会展现出你提交的图片。
3.对单张图片进行删除,会提示用户删除成功。
4.每张图片可以单击放大,左右滑动来浏览。
这就是这个简陋的图片服务器的一个介绍。
二.项目设计
2.1项目整体架构
核心就是一个 HTTP 服务器, 提供对图片的增删改查能力,同时搭配简单的页面辅助完成图片上传/展示功能。需要用到tomcat,IDEA,MySQL。
后面还会通过打war包的形式将项目部署在linux上,更好的展现项目功能。
2.2项目涉及知识点
- 简单的Web服务器设计能力
- Java 操作 MySQL 数据库
- 数据库设计
- 响应风格 API
- gson 的使用
- 加深对HTTP 协议的理解
- Servlet 的使用
- 基于 md5 进行校验
- 软件测试的基本思想和方法
2.3 项目具体实现
2.3.1 数据库的设计
使用mysql,创建一个表来存放图片的属性信息,包括:id,图片名,图片大小,上传时间,图片类型,它的路径,md5(后面优化会用到)。
CREATE TABLE image_table (
imageId int(11) NOT NULL AUTO_INCREMENT,
imageName varchar(50) DEFAULT NULL,
size int(11) DEFAULT NULL,
uploadTime varchar(50) DEFAULT NULL,
contentType varchar(50) DEFAULT NULL,
path varchar(1024) DEFAULT NULL,
md5 varchar(1024) DEFAULT NULL,
PRIMARY KEY (imageId)
)
2.3.2 JDBC建立数据库连接
选择用单例模式的饿汉,将JDBC连接专门封装到一个类里面,方便后面调用。选择单例模式是因为这个类只能创建一个实例,节省资源。
千万不能忘了close方法,里面的关闭的顺序不能有错,遵循先打开的后关闭。
package dao;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
private static final String url="jdbc:mysql://127.0.0.1:3306/image_picture?characterEncoding=utf8&&useSSL=true";
private static final String USERNAME="root";
private static final String PASSWORD="mysql";
//private static final String PASSWORD="LMJian521";
//private static final String PASSWORD="";
/**
* DataSource创建的connection既有基本实现,也有连接池实现(可以复用,DataSource帮我们实现了复用机制
*/
private static DataSource dataSource=null;
public static DataSource getDataSource(){
//通过这个方法来创建DataSource的实例
if(dataSource==null) {
synchronized (DBUtil.class) {
if (dataSource == null) {
dataSource = new MysqlDataSource();
MysqlDataSource tmpdataSource=(MysqlDataSource )dataSource;
tmpdataSource.setURL(url);
tmpdataSource.setUser(USERNAME);
tmpdataSource.setPassword(PASSWORD );
}
}
}
return dataSource;
}
public static Connection getConnection() {
try {
return getDataSource() .getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet) {
try {
if(resultSet!=null)
resultSet.close();
if(statement!=null){
statement.close();
}
if(connection!=null){
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.3.3 封装一个类对象表示图片
面向对象编程,首先就是如何抽象为对象,一张图片代表一个对象,所以用一个类来描述它的属性,也就是数据库表里面的属性,顺序必须一一对应。
这里属性都是private,封装起到了保护作用,外部只能通过调用get,set方法来进行操作。
package dao;
public class Image {
/**
* image保存图片的属性
*/
private