Java开发学习心得(三):项目结构
[TOC]
3 项目结构
经过前面一系列学习,差不多对Java的开发过程有了一定的了解,为了能保持一个良好的项目结构,考虑到接下来要进行开发,还需要学习一下Java的项目结构
下面以两个项目结构为参照
图1
图2
第一个是我自己学习时的Demo,一边学一边建文件,应该有些错误的地方,第二张是从网上看到的一个结构比较清晰的图片
图1的结构完整一点,就以图1为主一点点讲起
3.1 src
因为我用的是Maven,大方向上项目两大文件夹分别是src和target,以及一个pom.xml配置文件,src目录里是项目工程的源码文件,配置文件和资源文件等,其下一级是main和test这两个文件夹
3.1.1 main
main文件夹下是主要的工程源文件,然后下面又是两个文件夹:java和resources,其实上面也讲了,而且顾名思义,java里面是源码文件,resources里面是资源文件
3.1.1.1 java
这之下的文件结构可以参考上面的图2了,大体上就是model-mapper-service-controller,其他还有公共类和表现层等,这里在下面单独分一个章节来说
3.1.1.2 resources
资源文件夹默认就是这个样子,application.properties是用来填写各种配置的,比如数据库连接的配置信息、日志组件的配置信息等,有些人会改成yml后缀名,里面的格式就不尽相同了,在前面也讲过,这里就不再赘述。
除此之外,各种组件的配置文件也在这个文件夹下
还有一个主要的作用是存放静态文件资源,包括需要访问的jsp、html、css、js、图片等,还有代码模板
- 项目配置文件:resources/application.yml
- 静态资源目录:resources/static/
——用于存放html、css、js、图片等资源 - 视图模板目录:resources/templates/
——用于存放jsp、thymeleaf等模板文件 - mybatis映射文件:resources/mapper/(mybatis项目)
- mybatis配置文件:resources/mapper/config/(mybatis项目)
3.1.2 test
如题所述,单元测试用的
3.2 target
target是有存放项目构建后的文件和目录,jar包、war包、编译的class文件等
target里的所有内容都是maven构建的时候生成的
jar 包就是 java archive file java 的一种文档格式。jar文件非常类似zip
WAR是Sun提出的一种Web应用程序格式,与JAR类似,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织:
通常其根目录下包含有Html和Jsp文件或者包含这两种文件的目录,另外还会有一个WEB-INF目录,这个目录很重要。通常在WEB-INF目录下有一个web.xml文件和一个classes目录,web.xml是这个应用的配置文件,而classes目录下则包含编译好的Servlet类和Jsp或Servlet所依赖的其它类(如JavaBean)。
通常这些所依赖的类也可以打包成JAR放到WEB-INF下的lib目录下,当然也可以放到系统的CLASSPATH中,但那样移植和管理起来不方便
target里的所有内容都是maven构建的时候生成的
4 Java的工程文件结构
传统的三层不用再解释了,在Java里对应数据访问层的是DAO,进行数据交互,对应业务逻辑层的是Service层,这里写逻辑代码,然后就是UI层
4.1 几种对象的解释
上面提到DAO,这里简单说说一些相关的简写,在一些源码里看到了,初学时有点懵
- PO(persistant object): 持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。实体
- VO(value object):值对象,通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。可能就是Get/Set?
- DAO(Data Access Object):数据访问对象,用于访问数据库,里面包含对数据库的各种操作,配合VO进行CRUD
- DTO(Data Transfer Object):数据传输对象,是一组需要跨进程或网络边界传输的聚合数据的简单容器。它不应该包含业务逻辑,并将其行为限制为诸如内部一致性检查和基本验证之类的活动。我一开始以为是业务实体,但是看说明不是一个东西,那个是BO。
DTO的用法:
比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。DTO还有减少请求的次数、简化传输对象、避免代码重复等作用。
5. ORM(O/R Mapping,Object Relational Mapping):对象关系映射
4.2 实际的项目文件应该如何设计
可以参考图2
- bean也就是实体了,对应数据库的字段
- DAO,前面也说过了,不过里面写法可以细分很多种,使用Mybatis就是Mapper接口文件或者是xml的写法,如果还使用了JPA,还会有个repository类文件
- Service,这块好像写法的争议比较多,可以看看这篇文章有多少人在滥用 service+serviceImpl,又有多少人在误用myBatis
我在很多地方都看到了一个ServiceImpl接口,一个service类的写法,一直不理解为什么要多次一举,但还是照着做了,上面那篇文章里说到这是一种过时的写法,使用接口文件是为了解决可能连接各种数据库而有多个数据访问层的问题,这样只需要实现对应的结构就行了,而有了Mybatis之后这种问题就不存在了,所以不需要再写impl接口文件,使用 service+dao+mapper.xml 是一种更好的选择 - Controller,这里只讨论MVC了,普通java web的写法还不会,然后从controller应该就直接到资源文件里的HTML页面了
- 上面是按顺序自下而上的,除此之外一些公共层:工具类库(utils)、配置类(config)、数据传输对象(dto)、视图包装对象(vo)
还可以看看这篇spring boot 项目开发常用目录结构
Java开发学习心得(三):项目结构的更多相关文章
- Java开发学习心得(一):SSM环境搭建
目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...
- Java开发学习心得(二):Mybatis和Url路由
目录 Java开发学习心得(二):Mybatis和Url路由 1.3 Mybatis 2 URL路由 2.1 @RequestMapping 2.2 @PathVariable 2.3 不同的请求类型 ...
- Java开发学习(三十七)----SpringBoot多环境配置及配置文件分类
一.多环境配置 在工作中,对于开发环境.测试环境.生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配 ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- [翻译]现代java开发指南 第三部分
现代java开发指南 第三部分 第三部分:Web开发 第一部分,第二部分,第三部分 =========================== 欢迎来到现代 Java 开发指南第三部分.在第一部分中,我们 ...
- 《Java开发学习大纲文档》V7.0
<Java开发学习大纲文档>V7.0简介: 本文档是根据企业开发所需要掌握的知识点大纲进行总结汇编,是Java开发工程师必备知识体系,系统化学习针对性非常强,逻辑分析能力非常清晰;技术方面 ...
- Java开发学习(二十四)----SpringMVC设置请求映射路径
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
- Java开发学习(二十五)----使用PostMan完成不同类型参数传递
一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...
- Java开发学习(二十六)----SpringMVC返回响应结果
SpringMVC接收到请求和数据后,进行了一些处理,当然这个处理可以是转发给Service,Service层再调用Dao层完成的,不管怎样,处理完以后,都需要将结果告知给用户. 比如:根据用户ID查 ...
随机推荐
- 用了 HTTPS 还不安全,问题就出在低版本 TLS 上
HTTPS 加密时代已经来临,近两年,Google.Baidu.Facebook 等互联网巨头,不谋而合地开始大力推行 HTTPS, 2018 年 7 月 25 日,Chrome 68 上线,所有 H ...
- 用abp vNext快速开发Quartz.NET定时任务管理界面
今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码 ...
- 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析
在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...
- Chapter 5 Blood Type——12
I blinked, my mind going blank. Holy crow, how did he do that? 我眨着眼睛,心里一片空白.天哪,他是怎么做到的? "Er, wh ...
- 环境与工具3:从打字开始 | vim | sublime
作为程序员,最不爽的一件事是被亲戚叫去修电脑. "喂,怎么跟你们讲,我是写代码的,不是修电脑的!什么?代码是什么?!" 小白:为什么程序员就不能修电脑了? 小程:会不会修都有可能, ...
- 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute
先贴文章链接 正文 ASP.NET Core MVC 2.1 特意为构建 HTTP API 提供了一些小特性,今天主角就是 ApiControllerAttribute. (注:文章是18年2月份的, ...
- xamarin.forms之使用CarouselView插件模仿网易新闻导航
在APP中基本都能见到类似网易.今日头条等上边横向导航条,下边是左右滑动的页面,之前做iOS的时候模仿实现过,https://github.com/ywcui/ViewPagerndicator,在做 ...
- python实现ssh远程登录
python实现ssh远程登录 # 测试过程中,比较常用的操作就是将DUT(待测物)接入网络中,然后远程操控对DUT, # 使用SSH远程登陆到主机,然后执行相应的command即可 # python ...
- vue axios 批量删除 数组参数
方法一:前端循环请求服务器端delete(id)方法 请问如何获得element-ui表格中的勾选项index,以实现批量删除功能 https://segmentfault.com/q/1010000 ...
- Java开发笔记(十七)各得其所的多路分支
前面提到条件语句的标准格式为“if (条件) { /* 条件成立时的操作代码 */ } else { /* 条件不成立时的操作代码 */ }”,乍看之下仿佛只有两个分支,一个是条件成立时的分支,另一个 ...