结合前端界面实现文件的上传和下载,首先需要了解会话跟踪,基于http是一种短连接,对于服务器来说并不知道每一次的请求是谁发的,它只负责接收请求并做出响应,并且每一次的请求与响应都互不关联,例如我只需要知道执行完登录操作之后的请求路径就可以越过登录直接访问,因此需要给每一个用户一个识别码,用户登录后才能执行后面的操作。
servlet提供了以下四种会话技术:
1、URL重写(浏览器地址栏传值)
2、隐藏域传值(将文本框隐藏并给定默认值)
3、Session:session用于存储客户端和服务端的一次会话,是服务端的一段缓存空间。默认有效时间是30分钟
4、Cookie:cookie是一个用于在客户端缓存数据的客户端文件,适用于缓存稍大量的数据信息,可以自由设定有效时长。
session的概念
Session同样也是会话技术的一种,和存储于客户端的Cookie不同,Session是存储于服务器端的。我们可以先简单的把Session理解为个人的储物柜,每个人有一个唯一对应的储物柜,用户可以根据手里的钥匙来操作储物柜。就在上面的例子中,比如说是一家健身房,当我们进入健身房后,前台小妹会给我们一把储物柜的钥匙(Cookie),我们拿着钥匙找到对应的柜子(Session),换装,健身…,换装,归还钥匙,此次健身结束。
在上面这次健身经历中,从我们进入健身房到离开健身房就是一次完整的会话,前台小妹给我们的钥匙就是一个Cookie,钥匙上号码牌对应的柜子就是Session,每位健身者都只拥有一个储物柜,可以将衣服、背包、手机等物品存放其中,中间健身过程中比如买了瓶水、炸鸡等物品,一样可以放入储物柜中或拿在身边,这些内容即是会话过程中产生的数据,可以存储于客户端或服务器。
想象一下,如果没有储物柜的存在(Session),我们则需将所有衣服、鞋子等等带在身边,每换一个项目就得将所有的东西一起携带过去,这也是我们说的如果把过多的信息存储在客户端的弊端。
了解了这个原理之后,对该项目进行简单的分析:
数据库需要三张表:
文件信息表,
操作记录表,
用户表。
DAO:fileDAO;
实体类(entity):File,Record,User
过滤器(FileFilter);
相应的Servlet类;
数据库访问工具
代码如下:
DAO层
public class FileDAO {
//添加用户
public boolean add(User user){
String sql = "insert into user(uname,password,phone) values(?,?,?)";
return DBUtils.exeUpdate(sql,user.getUname(),user.getPassword(),user.getPhone());
}
//查询所有用户信息
public List<User> queryUser(){
String sql = "select * from user ";
return DBUtils.queryList(User.class,sql);
}
//查询一个用户信息
public User queryOne(String name){
String sql ="select * from user where uname=?";
return DBUtils.queryOne(User.class,sql,name);
}
//添加文件
public boolean addFile(File file){
String sql = "insert into file(fname,size,time,type,userid,score,detail,keyword,username) values(?,?,?,?,?,?,?,?,?)";
return DBUtils.exeUpdate(sql,file.getFname(),file.getSize(),file.getTime(),file.getType(),file.getUserid(),file.getScore(),file.getDetail(),file.getKeyword(),file.getUsername());
}
//添加记录
public boolean addRecord(Record record){
String sql = "insert into record(fname,path,updown,time,userid) values(?,?,?,?,?)";
return DBUtils.exeUpdate(sql,record.getFname(),record.getPath(),record.getUpdown(),record.getTime(),record.getUserid());
}
//查询所有文件信息
public List<File> queryAll(){
String sql = "select * from file";
return DBUtils.queryList(File.class,sql);
}
//查询当前用户上传的文件信息
public List<File> querySelf(int id){
String sql = "select * from file where userid=?";
return DBUtils.queryList(File.class,sql,id);
}
}
BaseServlet类 version2.0
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取需要执行的方法名称
String methodName = req.getParameter("method");
//根据方法名获取需要执行的方法对象
try {
Method method = this.getClass().getMethod