一、本节说明
进入github下载本项目(开源)
本节主要实现新建文件夹、删除文件夹、获取指定路径的孩子集合
二、文件夹相关DAO
1.DirBaseDao
文件相关DAO操作的接口,继承自BaseDao。
public interface DirBaseDao extends BaseDao<DirNode>{
}
2.DirBaseDaoImpl
该类处理文件夹相关的操作,可以说,整个项目的核心就是这么一个类了,该类主要提供了三个方法的实现:
- 在指定根路径下搜索指定路径path所对应的DirNode
- 在指定根路径下搜索指定路径path所对应的DirNode的孩子集合
- 在指定根目录下删除多个文件结点
在这几个方法中如果指定路径path是空或者“”,那么程序会搜索其根目录,并返回根目录结点
/**
* 处理文件夹相关的DAO操作
*
* @author Administrator 刘壮飞
*/
public class DirBaseDaoImpl extends BaseDaoImpl<DirNode> implements DirBaseDao {
/**
* 在指定根路径下搜索指定路径path所对应的DirNode
* @param root
* @param dirPath
* @return
*/
public DirNode findNode(DirNode root, String dirPath) {
DirNode result = root;
//待搜索路径非根目录
if (dirPath != null && !dirPath.equals("")) {
// 切分路径
String[] arr;
if (dirPath.indexOf("#") != -1)
arr = dirPath.split("#");
else {
arr = new String[1];
arr[0] = dirPath;
}
// 保存当前匹配到的结点以及其孩子节点
DirNode curDirNode = result;
List<DirNode> curDirNodes = result.getChilds();
int pos = -1;
for (int i = 0; i < arr.length; i++) {
pos = -1;
if ((pos = index(arr[i], curDirNodes)) != -1) {
curDirNode = curDirNodes.get(pos);
curDirNodes = curDirNode.getChilds();
} else return null;
}
//返回搜索结点
return curDirNode;
}
//路径为根目录时返回根节点
return result;
}
/**
* 查找curDirNodes中是否存在name值为key的结点
* @param key 待查找关键字,文件名
* @param curDirNodes 结点集合
* @return
*/
private int index(String key, List<DirNode> curDirNodes) {
for (int i = 0; i < curDirNodes.size(); i++) {
if (key.equals(curDirNodes.get(i).getName()))
return i;
}
return -1;
}
/**
* 在指定根路径下搜索指定路径path所对应的DirNode的孩子集合
* @param root
* @param dirPath
* @return
*/
public List<DirNode> findNodes(DirNode root, String dirPath) {
return findNode(root, dirPath).getChilds();
}
/**
* 在指定根目录下删除多个文件结点
* @param root
* @param multiNames 多个文件名,英文逗号分隔
* @param path 路径
* @return
*/
public DirNode deleteNodes(DirNode root,String path,String multiNames) {
DirNode deleteNode=findNode(root, path);
// 存储要删除的文件夹名
List<String> list1 = new ArrayList<String>();
// 存储要删除的文件夹节点
List<DirNode> list2 = new ArrayList<DirNode>();
// 分解出多个要删除的对象
if (multiNames.indexOf(",") != -1) {
String[] arr = multiNames.split(",");
for (int i = 0; i < arr.length; i++) {
list1.add(arr[i].trim());
}
} else list1.add(multiNames);
//将要删除的结点存储在集合中
for (int i = 0; i < deleteNode.getChilds().size(); i++) {
DirNode node = deleteNode.getChilds().get(i);
if (list1.indexOf(node.getName()) != -1) {
list2.add(node);
list1.remove(node.getName());
}
}
//删除并返回根节点
deleteNode.getChilds().removeAll(list2);
return deleteNode;
}
}
3.修改ServiceImpl
将ServiceImpl类修改为如下格式:
/**
* 业务逻辑组件,负责组合多个DAO操作完成某个具体的功能
* @author Administrator 刘壮飞
*
*/
public class ServiceImpl {
private UserBaseDaoImpl userBaseDaoImpl;
private DirBaseDaoImpl dirBaseDaoImpl;
public ServiceImpl(){
userBaseDaoImpl=new UserBaseDaoImpl();
dirBaseDaoImpl=new DirBaseDaoImpl();
}
/**
* 根据用户名、密码、路径查找结点
* @param username
* @param password
* @param path 为空时返回根目录结点
* @return
*/
public DirNode findNode(String username,String password,String path){
DirNode root=userBaseDaoImpl.findRootNode(username, password);
return dirBaseDaoImpl.findNode(root, path);
}
/**
* 根据用户名、密码、路径查找结点的孩子集合
* @param username
* @param password
* @param path 路径为空时返回根结点的孩子集合
* @return
*/
public List<DirNode> findNodes(String username,String password,String path){
DirNode root=userBaseDaoImpl.findRootNode(username, password);
return dirBaseDaoImpl.findNodes(root, path);
}
/**
* 删除多个结点
* @param username
* @param password
* @param path
* @return
*/
public DirNode deleteNodes(String username,String password,String path,String filename){
DirNode root=userBaseDaoImpl.findRootNode(username, password);
return dirBaseDaoImpl.deleteNodes(root, path,filename);
}
/**
* 验证用户信息
* @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);
}
}
三、控制器实现
DirAction是文件相关的控制器,它负责处理文件相关的用户请求。上边每个Action都只处理一个功能,所以只要实现execute()方法就可以了,我们可以在Action中创建多个格式与execute()类似的方法用来处理多个请求,在用户请求时可以用 ActionName!MethodName
格式来请求
首先定义它拥有的几个属性:
//用来保存返回结果
private List<DirNode> dirNodes;
//文件名
private String dirName;
//路径
private String path;
//省略setter、getter方法
1.创建文件夹
该方法负责创建文件夹,方法名是createDir(),所以jsp请求创建文件夹的地址是DirAction!createDir
它的步骤也就是以下几步:
- 获取业务服务组件
因为所有的DAO操作都是由ServiceImpl来调用的,所以操作DAO必须先获取到这个对象。 - 通过ActionContext取到session范围内的用户信息
- 调用ServiceImpl对象查找对应用户的根目录结点
- 根据文件名创建文件夹结点并将该节点添加到根目录结点的孩子集合中
- 设置返回结果
其实不管是哪个功能,前两步都是固定的,变化的只有最后两步,先来看创建文件夹的步骤:
public String createDir() throws Exception {
//第一步
ServiceImpl serviceImpl = new ServiceImpl();
//第二步
// 获取用户账号和密码
ActionContext ctx = ActionContext.getContext();
String username = (String) ctx.getSession().get("username");
String password = (String) ctx.getSession().get("password");
if (username == null || password == null) return ERROR;
//第三步
// 查找对应用户目录根节点
DirNode root = serviceImpl.findNode(username, password, path);
// 定义文件节点
DirNode node = new DirNode(dirName, true);
// 添加目录
if (root != null) root.getChilds().add(node);
//第四步
// 设置返回结果
setDirNodes(root.getChilds());
return SUCCESS;
}
2.查找指定路径的孩子结点
/**
* 获取指定路径的孩子结点
* @return
* @throws Exception
*/
public String getDirs() throws Exception {
//省略前两步
// 根据路径搜索节点
List<DirNode> childen = serviceImpl.findNodes(username, password, path);
// 设置返回结果
setDirNodes(childen);
return SUCCESS;
}
3.删除指定路径的多个孩子结点
/**
* 删除文件结点
* @return
* @throws Exception
*/
public String deleteDirs() throws Exception {
//省略前两步
//调用服务组件删除多个结点
DirNode dirNodes = serviceImpl.deleteNodes(username, password, path, dirName);
// 设置返回结果
setDirNodes(dirNodes.getChilds());
return SUCCESS;
}
四、Action配置
和前面几个步骤相同,Action实现完后还需要配置,如下:
<package name="lzf2" namespace="/" extends="json-default">
<action name="dirAction" class="cn.lzf.action.DirAction" method="createDir">
<result type="json">
<param name="noCache">true</param>
<param name="contentType">text/html</param>
</result>
<result name="error">/WEB-INF/content/error.jsp</result>
</action>
</package>
可以看到DirAction的配置信息和登录注册的控制器配置有些许差别:
- 不同点
在<struts></struts>
下可以定义多个<package></package>
,上一个包继承自struts-default
,而该包继承自json-default
。因为我想让DirAction返回JSON格式数据,所以DirAction所在的包笔记继承自json-default
,并且它定义了一个json类型的result。
五、小结
文件夹相关的控制器现在是彻底实现了,接下来的任务就是实现jsp页面并向Action发起请求。