一、项目简述
进入github下载本项目(开源)
这是一个模仿网盘的项目,主要是为了熟悉Struts2框架,该项目不涉及底层DAO操作,只涉及到Struts2的相关知识,底层DAO操作是使用数据单元进行模拟的。

本项目涉及到的知识有:网页布局、action的实现与配置、输入校验、树、Struts2的AJAX支持、Filter、文件上传下载。

实现的功能有:
1.登录、注册、注销
2.目录层次浏览
3.在任意目录层次下新建文件夹、删除文件夹
4.在任意目录层次下上传文件
5.在任意目录层次下删除文件、文件夹
6.返回上一级目录
7.文件下载

查看效果:项目效果展示

本节主要对项目进行分析以及对其中涉及到的一些知识点进行回顾。

二、知识点回顾

1.登录注册

登录注册功能是很普遍的功能。

所谓注册是指:网页收集用户填写的表单信息提交给RegisterAction处理,在RegisterAction的execute()方法中调用业务逻辑组件,业务逻辑组件调用DAO组件完成对用户数据的保存并返回逻辑视图名。

所谓登录:网页收集用户填写的表单信息提交给LoginAction处理,在LoginAction的execute()方法中调用业务逻辑组件,业务逻辑组件调用DAO组件完成对用户名和密码的验证,验证成功保存用户信息并返回SUCCESS逻辑视图名,失败返回ERROR逻辑视图名。

不要忘了在struts.xml文件中配置action,并定义逻辑视图名与资源视图的映射关系。

2.目录相关功能

这个功能对我来说是最难的了,有几下几个问题:

  • 2.1目录存储结构

    很自然的可以想到使用树形结构实现,每一个文件或者文件夹都是一个文件结点,每个结点都有多个孩子结点并有自身属性,每个用户都有一个根目录结点,这个根结点在用户注册时应该创建并建立起用户与根结点的映射关系。

    我们需要实现几个相关的方法,比如获取指定路径的所有孩子结点、删除多个文件结点

  • 2.2 路径表示方法

    为完成上一个目标,我们必须定义一个路径的表示方法。

    第一次尝试:

    根路径:/
    某路径:/文件夹1/文件夹2

    本来我是直接使用这种方式来定义的,第一行是根目录的定义方式,第二行是某个路径的定义方式。后来发现这种方式并不靠谱,系统内部会把/给转义。

    第二次尝试:

    根路径:“”或null
    某路径:文件夹1/文件夹2

    第二次我把根路径设为空,但是路径的表示中分隔符仍然会被转义,所以我用#来代替路径的分隔符,最终路径表示方法如下:

    根路径:“”或null
    某路径:文件夹1#文件夹2

  • 3.在指定路径下创建文件夹

    用户点击触发点击事件,我们将文件夹名、路径封装起来通过Ajax提交给DirAction下的指定方法。

    • 取出Session范围内保存的用户信息。
    • 根据用户信息调用业务逻辑组件,业务逻辑组件调用DAO组件获取指定用户、指定路径对应的文件结点
    • 根据文件夹名创建文件夹结点
    • 根据文件结点获取其孩子结点集合
    • 将文件夹结点添加到该孩子结点集合中
    • 设置DirAction的集合属性为当前路径的孩子集合,因DirAction的返回结果是Json,DirAction的所有属性名、属性值以及getter方法会被封装成Json数据返回。
  • 4.获取指定路径所有孩子结点

    • 取出Session范围内保存的用户信息。
    • 根据用户信息调用业务逻辑组件,业务逻辑组件调用DAO组件获取指定用户、指定路径对应的文件结点。
    • 根据文件结点获取其孩子结点集合
    • 设置DirAction的集合属性为当前路径的孩子集合,因DirAction的返回结果是Json,DirAction的所有属性名、属性值以及getter方法会被封装成Json数据返回。
  • 5.删除多个文件夹

    • 取出Session范围内保存的用户信息。
    • 根据用户信息调用业务逻辑组件,业务逻辑组件调用DAO组件获取指定用户、指定路径对应的文件结点。
    • 在参数中分解出要删除的多个文件夹名,遍历待删除的文件夹名数组,在文件结点的所有孩子中依次删除指定的文件夹
    • 返回文件结点
    • 获取其孩子集合,设置属性,返回逻辑视图名
  • 6.路径搜索

    可以看到前面三个功能实现步骤基本相同,都需要先查找到对应的目录层次才能进行下一步操作,我们需要定义以下两种操作:

    • 搜索指定路径的结点
      该方法的实现是重点,用户传入路径,如:file1#file2#file3
      将路径拆分为数组arr={“file1”,”file2”,”file3”}
      DAO组件根据用户名获取到根目录结点,然后获取到根目录结点的孩子结点集合childs
      定义当前匹配的结点curDirNode并初始化为根结点
      定义当前匹配的结点的孩子集合curDirNodes并初始化为curDirNode的孩子集合

      遍历数组,设当前遍历结点为node,在curDirNodes搜索与node结点的文件夹名属性值相同的结点,如果搜索到位置为pos,则令:

    //设置当前结点
    curDirNode = curDirNodes.get(pos);
    //设置孩子集合
    curDirNodes = curDirNode.getChilds();
    如果搜索不到,返回空。
    遍历结束,返回:
    
    //返回当前结点
    return curDirNode;
    • 搜索指定路径的孩子结点
      根据上一个方法的实现搜索出指定路径结点然后获取其孩子结点
    //直接调用上一个方法获取根节点然后获取它的孩子集合
    return findRootNode(username, password, dirPath).getChilds();

Struts2项目实战 微云盘(一):项目分析相关推荐

  1. Struts2项目实战 微云盘(六)主界面UI

    一.本节说明 进入github下载本项目(开源) 本节实现的是主界面UI 二.AJAX请求 在使用Jquery前先确认正确的引入了jquery. 1.获取文件结点 当文档加载完成后需要获取到用户根目录 ...

  2. Struts2项目实战 微云盘(四):登录注册

    一.本节说明 进入github下载本项目(开源) 本节实现登录.注册的逻辑以及UI. 二.Struts相关配置 在使用Struts前必选先配置Struts. Step1:引入Struts所需jar包 ...

  3. Struts2项目实战 微云盘 效果展示

    项目下载地址 进入github下载本项目(开源) 1.注册 2.登录 3.主页面 4.创建文件夹并上传三种类型文件 5.文件下载

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

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

  5. Struts2项目实战 微云盘(二):项目结构

    1.本节说明 进入github下载本项目(开源) 本节主要介绍项目的结构 2.项目结构 //项目名 StrutsDemo1||_src|//该包存放各种控制器|_cn.lzf.action|//处理文 ...

  6. Struts2项目实战 微云盘(八):Action异常处理

    一.本节说明 进入github下载该项目 进入github查看该项目的配置指南 本节是这个项目的最后一篇博文了,本节主要介绍Action的异常处理以及项目中出现的问题 二.Action的异常处理 1. ...

  7. Linux 15:基于C/S架构——微云盘

    文章目录 1. 项目简介 2. 图解 3. 代码serfile&clifile(初始版) 4. 协议 5. 客户端 5.1 代码图解 6. 断点续传(服务器-客户端) 7. 秒传(客户端-服务 ...

  8. 2018年最新Vue从基础入门到项目实战视频教程网盘学习地址

    2018年最新Vue从基础入门到项目实战视频教程网盘学习地址: https://pan.baidu.com/s/15D6GiHnSgA5Eo0n9G5Ws1A 若网盘地址失效,可访问此地址(下单有网盘 ...

  9. 调试项目出错------360云盘同步搞的鬼

    每次调试jfinal的一个项目总是报错,百度不出来,看文档没找出错误.也不好意思去问人.脸皮以后要再厚点. 只好仔细研究报错,发现错误原来是 引用的原来版本的包的错误,但是我明明更新了包. MyEcl ...

最新文章

  1. 漫话:如何给女朋友解释什么是单例模式?
  2. Base64编码原理与实现
  3. vhd安装windows 7 64位
  4. javascript运行机制之执行顺序详解
  5. etcd集群部署与遇到的坑
  6. 【struts2】struts2配置文件—struts.xml
  7. 牛客题霸 [括号生成] C++题解/答案
  8. Github | 人脸识别手册 (分类论文集)
  9. 深入研究:HTTP2的真正性能到底如何
  10. worldcloud库的使用
  11. SQL variable type
  12. 联想启天m410进bios_联想启天M410台式机怎么装win7系统
  13. windowsXP消灭蓝屏的另类招式
  14. node.js学习笔记之简洁聊天室
  15. 理科爱好者杂志理科爱好者杂志社理科爱好者编辑部2022年第3期目录
  16. python方差检验分析(ANOVA)
  17. 有人说程序员是一个很高大上又高不可攀的职业,你认同吗?
  18. Spring Web : FormHttpMessageConverter
  19. 金碟文件保存在服务器哪里,金蝶软件服务器地址在哪改
  20. 百度之星-列变位法解密

热门文章

  1. 自动换行的 RadioGroup
  2. Destoon b2b 6.0 PC端浏览器直接访问手机端地址的修改方法
  3. 大数据工程师应聘要求高么?好找工作么
  4. Typora安装包下载
  5. SharePoint Online 部件InjectionScriptWebpart制作新闻列表
  6. CCF认证考试——称检测点查询
  7. 可编程控制器控制系统设计方法
  8. [转载]如果你是12306网站架构师,你会如何设计网站的软件架构和硬件系统架构?...
  9. 如何利用matrox mil在picturebox中显示image_利用自拍照反弹shell
  10. 基于位置的服务(简介)