Struts2项目实战 微云盘(三):DAO实现

时间:2022-08-31 15:11:31

一、本节说明
本节主要实现用户对象、目录结点、数据单元、DAO接口、业务逻辑组件
查看项目效果
进入github下载本项目(开源)
二、Bean实现
1.User
cn.lzf.bean包下的类

User封装了用户的基本信息,User有以下几个属性:

private String username;// 用户名

private String password;// 密码

private String sex;// 性别

private int age;// 年龄

private String phone;// 电话

private DirNode root;//根目录结点

还有多个构造方法、setter、getter方法这里就省略了。

2.DirNode
cn.lzf.bean包下的类

DirNode代表一个目录结点,它就可以表示一个文件夹,也可以表示一个文件,它具有的属性如下:

// 文件名
private String name;

// 是否为文件夹
private boolean isDir;

// 结点的孩子
private List<DirNode> childs = new ArrayList<DirNode>();

// 如果该结点是文件,url表示的是文件所在的URL
private String url;

构造方法、setter、getter方法省略。
文件夹目录结构就是用树形结构来存储的,根结点也是结点。

3.数据单元
cn.lzf.dao包下的类

因为这个项目不使用数据库,那么数据保存在哪里呢?所谓数据单元,其实就是一个简单的Java类,它有静态的变量。当前已经注册过的用户对象都应该保存在数据单元里,当用户注册时,初始化根结点并将用户数据封装成User对象,然后保存到数据单元中,数据单元实现如下:

public class Unit {

//存储用户与根目录结点的映射关系
public static List<User> users = new ArrayList<User>();

}

三、DAO接口实现
用户的注册行为、登录行为、创建、删除文件夹都需要借助于底层DAO操作。
1.BaseDao
位于cn.lzf.dao包下

该类是一个基类的DAO接口,它提供了一些DAO操作通用的方法规范。说明一下:因为本项目没有用hibernate,而是用数据单元进行模拟DAO操作,所以多个DAO操作之间没有什么通用点,该接口在本项目下意义并不大,但为了后期扩展性(如果使用了底层数据库,那么这里就可以抽象出几个通用方法),该接口仍然保留。

public  interface BaseDao<T>{
//保存实体
public boolean save(T bean);

//搜索实体
public T find(T bean,Class<T> clazz);
}

2.UserBaseDao
位于cn.lzf.dao包下

该类是用户的DAO接口,它继承自BaseDao。

public interface UserBaseDao extends BaseDao<User>{

}

四、DAO实现类
1.BaseDaoImpl
位于cn.lzf.Impl包下

该类表示基类的业务逻辑组件,它是BaseDao接口的一个实现。当然,因为项目原因,这些方法都是空实现,实现如下:

/**
* 提供一个BaseDao接口的实现类
* 实现通用的操作方法
* @author Administrator 刘壮飞
*
* @param <T>
*/

public class BaseDaoImpl<T> implements BaseDao<T>{

@Override
public boolean save(T bean) {
// TODO Auto-generated method stub
return false;
}

@Override
public T find(T bean, Class<T> clazz) {
// TODO Auto-generated method stub
return null;
}

}

2.UserBaseDaoImpl
位于cn.lzf.Impl包下

该类表示用户业务逻辑组件,它继承自BaseDaoImpl<User>并实现了UserBaseDao接口,定义了用户注册、验证、获取根目录等方法。

/**
* 用户相关DAO操作
* @author Administrator
*
*/

public class UserBaseDaoImpl extends BaseDaoImpl<User> implements UserBaseDao{

/**
* 查找用户的根目录结点
* @param username
* @param password
* @return
*/

public DirNode findRootNode(String username, String password){
for (User user :Unit.users) {
if (user.getUsername().equals(username) && user.getPassword().equals(password))
return user.getRoot();
}
return null;
}

/**
* 验证用户信息
* @param username
* @param password
* @return
*/

public boolean validate(String username,String password){
if(findRootNode(username, password)==null) return false;
else return true;
}

/**
* 注册用户
* @param user
* @return
*/

public boolean register(User user){
Unit.users.add(user);
return true;
}

/**
* 注册用户
* @param username
* @param password
* @param sex
* @param age
* @param phone
* @return
*/

public boolean register(String username,String password,String sex,int age,String phone){
return register(new User(username, password, sex, age, phone,new DirNode("", true)));
}
}

3.组合多个DAO业务
位于cn.lzf.Impl包下

为了程序清晰,我们使每个DAO业务只去完成与自身相关的功能。但是完成一项功能,必不可少的要调用多个DAO业务逻辑对象,如果在控制器中调用多个业务逻辑实现某个功能必定会造成程序混乱,时间久了之后系统会很难维护。所以,我们定义一个业务服务类来组合多个DAO操作。

注意:以下代码并不完整,之后会进一步完善。

/**
* 业务逻辑组件,负责组合多个DAO操作完成某个具体的功能
* @author Administrator 刘壮飞
*
*/

public class ServiceImpl {

private UserBaseDaoImpl userBaseDaoImpl;

public ServiceImpl(){
userBaseDaoImpl=new UserBaseDaoImpl();
}

/**
* 验证用户信息
* @param username
* @param password
* @return
*/

public boolean validate(String username,String password){
return userBaseDaoImpl.validate(username, password);
}

/**
* 注册用户
* @param username
* @param password
* @param sex
* @param age
* @param phone
* @return
*/

public boolean register(String username,String password,String sex,int age,String phone){
return userBaseDaoImpl.register(username, password, sex, age, phone);
}
}

从这个代码看起来发现只是把UserBaseDaoImpl包装了一层,并没有什么卵用。其实不然,在该项目中不可能只有UserBaseDaoImpl,还会有其他的DaoImpl,在ServiceImpl类中我省略了DirBaseDaoImpl,之后ServiceImpl会组合UserBaseDaoImpl和DirBaseDaoImpl。

五、本节总结
本节主要实现了DAO底层逻辑,有了这个基础,下一步就可以开始着手实现注册登录功能了。