首先bai让我们坐着时光机回到n年前的web开发。
那个时候最早du都是静态的html页面,zhi后来有了数据库,有了所谓dao的动态页面,
然后程序猿在编码的时候,会把所有的代码都写在页面上,包括数据库连接,包括事务控制,接收参数,各种校验,各种逻辑,各种html/js/css代码等等
怎么样?够乱吧?像一坨那什么一样,这个页面可能有成千上万行?
那么好,问题来了,回头需要修改的时候,你怎么办?
你找个东西找半天,好不容易找到了,还不敢改,怕被其他地方用了,改出连带问题。
页面一出错,定位不准到底是哪里的问题,从头到尾的挨个排查。
等等等等。
这就是大家常说的什么叫可维护性,这也是为什么越来越多的公司的规范要求不能写复杂sql。
还记得之前在东软的时候,一哥们写了一个80多行的大sql来完成一个核心的查询。
试问这个大sql天天在数据库里run,还有性能可言?
再试问谁敢改?
后来项目要改需求还是出现bug了,那个sql要改动,写sql的哥们改了好久才改好,因为时间长他也忘了,
再后来他离职了。。。
有人问,那简单sql实现不了我的功能呀,怎么办?
从数据库设计层面开始下手,要允许适当的冗余,把表弄好,就迎刃而解了,这也是数据库层面的一种解耦吧。
后来。。。
进入第二阶段,大家痛定思痛,决定要把页面和逻辑拆开,页面只是负责显示,逻辑都在后台。
这就出现了短暂的,在jsp里使用标签调用bean的用法。bean里耦合了除了页面之外的所有东西。
再后来。。。
进入了第三阶段,大家又痛定思痛,决定要拆成三部分,就是大名鼎鼎的MVC。
再再后来。。。
衍生出来了类似于struts/springmvc等等的mvc框架
---------------
JavaWeb项目的层有2个维度。
第一个维度是MVC的三层:
M:model,模型层,包括了你的业务逻辑和数据库操作,封装好给视图层使用的。
V:view,视图层,仅仅做的是展示数据,不包含业务逻辑,主要是jsp/html等等
C:controller,控制层,负责接收请求,调用模型层处理业务逻辑并返回给视图层。
第二个维度是java代码里的三层:
controller:控制层,负责接收参数/解析参数/封装参数,调用serivce,将service方法的返回值进行封装(如果需要),返回数据/返回页面,路由。
service:负责业务逻辑,事务控制在这层里做,被controller调用,以及调用dao。
dao:持久层,负责数据库交互,被service调用。
这2个维度别弄混了哟。我今天主要说的是第二个维度的层哟。
我认为,第二个维度是第一个维度的延伸,其实第二个维度再加上一个表现层就完美了,这就为什么有人说是4层架构。
---------------
前戏结束,步入正题:
有些学生朋友可能会问为什么要分层呢?我本来可以在一个地方写完的东西,非要散落在各个层中,都在一起不是挺好的吗?
开发效率高呀~
跳来跳去的我脑子都晕啦。。。
这就是为什么有人会把所有的东西都扔在一个层里,比如controller层。。。
其实我们可以在jsp上把所有的逻辑以及数据库操作,数据展示全部写在一起,耦合在一起,这样开发起来貌似更快,
但是维护性非常差,有朝一日想改一个小地方,牵一发而动全一身,隐患很高,无法快速定位问题。
因此我们需要分层。
分层了之后,你理论上改了持久层的东西,逻辑层是不用变动的。
每个Dao类是跟每个表走,Dao的每个方法里就一个个的简单sql,不包含任何业务逻辑,可以被不同的service复用和调用。
经过抽象后基本上都是通用的,因而我们在定义DAO层的时候可以将相关的方法定义完毕,
这样的好处是在对Service进行扩展的时候不需要再对DAO层进行修改,提高了程序的可扩展性。
提高了程序的可扩展性。具体什么时候做这些操作,怎么做这些操作都由Service来处理。
(就像郭德纲的相声里的一句话:“行了,你甭管了”)
而Service则不是,一个Service里可以会调用多个不同的dao,完成特定的业务逻辑,事务控制,
封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性
同时,一个Service的方法也有可能被多个Controller的方法来调用。
逻辑出问题就在Service找问题,数据库,sql有问题就在Dao层找问题,
参数解析错误,跳转错误,就在Controller上找问题。
这样快速定位问题,互不干扰。
---------------
分层架构(这里会延伸到更广阔的架构):
回头项目玩大了,怎么办?拆!!!
具体可以搜一下:maven分模块开发,怎么玩代码依赖,怎么玩微服务,怎么玩SOA,怎么玩RPC,怎么玩dubbo。
web项目发展有几个阶段啊
第一个阶段(单一应用架构):
所有代码都耦合在一个项目里,放在一台服务器上,这种all in one的方式是有好处的。
创业初期,不用什么架构,走敏捷开发,最快速的实现需求才是王道。
你甭管我有多烂,我至少能跑起来,我至少能在外网上让你访问,让你使用。
当然了,初期的访问量很少,节省部署和运维成本才是王道呀。
听阿里的讲座,说淘宝的前期的版本用的就是一台PC机作为服务器,所有的功能耦合在一个项目里,
每次往生产环境上发版本,要上传一个600mb的包,呵呵。
第二个阶段(垂直应用架构):
哎哟,不错哦。自己的儿子被越来越多的人访问,访问量激增,一台服务器扛不住了,
没事,我们可以玩负载均衡,玩集群。
但是!这种性能加速度其实会变得越来越小,因为你的项目是耦合在一起的。
这时,我们需要拆分项目,这里又有2个维度,按层拆,按模块拆。
将拆好的不同项目分别部署在不同的服务器上,并且再分不同的小集群。
第三个阶段(分布式服务架构):
唉呀妈呀,访问量陡增,到这步你创业应该算成功了,开始烧投资人的钱了吧。
经过上面拆成了越来越多的模块,模块与模块交互越来越多,怎么办?
这个时候我们需要把核心的业务抽出来,作为独立的服务,慢慢发展成稳定的服务中心,
用来提升业务复用和整合。
就像阿里的大牛说过,没有淘宝的积累,天猫能那么快的出来吗?
这个时候,你的缓存,数据库,消息队列等服务都应该是分布式的。
第四个阶段(流动计算架构)
哎呀妈呀,访问量又上了一个台阶,翻了好几百倍吖,肿么办?
这个时候服务越来越多,一些容量和资源的浪费问题凸显出来,
这时我们需要一个调度中心来基于访问压力动态的管理集群容量,
提高利用率。
第五个阶段(云计算架构)
抱歉,作者正在学习中,未完待续。

转载于https://zhidao.baidu.com/question/2206388866156884028.html

为什么JavaWeb要分层的更多相关文章

  1. JavaWeb开发中的分层思想(一)

    JavaWeb开发分层思想(一) 一.认识DAO.Service.Controller层 DAO(Data Access Object) 1.直接看英文意思就是"数据访问对象",也 ...

  2. Javaweb学习笔记--分层设计

    在早期的JavaWeb应用中,JSP文件负责处理业务逻辑,控制网页流程并创建HTML页面,JSP文件是一个独立的,能自主完成所有任务的模块, 这带来了一系列问题:HTML代码和Java程序代码强耦合在 ...

  3. 为什么JavaWeb项目要分层

    首先让我们坐着时光机回到n年前的web开发.那个时候最早都是静态的html页面,后来有了数据库,有了所谓的动态页面,然后程序猿在编码的时候,会把所有的代码都写在页面上,包括数据库连接,包括事务控制,接 ...

  4. JavaWeb单体项目的分层设计与实现

    1.概述 为什么要把一个完整的项目(Project)按层拆分成多个模块(Module)? 1)使项目层次更加的清晰: 2)提高代码的复用性: 3)细化分工: 4)解耦. 是不是听起来很高大尚,今天就简 ...

  5. JavaWeb 分层设计、MVC

    M:Model,JavaBean. V:View,JSP. C:Controller,Servlet. Servlet: 接受用户请求,把请求参数封装为一个JavaBean,调用service来处理业 ...

  6. Eclipse/JavaWeb (一)三大框架之struts框架 持续更新中...

    最近主要把javaweb的三大框架过一遍. (一)发展历史 传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使得程序分为几层,有 ...

  7. JavaWeb:Web与HTTP协议简介

    JavaWeb:Web与HTTP协议简介 Web的概念 什么是Web: Web是网络上使用最广泛的分布式应用架构. 旨在共享分布在网络上的各个Web服务器中的所有互相连接的信息. 三个特征: 用HTM ...

  8. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  9. javascript面向对象分层思维

    js本身不是面向对象语言,在我们实际开发中其实很少用到面向对象思想,以前一直以为当要复用的时候才封装成对象,然而随着现在做的项目都后期测试阶段发现面向对象的作用不仅仅只是复用,可能你们会说面向对象还有 ...

随机推荐

  1. 在myeclipse里加大tomcat内存,jdk内存方法

    这是在myeclipse里加大的方法: -Xms4096m -Xmx4096m -XX:MaxNewSize=4096m -XX:MaxPermSize=4096m 如图所示: -XX:PermSiz ...

  2. 通过css实现表格的斜线

    效果图 实现思路 编辑一个svg文件,可以自定义线条颜色和粗细. 将svg文件转为base64格式,作为背景图属性设置. svg转base64的网址:https://www.sojson.com/im ...

  3. nim_duilib(4)之CheckBox

    introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 xml文件添加代码 基于上一篇, 继续向basic.xml中添加下面关于CheckBox的代码. xml完整源 ...

  4. c(++)可变参数之格式化字符串

    0.序言 使用printf函数,其参数就是可变参数.下面将使用 C语言  的库函数实现可变参数的函数 . 用途(欢迎补充): A.记录日志,可能需要将变量格式化输出到日志文件. B.格式化字符串,显示 ...

  5. 【LeetCode】452. Minimum Number of Arrows to Burst Balloons 解题报告(Python)

    [LeetCode]452. Minimum Number of Arrows to Burst Balloons 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https ...

  6. Interesting Fibonacci(hdu 2814)

    Interesting Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. hdu 1430 (BFS 康托展开 或 map )

    第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...

  8. 1119 - Pimp My Ride

    1119 - Pimp My Ride    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB To ...

  9. CS5263替代PS176|设计DP1.4转HDMI2.0音视频转换线方案|PS176方案

    PS176是一个显示端口 (DP)至HDMI 2.0视频接口转换器适用于需要视频协议转换的电缆适配器.电视接收器.监视器和其他应用.它将接受任何显示端口输入格式,包括DP 1.1a.dp1.2a.dp ...

  10. python爬虫实例——基于python实现有道云翻译接口

    # 分析包# 分析post请求中参数# 使用python模拟lts.sign.salt参数运算# 执行结果> > 1.按F12对网页进行分析,填写内容后自动翻译的功能一般是通过ajax实现 ...