截止目前,所有的新项目都优先推荐使用前后端分离的架构,在前端使用MVVM模式,后端使用分布式部署或者使用简单的MVC单体架构。
所以前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础。
核心思想是前端html页面通过axios或者ajax调用后端的restuful api接口并使用json数据进行交互。
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。
当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。(vue的专注就是在ViewModel 的设计上)
一句话总结:vm层(视图模型层)通过接口从后台m层(model层)请求数据,vm层继而和v(view层)实现数据的双向绑定。
ViewModel 是由前端开发人员组织生成和维护的视图数据层。在这一层,**前端开发者对从后端获取的 Model 数据进行转换处理,做二次封装,以生成符合 View 层使用预期的视图数据模型。**需要注意的是 ViewModel 所封装出来的数据模型包括视图的状态和行为两部分,而 Model 层的数据模型是只包含状态的,比如页面的这一块展示什么,那一块展示什么这些都属于视图状态(展示),而页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为(交互),视图状态和行为都封装在了 ViewModel 里。这样的封装使得 ViewModel 可以完整地去描述 View 层。由于实现了双向绑定,ViewModel 的内容会实时展现在 View 层,这是激动人心的,因为前端开发者再也不必低效又麻烦地通过操纵 DOM 去更新视图,MVVM 框架已经把最脏最累的一块做好了,我们开发者只需要处理和维护 ViewModel,更新数据视图就会自动得到相应更新,真正实现数据驱动开发。看到了吧,View 层展现的不是 Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与 Model 层交互,这就完全解耦了 View 层和 Model 层,这个解耦是至关重要的,它是前后端分离方案实施的重要一环。
以前的JavaWeb项目大多数都是java程序员,使用JSP技术是又当爹又当妈,又搞前端,又搞后端。
随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情。正所谓术业有专攻,一个人的时间毕竟是有限的,如果什么都会,那么他毕竟什么都不精。
大中型公司需要的是专业人才,小公司需要全才,但是对于个人职业发展来说,我建议是分开,开始阶段专功某一个方向,后期再去往全面发展。
把精力放在编程基础,设计模式,原理,源码,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构,弹性计算架构,微服务架构,性能优化,以及相关的项目管理等等。
目前后端追求的是:三高(高并发,高可用,高性能),安全,存储,业务等等。
所以分离对后端程序员来说绝对是好事!!!
把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,webpack,less/sass,gulp,nodejs,Google V8引擎,javascript多线程,模块化,面向切面编程,设计模式,浏览器兼容性,性能优化等等。
前端追求的是:页面表现,速度流畅,兼容性,用户体验等等。
术业有专攻,这样你的核心竞争力才会越来越高,正所谓你往生活中投入什么,生活就会反馈给你什么。并且两端的发展都越来越高深,你想什么都会,那你毕竟什么都不精。
通过将team分成前后端team,让两边的工程师更加专注各自的领域,独立治理,然后构建出一个全栈式的精益求精的team。
以前老的方式是:
1、产品经历/领导/客户提出需求
2、UI做出设计图
3、前端工程师做html页面
4、后端工程师将html页面套成jsp页面(前后端强依赖,后端必须要等前端的html做好才能套jsp。如果html发生变更,就更痛了,开发效率低)
5、集成出现问题
6、前端返工
7、后端返工
8、二次集成
9、集成成功
10、交付
新的方式是:
1、产品经历/领导/客户提出需求
2、UI做出设计图
3、前后端约定接口&数据&参数
4、前后端并行开发(无强依赖,可前后端并行开发,如果需求变求变更,只要接口&参数不变,就不用两边都修改代码,开发效率高)
5、前后端集成
6、前端页面调整
7、集成成功
8、交付
以前老的方式是:
1、客户端请求
2、服务端的servlet或controller接收请求(后端控制路由与渲染页面,整个项目开发的权重大部分在后端)
3、调用service,dao代码完成业务逻辑
4、返回jsp
5、jsp展现一些动态的代码
新的方式是:
1、浏览器发送请求
2、直接到达html页面(前端控制路由与渲染页面,整个项目开发的权重前移)
3、html页面负责调用服务端接口产生数据(通过ajax等等,后台返回json格式数据,json数据格式因为简洁高效而取代xml)
4、填充html,展现动态效果,在页面上进行解析并操作DOM。
大量并发浏览器请求—>web服务器集群(nginx)—>应用服务器集群(tomcat)—>文件/数据库/缓存/消息队列服务器集群
同时又可以玩分模块,还可以按业务拆成一个个的小集群,为后面的架构升级做准备。
1、可以实现真正的前后端解耦,前端服务器使用nginx。前端/WEB服务器放的是css,js,图片等等一系列静态资源(甚至你还可以css,js,图片等资源放到特定的文件服务器,例如阿里云的oss,并使用cdn加速),前端服务器负责控制页面引用&跳转&路由,前端页面异步调用后端的接口,后端/应用服务器使用tomcat(把tomcat想象成一个数据提供者),加快整体响应速度。(这里需要使用一些前端工程化的框架比如nodejs,react,router,react,redux,webpack)
2、发现bug,可以快速定位是谁的问题,不会出现互相踢皮球的现象。页面逻辑,跳转错误,浏览器兼容性问题,脚本错误,页面样式等问题,全部由前端工程师来负责。接口数据出错,数据没有提交成功,应答超时等问题,全部由后端工程师来解决。双方互不干扰,前端与后端是相亲相爱的一家人。
3、在大并发情况下,我可以同时水平扩展前后端服务器,比如淘宝的一个首页就需要2000+台前端服务器做集群来抗住日均多少亿+的日均pv。
4、减少后端服务器的并发/负载压力。除了接口以外的其他所有http请求全部转移到前端nginx上,接口的请求调用tomcat,nginx反向代理tomcat。且除了第一次页面请求外,浏览器会大量调用本地缓存。
5、即使后端服务暂时超时或者宕机了,前端页面也会正常访问,只不过数据刷不出来而已。
6、也许你也需要有微信相关的轻应用,那样你的接口完全可以共用,如果也有app相关的服务,那么只要通过一些代码重构,也可以大量复用接口,提升效率。(多端应用)
7、页面显示的东西再多也不怕,因为是异步加载。
8、nginx支持页面热部署,不用重启服务器,前端升级更无缝。
9、增加代码的维护性&易读性(前后端耦在一起的代码读起来相当费劲)。
10、提升开发效率,因为可以前后端并行开发,而不是像以前的强依赖。
11、在nginx中部署证书,外网使用https访问,并且只开放443和80端口,其他端口一律关闭(防止黑客端口扫描),内网使用http,性能和安全都有保障。
12、前端大量的组件代码得以复用,组件化,提升开发效率,抽出来!
命名管道的概述无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看《无名管道》)。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、FIFO 文件。命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够
到gitee网页-git全局配置栏复制两行代码到git bash的$后面输入 git config--list +回车完成操作后 git bash会显示自己个人的全局配置代码
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具。1、启动gdb使用vim编辑器编写一个简单的测试程序并保存:vim hello.c然后使用gcc将其编译为可执行文件,同时使用-g表示该程序可调试:gcc -g hello.c -o hello接下来启动gdb进行调试:gdb hello或gdb -q hello-q参数可以屏
问题与背景在深度学习的ubuntu环境中,装机之后一开始的环境配置,需要配置好显卡驱动、cuda、cudnn的兼容性,不能随意组合,否则会造成程序无法运行的问题。解决方案与实践显卡驱动和cuda,是可以捆绑安装的。因为cuda版本在发布的时候会跟某个版本的驱动做适配测试之后然后发布,只需要直接安装cuda的run包就可以直接把cuda和驱动安装好,cudnn用的时候需要注意与cuda的版本匹配,安装的过程比较简单,主要是解压之后,移动到cuda的目录。cuda 与 显卡驱动cuda的下载地址:ht
Faster RCNN翻译与解读Faster R-CNN: Towards Real-Time Object Detection with Region Proposal NetworksAbstract摘要1. Introduction1. 引言2. RELATED WORK3. FASTER R-CNN3. FASTER R-CNN3.1 Region Proposal Networks3.1...
1. 文档和资料搜集官方网站:https://www.iwiznet.cngithub:https://github.com/Wiznet官方网站可以找到所有和w5500相关的资料,包括最新的中英文版datasheet、基于各类常用平台的测试例程、应用指导等。github上有各类和w5500相关的代码库,包括驱动、socket api封装等。对我来说,只需要一个中文版的datasheet和一份github上down下来的名为ioLibrary_Driver的代码库即可。datasheet用中文对
计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。输入格式:输入的第一行给出一个正整
一、临时启用SSH服务1、通过SSH服务器的启动脚本文件启动SSH服务通过OpenSSH服务器的脚本文件“/etc/rc.d/init.d/sshd”启动SSH服务,命令执行如下。/etc/rc.d/init.d/sshd start命令执行后, SSH服务开始运行。2、使用Linux下的service命令启动SSH服务使用service命令启动SSH服务,命令执行如下。service sshd ...
概述 本人第一次接触FPGA的设计与开发,在老师的指导下完成EP3C25Q240的实验,耗时大概3个月,两个月从零开始做实验板,一个月调试板子上的SSRAM,虽然参考了altera的EP3C25F324开发板原理图,但是自己做这样一个板子还是碰到了许多许多问题。 调试程序过程更是让人经常抓狂,有些是由于自己初次制作经验不足导致的,有些也是由于百度上相关的资料不全甚至有些错误,本人不才一...
Android ADB超简单的安装方法2017年10月02日 10:34:18阅读数:24586 在Android TV开发中,我们会和APP开发一样使用到真机测试,而adb是一个特别的存在,因为它可以轻松的帮我连接到安卓设备。adb全称为Andorid Debug Bridge。adb全称Android Debug Bridge,用于与Android设备进行交互。ADB安装方法:方法...
/*====================================================程序功能:输入二叉树先序序列,输出先序,中序,后序序列作者:令狐荣豪完成日期:2019/5/19=====================================================*/#include<stdio.h>#include<st...
原因:没有关闭防火墙或者Tomcat的webapps文件夹下没有东西排查和解决启动Tomcat容器docker run -d -p 8888:8080 tomcat查看已经启动的容器docker ps使用8888端口访问Tomcat失败先查看防火墙状况service firewalld status如果防火墙没关闭,先关闭防火墙service firewalld stop防火墙关闭时,防火墙的状态如下确定防火墙关闭但访问Tomcat还是失败之后,使用如下