酒店如何做网站,上海市建设工程招投标信息网,网站建设app开发公司,asp钓鱼网站开发1. 应用分层 应用分层类似公司的组织架构。我们进行项目开发时#xff0c;最开始功能简单#xff0c;前后端放在一起开发#xff0c;但随着项目功能的复杂#xff0c;项目会被前端和后端不同的团队接手#xff0c;甚至更细粒度的团队。甚至后端开发也会根据功能再进行细分…1. 应用分层 应用分层类似公司的组织架构。我们进行项目开发时最开始功能简单前后端放在一起开发但随着项目功能的复杂项目会被前端和后端不同的团队接手甚至更细粒度的团队。甚至后端开发也会根据功能再进行细分。MVC就是其中的一种拆分方式。 随着后端人员不再涉及前端后端开发又有了新的分层方式。
1.1 介绍 阿里开发手册中关于工程结构部分定义了常见工程的应用分层结果如下图所示 应用分层是一种软件开发设计思想它将应用程序分成N个层次这N个层次分别负责各自的职责多个层次之间协同提供完整的功能。根据项目的复杂度把项目分成三层四层或者更多层。其中常见的MVC设计模式就是应用分层的一种具体体现。 1.1.1 为什么需要应用分层 在最开始的时候为了让项目快速上线通常是不考虑分层的。但是随着业务越来越复杂大量的代码混在一起会出现逻辑不清楚、代码扩展性插、改一处导致处处改等问题。
1.1.2 如何分层三层架构 前面学习了MVC把整体分成了三个层次View视图、Controller控制器、Model模型也就是将用户视图和业务处理隔离开并且通过控制器连接起来很好的实现了表现和逻辑的解耦。是一种标准的软件分层架构。如图 当前更主流的开发方式是 “前后端分离” 的方式后端开发工程师不再需要关注前端的实现所以对于Java后端开发者又有了一种新的分层架构把整体架构分为表现层、业务逻辑层、数据层。这种分层方式也称之为 “三层架构”。 1、表现层就是展示数据结果和接受用户指令的是最靠近用户的一层。 2、业务逻辑层负责处理业务逻辑里面有复杂业务的具体实现。 3、数据层负责存储和管理应用程序相关的数据。 可以看到, 咱们前⾯的代码, 并不符合这种设计思想, ⽽是所有的代码堆砌在⼀起如下图所示 按照上面的层次划分Spring MVC 站在后端开发人员的角度上把上述代码划分为三个部分 1、请求处理响应数据负责接受页面的请求给页面响应数据。 2、逻辑处理负责业务逻辑处理的代码。 3、数据访问负责业务数据的维护操作包括增、删、改、查。 这三个部分在Spring的实现中都有体现如下图所示 1、Controller控制器。接收前端发送的请求对请求进行处理并且响应数据。 2、Service业务逻辑层。处理具体的业务逻辑。 3、Dao数据访问层也称为持久层。负责数据访问操作包括数据的增、删、改、查。 1.2 MVC和三层架构的区别和联系 从概念上来说二者都是软件工程领域中的架构模式。 1、MVC架构模式由三部分组成View视图、Controller控制器、Model模型 2、三层架构将业务应用划分为表现层、业务逻辑层、数据访问层 MVC中的视图和控制器对应三层架构中的表现层。MVC中的模型对应三层架构中的业务逻辑层、数据层、实体类二者架构图如下所示 由上图可知二者都是从不同角度对软件工程进行了抽象。 MVC模式强调数据和视图分离将数据展示和数据处理分开。控制器是它们之间的桥梁通过控制器对两者进行组合。 三层架构强调不同维度数据处理的高内聚和低耦合将交互界面、业务处理、数据库操作的逻辑分开。 二者开发角度角度不同故此也就谈不上互相替代了在日常的开发中可以经常看到两种共存的情况。比如我们设计模式的时候往往也会拆分出业务逻辑层Service层和数据访问层dao层。 但两者的目的都是相同的都是为了“解耦分层代码复用”。 1.3 软件设计原则高内聚低耦合
1.3.1 高内聚 一个模块中各个元素之间的联系的紧密程度如果各个元素语句、程序段之间的联系程度越高则内聚性越高即 “高内聚”。 1.3.2 低耦合 软件中各个层、模块之间的依赖关联程序越低越好。修改一处代码其他模块的代码改动越少越好。 那么高内聚和低耦合矛盾吗其实不矛盾高内聚是指一个模块中的各个元素之间的紧密程度低耦合是指各个模块之间的精密程度。如图 好比在大明1566朝堂里清流和严党之间的关联性要尽可能小严党出问题了清流党要尽可能减少两党之间的关系反之被牵连这就是低耦合而当严党自己内部出了问题时整个党派之间的所有成员要紧密的团结在一起一起解决、克服已经出现的问题这就是高内聚。
2、代码重构 上篇写了图书管理系统但是代码非常乱现在进行代码重构先创建对应包的路径如图 2.1 表现层 接收前端发送的请求对请求进⾏处理并响应数据
package com.example.zxslzw2014_8_11.controller;import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpSession;RestController
RequestMapping(/user)
public class UserController {RequestMapping(/login)public String login(String userName, String password, HttpSession session) {//1、校验参数//2、校验密码是否正确//3、返回响应结果System.out.println(userName password);if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {return 用户名或者密码为空;}if(!smy.equals(userName) || !111.equals(password)) {return 账号或密码错误;}session.setAttribute(userName, userName);return 登录成功;}
}
package com.example.zxslzw2014_8_11.controller;import com.example.zxslzw2014_8_11.model.BookInfo;
import com.example.zxslzw2014_8_11.service.BookService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;RestController
RequestMapping(/book)
public class BookController {RequestMapping(/getBookList)public ListBookInfo getBookList() {BookService bookService new BookService();return bookService.getBookList();}
} 2.2 service业务逻辑层
package com.example.zxslzw2014_8_11.service;import com.example.zxslzw2014_8_11.dao.BookDao;
import com.example.zxslzw2014_8_11.model.BookInfo;import java.util.List;public class BookService {public ListBookInfo getBookList() {BookDao bookDao new BookDao();ListBookInfo bookInfos bookDao.mockData();for(BookInfo bookInfo : bookInfos) {if(bookInfo.getStatus() 2) {bookInfo.setStatusCN(不可借阅);} else {bookInfo.setStatusCN(可借阅);}}return bookInfos;}
} 2.3 dao数据访问层 数据访问层: 负责数据访问操作包括数据的增、删、改、查
package com.example.zxslzw2014_8_11.dao;import com.example.zxslzw2014_8_11.model.BookInfo;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;public class BookDao {public ListBookInfo mockData() {//理论上应该从数据库中获取数据当前采用mock方式ListBookInfo bookInfos new ArrayList();for (int i 1; i 15; i) {BookInfo bookInfo new BookInfo();bookInfo.setId(i);bookInfo.setBookName(图书 i);bookInfo.setAuthor(作者 i);bookInfo.setNum(i * 2 1);bookInfo.setPrice(new BigDecimal(i * 3));bookInfo.setPublishName(出版社 i);if(i % 5 0) {bookInfo.setStatus(2);
// bookInfo.setStatusCN(不可借阅);} else {bookInfo.setStatus(1);
// bookInfo.setStatusCN(可借阅);}bookInfos.add(bookInfo);}return bookInfos;}
}
2.4 model实体类
package com.example.zxslzw2014_8_11.model;import lombok.Data;import java.math.BigDecimal;Data
public class BookInfo {private Integer id;private String bookName;private String author;private Integer num;private BigDecimal price;private String publishName;private Integer status;//1-可借阅 2-不可借阅private String statusCN;//状态的中文含义
}
2.5 应用分层的好处 1降低层与层之间的依赖结构更加的明确利于各层逻辑的复用。 2开发人员可以只关注整个结构中的其中某一层极大地降低了维护成本和维护时间。 3可以很容易的用新的实现来替换原有层次的实现。 4有利于标准化。 3.企业规范 1、类名使用大驼峰风格但以下情形例外DO / BO / DTO / VO / AO。 2、方法名、参数名、成员变量、局部变量统一使用小驼峰风格。 3、包名统一使用小写点分隔符之间有且仅有一个自然语义的英语单词。 常见命名风格
大驼峰所有单词首字母都需要大写又叫帕斯卡命名发比如UserController。
小驼峰除了第一个单词其他单词首字母大写比如userController。
蛇形用下划线_作用单词间的分隔符一般小写又叫下划线命名法比如user_controller。
串形用短横线-作用单词间的分隔符又叫脊柱命名法例如user-controller。
4. 学习Spring MVC的总结
1、学习Spring MVC其实就是学习各种Web开发需要用到的注解 a、RequestMapping路由映射 b、RequestParam后端参数重命名 c、RequestBody接收JSON类型的参数 d、PathVariable接收路径参数 e、RequestPart上传文件 f、ResponseBody返回数据 g、CookieValue从Cookie中获取值 h、SessionAttribute从Session中获取值 i、RequestHeader从Header中获取值 j、Controller定义一个控制器Spring框架启动时加载把这个对象交给Spring管理。默认返回视图。 k、RestControllerResponseBody Controller 返回数据 2、Cookie和Session都是会话机制Cookie是客户端机制Session是服务端机制。二者通过SessionId来关联。Spring MVC 内置 HttpServletRequestHttpServletResponse两个对象。需要使用时直接在方法中添加对应参数即可Cookie和Session可以从HttpServletRequest中来获取也可以直接使用HttpServletResponse设置Http响应状态码。
ps本次的内容就到这里了如果对你有所帮助的话就请一键三连哦
本文的封面来自bilibili苏杉杉的pv侵权删 urlhttps://www.bilibili.com/video/BV1vo4y167eh/?spm_id_from333.999.0.0vd_source866da5be2ef0ddd213b053523da53138 ————————————————
电子签名上嘉路