为什么要用springspringMVC和Mybatis逐渐流行起来了

s2sh搭建java web项目的实例:&br&&a href=&///?target=http%3A///share/7616.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Mybatis+Struts2+Spring3环境搭建入门实例下载&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///share/7616.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/share/2310&/span&&span class=&invisible&&.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///share/3984.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&java S2SH项目框架整合搭建实例教程&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///share/3984.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/share/1787&/span&&span class=&invisible&&.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///share/1728.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&java S2SH项目框架Struts2.3+Spring3.1+Hibernate3.6框架搭建整合以及实例demo代码分享&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///share/1728.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/share/1757&/span&&span class=&invisible&&.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///share/3728.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&apache shiro+hibernate4+struts2+spring+easyui+fusioncharts+bootstrap后台权限管理系统搭建&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///share/3728.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/share/2047&/span&&span class=&invisible&&.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&spring mvc搭建java web项目的实例:&br&&a href=&///?target=http%3A///share/3584.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spring MVC入门框架搭建实现用户登录demo教程&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///share/3584.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/share/2279&/span&&span class=&invisible&&.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///share/0752.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&spring 3.0+spring MVC+Hibernate框架搭建教程(附:springMVC文件上传功能)&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///share/0752.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/share/2051&/span&&span class=&invisible&&.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///share/kspringmvc-p1-s1.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&搜索&springmvc&的分享列表&i class=&icon-external&&&/i&&/a&&a href=&///?target=http%3A///share/kspringmvc-p1-s1.htm& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/share/kspr&/span&&span class=&invisible&&ingmvc-p1-s1.htm&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&
s2sh搭建java web项目的实例:
Struts2 官方对于安全问题的处理让人担忧,竟然会直接演示攻击方法,多少个站长彻夜将自己的网站升级,如果不想再经历一次的话,似乎 springmvc 是个不错的选择。&br&然而 Hibernate 我估计是很多掌握不了其内部的逻辑,瞬时态,持久态,托管态,延时加载,事务边界,在加上对于SQL调优的不利因素,所以也渐渐的不流行了。
Struts2 官方对于安全问题的处理让人担忧,竟然会直接演示攻击方法,多少个站长彻夜将自己的网站升级,如果不想再经历一次的话,似乎 springmvc 是个不错的选择。 然而 Hibernate 我估计是很多掌握不了其内部的逻辑,瞬时态,持久态,托管态,延时加载,事…
REST和Structs,Spring,Hibernate之间没有直接关系.&br&REST是web开发的一种软件架构方式, 是基于web的三种主流web服务实现方式. 另外的两种为SOAP,XML-RPC&br&Structs,Spring,Hibernate是java的MVC框架.
REST和Structs,Spring,Hibernate之间没有直接关系. REST是web开发的一种软件架构方式, 是基于web的三种主流web服务实现方式. 另外的两种为SOAP,XML-RPC Structs,Spring,Hibernate是java的MVC框架.
SSH(Struts,Spring,Hibernate)是一种常用的Web开发的框架组合,其中Spring作为Ioc容器负责组装,Struts作为前端框架负责展示层逻辑(MVC),Hibernate负责数据的持久化。这三者都是开源框架,也是各自领域中有代表性的框架,三者结合起来是一种最佳实践。&br&&br&而REST是一个C/S(包含B/S)的 软件的架构模式,前端的C(或B)应该以什么样的方式,特别是在HTTP协议上通讯时,和后端的S打交道,形成清晰、容易理解的的交互。由于基于HTTP协议,因此服务端的程序通常跑在Web服务器上,但不一定是以Web方式展现的应用程序。&br&&br&使用SSH框架时,可以依循REST架构模式,以使软件有良好的架构。但是REST不限于 Web开发,特别是在网络服务的API方面,REST已经成为一种事实的标准,可以和Web Service协议栈一争高下。&br&&br&
SSH(Struts,Spring,Hibernate)是一种常用的Web开发的框架组合,其中Spring作为Ioc容器负责组装,Struts作为前端框架负责展示层逻辑(MVC),Hibernate负责数据的持久化。这三者都是开源框架,也是各自领域中有代表性的框架,三者结合起来是一种最佳实践…
我非常看重对新手理论知识的导航工作,在知乎呵呵级别序员愈发泛滥的今天,我是很苦恼的,为什么你们不好好学英文,为什么你们甘愿做伸手党,为什么你们对新知识这么恐惧,为什么你们只懂操作不懂理念(.which is sad .)&br&---------------------------------------------------&br&REST理念是对服务接口的抽象,它要革命的是对任意资源操作的规范化,它封装了资源的表述(状态)变化,对外提供让这些变化发生的方法,即url ,这样既不是传统死板的方法调用,又不是饱含深情的信息传递,完成了对资源与资源表述实现方式的两种封装,非常优雅的解耦方式,基于此概念之上的互联网http 就是目前最成功的软件通信协议(......),付出的代价之一是对url 的表述限制,当然这种代价由计算机为我们承担(which is so great),本质上REST 理念是面向对象的升级与深化。&br&-----------------------------------------------------&br&SSH是经典传统优秀的资源表述状态的实现方式,很多服务都可以被rest 接口封装对外调用,rest 内部可以不用ssh 实现,具体看实际项目了,上手的时候多抓住封装与映射两个概念的实现必定是手到擒来,实现基本不会有困难,是不是,多做几个demo 很快就上手了。&br&最重要的是理解rest 带来的通讯变化,我个人的观点是ioc 理念与orm 理念都是软件开发领域非常传统经典且成功的模型,带来生产力变化之深刻是深深吸引我研究这些软件开发模式与架构的重要原因。希望共识之士能并肩战斗而不是当互联网工人帮产品狗实现功能,完成他们的梦想,which is out of my business.&br&--------------------------------------------&br&这不是我想要的生活。&br&Which is to be continued.
我非常看重对新手理论知识的导航工作,在知乎呵呵级别序员愈发泛滥的今天,我是很苦恼的,为什么你们不好好学英文,为什么你们甘愿做伸手党,为什么你们对新知识这么恐惧,为什么你们只懂操作不懂理念(.which is sad .) ----------------------------------…
springmvc和struts是一个层次的概念,均属java web mvc框架,只是ssh中第2个s的技术。&br&springmvc开发比较轻,性能也不错,在我的开发的web项目中,均使用springmvc作为web mvc框架,用的久了就知道比struts2有多轻便了。&br&可以参考下我分享的代码:&br&&a href=&///?target=http%3A///share/8544.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&bootstrap+jquery+mustache+springmvc+idworker整合demo代码&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///share/6576.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&年末最代码部分源码大出血分享-freemarker,bootstrap,springdata jpa分页代码&i class=&icon-external&&&/i&&/a&
springmvc和struts是一个层次的概念,均属java web mvc框架,只是ssh中第2个s的技术。 springmvc开发比较轻,性能也不错,在我的开发的web项目中,均使用springmvc作为web mvc框架,用的久了就知道比struts2有多轻便了。 可以参考下我分享的代码:
其实Web开发中大部分时候我们碰到“卡”,网站相应慢时,不是语言效率问题,而是数据库处理不过来了,所以语言效率的损失不值一提,君不见那么多用PHP做电商的也没有抱怨过语言效率低过,就算是比PHP还慢的Python也照样有人用来写网站。&br&&br&Java牺牲执行效率提高程序员开发效率很正常。
其实Web开发中大部分时候我们碰到“卡”,网站相应慢时,不是语言效率问题,而是数据库处理不过来了,所以语言效率的损失不值一提,君不见那么多用PHP做电商的也没有抱怨过语言效率低过,就算是比PHP还慢的Python也照样有人用来写网站。 Java牺牲执行效率提…
缺点当然有,现在 Spring 越来越大,都开始使用 Gradle 构建了,支持的东西越来越多,这就导致大多数程序员对 Spring 的体系及结构都一知半解,网上乱七八糟的文章来回粘来粘去,搞得小码农都分不清楚到底哪种使用方式是对的,这归根到底就是因为&br&1. 对 Spring 的版本变更不清楚&br&2. 对 Spring 和 J2EE 规范的关系不清楚&br&3. 对 Spring 那堆配置和注解背后的原理不清楚&br&&br&你可能知道 DI 是个什么概念,但你可能不知道 DI 的正确使用方式:&br&1. 你也许不知道 Spring 有自己的测试体系,我们可以直接使用&br&2. Spring 的事务管理优越在哪里,和 Hibernate 自己的事务管理有啥区别,怎么配置才对。&br&3. Spring 为啥提倡非侵入式(non-invasive)设计,又是从哪个版本开始这么干的,起因是什么&br&4. Spring 那些注解的使用原理和适用场景是什么,哪些是Spring 自己的注解,哪些是 J2EE DI 的标准注解,使用哪个好,为什么好。&br&...........&br&&br&上述的一切,当你把 Spring 官方提供的 Spring Reference 看的差不多了,也就明白了,大概 500 多页吧。&br&&br&Spring 越来越大,衍生出其他的分支项目,虽然臃肿,但如果你知道如何筛选自己想要的功能,就不会臃肿,反而会很简洁,例如:&br&1. 你想实现 Rest 服务,那么 Spring MVC 就预置了这个功能,你没必要再去使用 CXF / Restlet 之类的 Rest 框架,还得忙着想怎么和 Spring 整合,这样,Struts 就出局了,Rest 框架也省了。&br&2. 你想实现权限功能,那么 Spring Security 可以替你搞定,你没必要使用 Apache Shiro 来做,也没必要苦逼地自己设计,而且人家还原生支持 OAuth 和 SAML&br&3. 你不想苦逼地写 DAO, 那么 Spring Data 可以替你做,这些 boilerplate code 全部替你实现了,而且对 JPA 或 NO-SQL 的支持也是相当方便。&br&4. 你无法忍受也无法记住 spring 的配置方式和配置逻辑,你只想专心写自己的业务代码而不愿关心工具到底如何配置,那么 SpringBoot 可以搞定一切。&br&...........&br&&br&其他的,还有很多很多,你只需要记住,是不是臃肿,很大程度上是由你的认知和使用能力决定的,不是框架本身,具体如何学习这个优秀的框架,建议:&br&1. 视频教程点到为止,不可全信,网上流传的课程,本身就有错误存在&br&2. 各种帖子看看就好,别拷过来自己完事&br&3. 有问题,先去查阅 Spring Reference,懂原理才能游刃有余&br&&br&&b&P.S&/b&&br&感谢知友提醒,修正答案&br&&ol&&li&Spring Roo 和 Spring Boot 都是 Spring 组件,没有演变关系&/li&&li&基于 SpringBoot 的 micro-service 架构目前在国外很流行,学习 SpringBoot 尤为必要&/li&&li&推荐使用 Spring Boot,选择 Spring Roo 还是 Spring Boot,引用一段话如下:&/li&&/ol&&a class=& wrap external& href=&///?target=http%3A///t/641269/Spring/Spring-Boot-Spring-Roo-Spring& target=&_blank& rel=&nofollow noreferrer&&Spring Boot, Spring Roo, Spring Framework (Spring forum at JavaRanch)&i class=&icon-external&&&/i&&/a&&div class=&highlight&&&pre&&code class=&language-text&&First, whether you use Spring Boot or Spring Roo, the reality is you're using
Spring. So to answer your question of whether you'd be able to use other
Spring Framework components...yes, absolutely. Again, Spring Boot *is*
Spring. Spring Roo *is* Spring. They're just different approaches to
simplifying Spring development.
Now, choosing between Spring Boot and Spring Roo. I was once a fan of Spring
Roo, but Spring Boot outshines it in so many ways. Spring Roo was big on code
generation and used aspects to perform some of its magic. It also forced you
into a design model that you may or may not feel comfortable with. Spring
Boot, on the other hand, uses no code generation and does not force any
particular design choice. It is primarily autoconfiguration saving you from
having to write a lot of common configuration yourself
In short...Go with Spring Boot. You won't regret it.
&/code&&/pre&&/div&&br&&b&我的其他回答:&/b&&ul&&li&&a href=&/question//answer/& class=&internal&&哪些企业或项目在用Spring boot,或者它会在多大程度上替代Spring? - Night Silent 的回答&/a&&br&&/li&&li&&a href=&/question//answer/& class=&internal&&会计转行从事IT,如何在一年时间内全职学习? - Night Silent 的回答&/a&&br&&/li&&li&&a href=&/question//answer/& class=&internal&&SpringDataJPA持久层问题? - Night Silent 的回答&/a&&br&&/li&&li&&a href=&/question//answer/& class=&internal&&spring4+hibernate4 事务管理 非常难受的问题 ? - Night Silent 的回答&/a&&br&&/li&&li&&a href=&/question//answer/& class=&internal&&spring 中为何存在import注解,同一个包中的类直接使用就行了 用import注解感觉有点怪? - Night Silent 的回答&/a&&br&&/li&&li&更多回答,请关注我,获取最新动态&/li&&li&如果此回答帮到了你,一个小小的赞,一次分享,都会让更多人受益&/li&&/ul&&br&此外,有兴趣的话,欢迎加入我的 &b&Java EE 自学群&/b&&br&&ul&&li&&b&一号群:(即将满额)&/b&:&a href=&///?target=http%3A///cgi-bin/qm/qr%3Fk%3DO_AAjKe3irM0TY6ayvKIrvtvEMNk9rTT& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&二维码页面&i class=&icon-external&&&/i&&/a& (二维码自动识别)&br&&/li&&li&二号群:(新群,限时免费加入): &a href=&///?target=http%3A///cgi-bin/qm/qr%3Fk%3DWUu4I0-EtyXlUysdvJ1juYlFiFnZY9wQ& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&二维码页面&i class=&icon-external&&&/i&&/a& (二维码自动识别)&br&&br&&/li&&/ul&如果觉得我的回答对你很有帮助,可以考虑微信打赏:&br&&p&&a href=&///?target=https%3A///f2f%3Ft%3DAQAAANljM%252FunWdckY8a%252Fz7m%252BeOE%253D& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&/f2f?&/span&&span class=&invisible&&t=AQAAANljM%2FunWdckY8a%2Fz7m%2BeOE%3D&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& (二维码自动识别)&/p&
缺点当然有,现在 Spring 越来越大,都开始使用 Gradle 构建了,支持的东西越来越多,这就导致大多数程序员对 Spring 的体系及结构都一知半解,网上乱七八糟的文章来回粘来粘去,搞得小码农都分不清楚到底哪种使用方式是对的,这归根到底就是因为 1. 对 Spr…
SSH框架一般指的是Struts、Spring、Hibernate,后来Struts2代替了Struts。最近5年,Struts2已经被Spring MVC代替,而Hibernate基本也被iBatis/MyBatis代替。&br&&br&所以你真正需要了解的是Spring,Spring你需要了解两个概念AOP和IOC,更进一步就是Spring的核心技术“动态代理”。&br&&br&持久层框架看看Hibernate/iBatis/MyBatis,研究一下Spring的数据库事务管理,各个持久层框架式如何实现ORM的,了解至少一种缓存框架,知道什么是数据库连接池。和数据库的交互最核心的不是ORM,而是掌握和数据库相关的能力,比如数据库编程、SQL优化、对范式的理解。&br&&br&MVC框架Struts2和Spring MVC,你需要知道他们在web.xml文件里配置了一些什么,Struts2/Spring MVC接到前台请求之后经过哪些步骤之后转到Action/Controller,return之后Struts2/Spring MVC又作了些什么。还有就是Filter、Listener和Struts2/Spring MVC的拦截器各有什么特点,适合处理什么样的问题。
SSH框架一般指的是Struts、Spring、Hibernate,后来Struts2代替了Struts。最近5年,Struts2已经被Spring MVC代替,而Hibernate基本也被iBatis/MyBatis代替。 所以你真正需要了解的是Spring,Spring你需要了解两个概念AOP和IOC,更进一步就是Spring的核心技…
授人以鱼不如授人以渔,使用框架是鱼,至于如何做到渔,不妨多看看源代码及其参考文档,理解作者的一片苦心(主要是设计模式的运用)。
授人以鱼不如授人以渔,使用框架是鱼,至于如何做到渔,不妨多看看源代码及其参考文档,理解作者的一片苦心(主要是设计模式的运用)。
已有帐号?
无法登录?
社交帐号登录
124 人关注
1171 人关注
113 条内容
6481 人关注
437 条内容java web的进化历程大致如下:&br&开始:servlet&br&因为标签解耦:jsp&br&因为页面数据解耦:jsp+javabean&br&因为控制层解耦:jsp+servlet+javabean&br&因为控制层共用:jsp+struts&br&因为解耦数据库:jsp+struts+hibernate&br&因为解耦控制层和数据层:jsp+struts+spring+hibernate&br&因为界面和控制层解耦:jsp+struts2+spring+hibernate&br&因为struts2安全问题:jsp+springmvc+spring+hibernate&br&因为mybatis更能适应业务复杂性:jsp+springmvc+spring+mybatis&br&........&br&整个过程前期主要推动因素解耦,后期两次是因为安全和业务复杂性要求。&br&hibernate其实也可以用于复杂业务复杂sql,性能也可以比较高,但是这样的话对技能要求就比较高。其实不管是hibernate还是mybatis,都可以直接获取数据库的connection,对于数据很大性能要求又高的部分,直接用jdbc来操作,也不用封装为pojo。&br&我们用ssm框架主要是可以解决我们90%的问题,学习比较简单,培训机构多,招人比较容易。&br&但是不好的地方就是用spring后性能不好,特别是写数据库多时跟jsp+servlet+javabean比差不多有10倍性能差距,内存消耗也特别大,在高性能高并发的情况下就有点难了。当然了说阿里也用这个框架,那是因为读的多写的少,而且大量缓存大量机器支持的。&br&就我本人来讲,不是很喜欢spring这一套,性能低外,报个异常都不能直接报出错位置。
java web的进化历程大致如下: 开始:servlet 因为标签解耦:jsp 因为页面数据解耦:jsp+javabean 因为控制层解耦:jsp+servlet+javabean 因为控制层共用:jsp+struts 因为解耦数据库:jsp+struts+hibernate 因为解耦控制层和数据层:jsp+struts+spring+hib…
&p&&b&其中包括&/b&&/p&&p&&b&一:基础阶段&/b&&/p&&p&&strong&1.1 &/strong&&strong&企业工具使用(&/strong&Editplus/Photoshop/SVN/GIT&strong&等)&/strong&&/p&&p&&strong&1.2 &/strong&&strong&零基础&/strong&&strong&JavaWeb&/strong&&strong&(&/strong&&strong&HTML/CSS&/strong&&strong&)&/strong&&/p&&p&Html标签讲解&/p&&p&HTML5常用标签(视频、音频播放等)&/p&&p&DIV+CSS3布局和特效&/p&&p&大型门户网站设计解决方案&/p&&p&&strong&1.3 APP&/strong&&strong&移动端开发(手机版)&/strong&&/p&&p&CSS3 + HTML5布局/Android&/p&&p&解决移动设备屏幕适应&/p&&p&&strong&1.4 &/strong&&strong&网站前台界面开发&/strong&&strong&-&/strong&&strong&项目实战目标&/strong&&/p&&p&天猫首页&/p&&p&小米官网&/p&&p&腾讯课堂官网&/p&&p&梦柯官网&/p&&p&落网&/p&&p&UI中国&/p&&p&个人博客系统&/p&&p&京东商城&/p&&p&&strong&1.5 &/strong&&strong&管理系统后台界面开发&/strong&&strong&-&/strong&&strong&项目实战&/strong&&/p&&br&&p&&strong&—&/strong&—从标签使用,到页面的布局,样式特效组合,最终多个项目实战演练,为什么要这么设置呢,众所周知,我们初学Java的阶段,是我们在学习Java过程中最枯燥的阶段,也是最容易放弃的一个阶段,如果我们在这学习的过程中,展现了自己的学习成果,了解了自己的学习潜力,并在学习中找到乐趣,你还会觉得枯燥无味吗?答案是:不会,于是,你就有了继续坚持学习下去的动力与兴趣源泉,不仅如此,这也是为了你过渡到中级阶段的前后端集合,打下了坚实的基础。同时,你又能拥有前端的一定基础,让你在职业的选择中又多了一条选择。从此知识体系网络设计中我们不免可以看得出,这确实是站在了学员的就业角度着想,并为学员的长远发展做出了精心的准备。&br&&/p&&p&&b&二:中级阶段&/b&&/p&&p&&strong&2.1 &/strong&&strong&企业工具使用(&/strong&Myeclipse/Tomcat/Navicat/PlSQL&strong&等)&/strong&&/p&&p&&strong&2.2 &/strong&&strong&掌握&/strong&&strong&Javascript&/strong&&/p&&p&Javascript 基础,常用对象的使用(Date,Array,window,document等)&/p&&p&JavaScript函数(回调、闭包)讲解&/p&&p&DOM操作(增、删、查、改)&/p&&p&Javascript封装(主要是针对于dom操作的封装)&/p&&p&Javascript 项目实战&/p&&p&&strong& 2.3 &/strong&&strong&掌握&/strong&&strong&JQuery&/strong&&strong&深入(&/strong&&strong&MKUI&/strong&&strong&类库&/strong&&strong&2.0-&/strong&&strong&项目实战)&/strong&&/p&&p&基础(语法、选择器、事件)&/p&&p&DOM操作(增、删、查、改)&/p&&p&特效和动画&/p&&p&Ajax&/p&&p&Jquery开源框架JqueryUI&/p&&p&MKUI类库(自定义插件)&/p&&p&&strong&2.4
JavaSE8&/strong&&/p&&p&Java编程基础&/p&&p&面向对象&/p&&p&类加载机制&/p&&p&数据结构(数组、链表、树)&/p&&p&JavaAPI&/p&&p&JavaSE7,8新特性&/p&&p&多线程&/p&&p&Java网络编程&/p&&p&GUI(awt,swing)&/p&&p&&strong&2.5 &/strong&&strong&掌握关系型数据库(MySql5.6/Oracle11G)&/strong&&/p&&p&数据库入门(基本介绍、常用命令等)&/p&&p&SQLyog、Native、PL\SQL工具的使用&/p&&p&表管理&/p&&p&数据操作(增、删、改、查(简单查询))&/p&&p&约束管理&/p&&p&数据查询(子查询、连接查询,分组,函数等用法)&/p&&p&游标、存储过程、函数、触发器、事务管理&/p&&p&Jdbc操作&/p&&p&Jdbc框架封装&/p&&p&&strong&2.6 &/strong&&strong&掌握基于Java Web技术的综合应用,完成项目实战开发&/strong&&/p&&p&&strong&剖析Ajax和JSON的异步处理&/strong&&/p&&p& Servlet讲解(web应用服务器介绍)&/p&&p& Servlet实现数据库数据的增删改查&/p&&p& Jsp入门&/p&&p& jsp底层原理分析&/p&&p& Jsp 指令、脚本、表达式、动作的使用&/p&&p& EL表达式&/p&&p& JSTL&/p&&p& MVC模式讲解&/p&&p& Ajax&/p&&p& 自定义标签库&/p&&p& FusionCharts&/p&&p& Log4j&/p&&p& Junit 4.0&/p&&p&&strong&2.7 &/strong&&strong&项目实战目标&/strong&&/p&&p&百度云盘Web版本、&/p&&p&个人财务管理系统、&/p&&p&学员管理系统、&/p&&p&个人博客系统----熟练的在项目中使用JavaScript/JQuery&/p&&p&&strong&----掌握最前沿的Java7,8 新特性&/strong&&/p&&p&&strong&----掌握关系型数据库基本操作以及数据库高级编程&/strong&&/p&&p&&strong&----多个JavaWeb项目综合实战强化,让你开发中得心应手&/strong&&/p&&p&从js/JQURY到关系型的数据库的熟练掌握,到这就已经能够独立的去开发一些指定的网站项目,这其中着重讲解了js,数据库,与jsp,js.jquery,说道数据库,数据库是每一个程序员必修的课程,因为在实际开发中,他们的占用比重非常大,如果说开发中有100分,那么java只有60分,其他的相关js/jquery,数据库可以占比能达到30分,所以,在架设过程中,如果要完整的独立开发,必须对这方面的知识重点看中,我们可以从该课程体系中看到,其对js/jquery的教学比重非常大。使得该知识体系的实用性非常广。最后,我们可以看看该知识体系中的项目实战目标,从中我们可以看出与线下中级课程中教授的,相较基础的聊天工具等功能相比,此结构要求已经符合多数企业开发中各种指定的基本要求了。没办法,如果连这个要求都达不到,找高薪水的工作肯定是相较困难的,毕竟现在IT技术的发展日新月异,你跟不上,就别怪被淘汰,因此不得不说,该知识体系的作者,对Java方面的研究有一定的造诣,最主要的是十分的了解目前大多数企业的技术要求,使得该知识体系在速成方面稍有成就,并能以此勉强的上任大型企业的开发。&br&&/p&&p&&b&三:高级阶段&/b&&/p&&p&&strong&3.1 &/strong&&strong&掌握框架底层核心技术&/strong&&/p&&p&JavaWeb3.0新特性&/p&&p&反射应用&/p&&p&注解(Annotation)应用&/p&&p&设计模式&/p&&p&&strong&3.2 &/strong&&strong&框架讲解&/strong&&/p&&p&&strong&最新技术:SpringBoot和Freemaker的剖析&/strong&&/p&&p&掌握Struts2(掌握原理、Struts2标签、OGNL、拦截器、国际化)&/p&&p&Hibernate4、MyBatis3&/p&&p&Spring4,Spring MVC&/p&&p&框架整合: SSH、SSM&/p&&p&WebService、SOAP/Rest/CORBA/SOA&/p&&p&&strong&3.3 &/strong&&strong&建模工具&/strong&&/p&&p&StarUML、Rational Rose、MindManager&/p&&p&&strong&3.4&/strong&&strong&统一建模语言UML&/strong&&/p&&p&&strong&3.5 &/strong&&strong&项目实战&/strong&&/p&&p&游戏网站的后台管理系统&/p&&p&积分管理系统&/p&&p&订单管理系统&/p&&p&企业人力资源管理系统&/p&&p&办公自动化&/p&&p&&strong&论坛个人博客管理系统&/strong&----这就不用说了,掌握Java的核心技术,对各类Java框架架构、高级技术、数据库设计都有更深入的了解。对Java各项技术的使用都能得心应手,在你公司开发中游刃有余。&/p&&p&总的来说,该知识体系贴近目前IT业的总体对技术的要求,完成后基本上能胜任现有的大型企业的开发,并游刃有余。&/p&&p&&b& 寄语&/b&&br&&/p&&p&好了,今天的解密就到这里了,&/p&&p&在这个知识大共享的互联网时代,&/p&&p&我也算是为自己贡献了一份微薄的力量了,&/p&&p&当然最主要的目的还是希望那些还在学习Java的同学,&/p&&p&能慢慢细化知识点,慢慢吸收的知识精髓,&/p&&p&利用前辈的脑细胞和汗水做铺垫,快速的提升自己。&/p&
其中包括一:基础阶段1.1 企业工具使用(Editplus/Photoshop/SVN/GIT等)1.2 零基础JavaWeb(HTML/CSS)Html标签讲解HTML5常用标签(视频、音频播放等)DIV+CSS3布局和特效大型门户网站设计解决方案1.3 APP移动端开发(手机版)CSS3 + HTML5布局/Android解决…
&img src=&/v2-1f893c3bd7bb6fe6c5a148_b.jpg& data-rawwidth=&1918& data-rawheight=&932& class=&origin_image zh-lightbox-thumb& width=&1918& data-original=&/v2-1f893c3bd7bb6fe6c5a148_r.jpg&&&h2&&b&一、前言&/b&&/h2&&p&&b&首先声明一点,连开发者工具都不愿意用的,觉得自学是在浪费时间的就不需要往下看了,这是在浪费你们的时间。&/b&&/p&&p&我从来不相信什么所谓的那些培训机构打着牛逼哄哄的旗号,包XX,在我看来唯一能使自己前端功力出神入化的从来都只有自学。&/p&&br&&p&进入正题,一般来说前端是由HTML、CSS、JS三门作用互不相同的语言所组成,在这篇文章里,我只给大家分享和HTML、CSS相关的内容,所以非常适合前端初学者的入门学习和快速建立自己的成就感,读了这篇文章,你完全可以抛弃去培训机构报名的这种送钱的想法。&/p&想成为高手就应当拥有适当自学能力和自学方法,本文所分享的正是一种快速的自我学习的方法,但并不能帮助你系统性的学习到前端的知识,不过学了这种方法之后,肯定能够帮助你快速的掌握离散性的专业知识以便如后总结提炼成系统性的知识。&h2&&b&二、前端编码的专业性。&/b&&/h2&&p&初学者编写的网页代码往往都不是很专业,那我们如何判断某个人写的网页是不是专业的?主要是从下几个方面来进行判断:&/p&&ol&&li&&b&静态文件、资源的命名方式。&/b&&br&&/li&&li&&b&HTML标签的使用场景(是否充分利用语义化)。&/b&&br&&/li&&li&&b&HTML属性的使用场景(是否充分使利用)。&/b&&/li&&li&&b&CSS3伪类使用场景(是否充分利用)。&/b&&/li&&li&&b&是否做到尽量不使用Style属性(内联样式)。&/b&&/li&&li&&b&CSS类名、属性ID&/b&&b&的命名方式。&/b&&/li&&/ol&&p&为什么编写一个网页会有如此繁杂的要求呢?通俗点来说html网页的代码编写之后有两个作用,第一个作用是给计算机看,第二个作用是给人类看,人类为了能够既方便计算机看又方面人类看所以设计出了这么一套不成文的&潜规则&。&/p&&h2&&b&三、如何学习编写专业的代码?&/b&&/h2&&p&都说实践出真知,在这里,我教给大家一个非常简单的快速且有效的办法,由于web前端所使用语言不同于其他编程语言,web前端所使用语言的类型是客户端解释型语言,所以我们可以从大量的大型网站源码中学到我们想要学到的专业知识,从这些大型网站的源代码中我们可以看到:&/p&&ol&&li&html源码文件的代码结构,头部放置哪些内容,身体放置哪些内容,底部放置哪些内容。&br&&/li&&li&静态文件、资源文件的命名方式。&br&&/li&&li&html属性的使用场景,为什么这样使用,在这里使用有什么好处。&/li&&li&css属性的使用方式,css可以控制哪些事情,可以改变哪些事情。&/li&&li&css类名、属性ID的命名方式,所使用的哪些单词,为什么要使用这些单词。&/li&&/ol&&h2&&b&四、举例分析,某些特殊的布局是如何做到的?&/b&&/h2&&p&我们以 知乎网的&b&顶部导航&/b& 来举例分析,作为一个初学者,如果我们要实现知乎顶部的导航,我们思考一下应该如何实现,有多少种不同的实现方法。&/p&&p&在作为一个初学者在完全不知道如何实现的情况下,我们可以立马打开chrome浏览器,使用审查元素的方式,定位到知乎网顶部的导航的源代码,如图所示:&/p&&p&&img src=&/v2-04be22ef47a489f3d44d9bdc3760b5bc_b.png& data-rawwidth=&1919& data-rawheight=&638& class=&origin_image zh-lightbox-thumb& width=&1919& data-original=&/v2-04be22ef47a489f3d44d9bdc3760b5bc_r.png&&在这个图的源码里,我们可以学到大量的信息,我给大家列举如下:&/p&&ol&&li&导航的最外层标签是 &div& &br&&/li&&li&最外层标签存在role属性&br&&/li&&li&role属性值中所使用的单词&br&&/li&&li&class属性值中所使用的命名方式 : zu-top&b&(xx-xx)&/b&。&/li&&li&zu-top 类中所编写的 css 代码,得到的CSS代码我们可以通过CSS手册查询到相关的功能。&/li&&/ol&&p&接下来,我们看第二层结构,鼠标点击第二层DIV,如图所示:&/p&&p&&img src=&/v2-d20199edda4f_b.png& data-rawwidth=&1920& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-d20199edda4f_r.png&&在第二层的源码里,我们可以学到更多的东西,这里就不再举例CSS了,有:&/p&&ol&&li&a标签作为logo的使用方式。&br&&/li&&li&id属性值里的命名方式。&br&&/li&&li&ul、li标签的组合使用方式以及场景。.&/li&&li&span标签的使用方式以及场景。&/li&&li&button标签使用方式以及场景。&/li&&li&img标签使用方式以及场景。&/li&&li&form、input的标签的组合方式以及使用场景。&/li&&/ol&&p&剩下的结构我们也可以通过依次展开的方式来学习到更多的信息,我在这里就不往下继续分析了。&/p&&p&在自学的过程中,主要注意的是,遇到陌生的HTML标签、CSS属性要学会查询手册,再配合chrome浏览器强大的调试工具,我们可以实打实的看见css的某个属性的具体作用,我们可以在右侧的css代码面板中,点击css属性前面的单选框按钮来分析该css属性所描述的效果,再配合手册的解释,我们就完全可以掌握这个属性的作用和使用场景。&/p&&p&再举例,比如知乎顶部的导航是永远固定的,不会因为页面向下滚动而被隐藏掉,这个是如何实现的呢?&/p&&p&我们可以观察导航最外层的DIV的 zu-top 类,
zu-top 类的css代码如下:&/p&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&nc&&.zu-top&/span& &span class=&p&&{&/span&
&span class=&nb&&position&/span&&span class=&o&&:&/span& &span class=&nb&&fixed&/span&&span class=&p&&;&/span&
&span class=&nb&&top&/span&&span class=&o&&:&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&nb&&left&/span&&span class=&o&&:&/span& &span class=&m&&0&/span&&span class=&p&&;&/span&
&span class=&nb&&z-index&/span&&span class=&o&&:&/span& &span class=&m&&20&/span&&span class=&p&&;&/span&
&span class=&nb&&width&/span&&span class=&o&&:&/span& &span class=&m&&100%&/span&&span class=&p&&;&/span&
&span class=&nb&&height&/span&&span class=&o&&:&/span& &span class=&m&&45px&/span&&span class=&p&&;&/span&
&span class=&nb&&background&/span&&span class=&o&&:&/span& &span class=&m&&#0767c8&/span&&span class=&p&&;&/span&
&span class=&nb&&background&/span&&span class=&o&&:&/span& &span class=&o&&-&/span&&span class=&n&&webkit&/span&&span class=&o&&-&/span&&span class=&n&&linear&/span&&span class=&o&&-&/span&&span class=&n&&gradient&/span&&span class=&p&&(&/span&&span class=&nb&&top&/span&&span class=&o&&,&/span&&span class=&m&&#086ed5&/span&&span class=&o&&,&/span&&span class=&m&&#055db5&/span&&span class=&p&&);&/span&
&span class=&nb&&background&/span&&span class=&o&&:&/span& &span class=&n&&linear&/span&&span class=&o&&-&/span&&span class=&n&&gradient&/span&&span class=&p&&(&/span&&span class=&n&&to&/span& &span class=&nb&&bottom&/span&&span class=&o&&,&/span&&span class=&m&&#086ed5&/span&&span class=&o&&,&/span&&span class=&m&&#055db5&/span&&span class=&p&&);&/span&
&span class=&nb&&border-bottom&/span&&span class=&o&&:&/span& &span class=&m&&1px&/span& &span class=&nb&&solid&/span& &span class=&m&&#044e97&/span&&span class=&p&&;&/span&
&span class=&n&&box&/span&&span class=&o&&-&/span&&span class=&n&&shadow&/span&&span class=&o&&:&/span& &span class=&m&&0&/span& &span class=&m&&1px&/span& &span class=&m&&2px&/span& &span class=&n&&rgba&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&o&&,&/span&&span class=&m&&0&/span&&span class=&o&&,&/span&&span class=&m&&0&/span&&span class=&o&&,.&/span&&span class=&m&&25&/span&&span class=&p&&)&/span&&span class=&o&&,&/span& &span class=&nb&&inset&/span& &span class=&m&&0&/span& &span class=&m&&1px&/span& &span class=&m&&0&/span& &span class=&n&&rgba&/span&&span class=&p&&(&/span&&span class=&m&&255&/span&&span class=&o&&,&/span&&span class=&m&&255&/span&&span class=&o&&,&/span&&span class=&m&&255&/span&&span class=&o&&,.&/span&&span class=&m&&15&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&通过点击chrome调试工具css面板中css属性前面的单选框,我们可以分析出每一个属性的具体作用。&/p&&p&通过分析我们可以得知,使用的是什么样的CSS代码才导致了导航可以固定不动,并且永远在文字和其他DIV的最上层:&/p&&div class=&highlight&&&pre&&code class=&language-css&&&span&&/span&&span class=&nt&&position&/span&&span class=&o&&:&/span& &span class=&nt&&fixed&/span&&span class=&o&&;&/span& &span class=&c&&/* 首先这个属性表示了该DIV为绝对定位,也就是固定不动的基础 */&/span&
&span class=&nt&&top&/span&&span class=&o&&:&/span& &span class=&nt&&0&/span&&span class=&o&&;&/span& &span class=&c&&/* 有了绝对定位之后,我们再修正该DIV的Y轴的值为最顶部,也就是0 */&/span&
&span class=&nt&&left&/span&&span class=&o&&:&/span& &span class=&nt&&0&/span&&span class=&o&&;&/span& &span class=&c&&/* 有了绝对定位之后,我们再修正该DIV的X轴的值为最左边,也就是0 */&/span&
&span class=&nt&&z-index&/span&&span class=&o&&:&/span& &span class=&nt&&20&/span&&span class=&o&&;&/span& &span class=&c&&/* 为绝对定位且修正了X、Y以后,使用该属性可以使DIV处于所有元素的最上层 */&/span&
&/code&&/pre&&/div&&p&以上CSS代码缺少任何一行都无法实现现在的知乎导航的固定效果。&/p&&h2&&b&五、总结&/b&&/h2&&p&通过本文所分享的分析和自学的方法,你完全可以自己实现一整套知乎的前端UI,完全不必通过学习大量的教程视频,阅读大量的前端文章之后才能再去实现,对于初学者来说,这个过程可能是相当幸苦的,因为这是一个重量级的扫盲过程。&/p&&br&&p&有朝一日,当你实现了一整套和知乎一模一样的UI之后,在HTML、CSS这两个领域中,你也就和现知乎前端工程师的水平不相上下了,甚至你可以提出改进的建议,&b&不过我要强调的一点是,成为那样水平所花费的时间长短,完全取决于你自己的毅力和兴趣程度,你完全可以极短的时间之内分析完并且学到知乎所有的页面。&/b&&/p&&p&至此所有分析方法都已分享完毕,祝大家学有所成、学以致用。&/p&
一、前言首先声明一点,连开发者工具都不愿意用的,觉得自学是在浪费时间的就不需要往下看了,这是在浪费你们的时间。我从来不相信什么所谓的那些培训机构打着牛逼哄哄的旗号,包XX,在我看来唯一能使自己前端功力出神入化的从来都只有自学。 进入正题,一…
&img src=&/v2-898f02bc877eba01c599_b.jpg& data-rawwidth=&1889& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1889& data-original=&/v2-898f02bc877eba01c599_r.jpg&&眼下说起前端,框架无疑是最热门的话题。&p&没用过个react vue啥的出去都不好意思说自己是做前端的。&/p&&p&但,我们在选择框架的时候,是否&b&基于业务&/b&充分考虑到为什么我们选择了一个框架?&/p&&br&&br&&p&半年前,差不多是2016年中的样子,我跳槽到了一家电商公司做前端。&/p&&p&当时新东家的技术团队经历了大换血,老大提出了要做前后台分离的需求。&/p&&p&之前我只是一个菜鸡页面仔,所做过的工作仅为&a href=&/?target=http%3A//asp.net& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&asp.net&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&里画好样式,用jQuery做逻辑操作,也不知道自己做的是服务端渲染。&/p&&p&要扛起前后端分离的工作明显是有困难的。&/p&&p&之间的一段时间里,我尝试了网红的react与vue,且向做前端同学&a href=&/people/af7e0a6b617bec7cf10dd& data-hash=&af7e0a6b617bec7cf10dd& class=&member_mention& data-editable=&true& data-title=&@ywthoho& data-hovercard=&p$b$af7e0a6b617bec7cf10dd&&@ywthoho&/a&取经(在这之前根本都没听说过react什么的,唉~-_-!),脑子里有了展开这项工作的大致构思。&/p&&br&&br&&p&第一,我需要一个框架,原因为:&/p&&p&1、将以往基于java spring的后端渲染移植为前端渲染;&/p&&p&2、以往基于jQuery的页面逻辑维护起来相当吃力,对团队开发协作很不友好,且随着项目逻辑的复杂化存在着性能方面的问题;&/p&&p&3、公司的一部分业务场景适用作SPA。&/p&&br&&br&&p&第二,选择哪一款框架。&/p&&p&当时的场景为react已打下半壁江山,vue因vue-router的发布大放光彩。&/p&&p&最终的选择是react,原因为:&/p&&p&1、vue透露出vue2.0正在进行中,彼时采用vue将来必定会面对迁徙的问题;&/p&&p&2、当时react社区非常成熟,而vue的社区生态相形见绌,团队中也没有其他同事在之前进行过相关框架的使用,考虑到开发过程中问题的发现与排查react还是更为妥当;&/p&&p&3、相对于vue略高于react的性能优势(当时vue还没有virtual dom),react在做好性能优化的时候是足以满足我们的需求的。&/p&&br&&br&&p&以上,在当时的需求下我为什么选择了一个前端框架。&/p&&br&&br&&p&时过半年,业务已经非常稳定,但反观现在的架构还是存在很多问题的。&/p&&p&首先,框架的采用还是要基于业务需求的,忌不能一概而论。很多场景下,譬如仅仅需要返回一个状态页面,一些需要seo的业务,显然后段渲染是更好的解决方式。&/p&&p&本想着引入react可以在很多业务场景中采用spa,但真正到了做的时候才发现适用于spa的业务场景屈指可数,且不说spa还将带来bundle size过大的问题(可以使用code splitting)。&/p&&p&其次,后端做路由前端渲染,怎么感觉也是绕了一圈。。(node的BFF也刚提上日程。。)&/p&&p&并且,在使用react后前端逻辑完全对后端透明,接口的协定就变的至关重要,每一次业务迭代时伴随的接口文档是必须的。&/p&&p&。。&/p&&p&在目前的业务中,我们也是在选择性的使用框架(譬如抢购之类的页面还是后端渲染来完成)。&/p&&p&最好的技术选型,还是要由业务需求来决定。&/p&
眼下说起前端,框架无疑是最热门的话题。没用过个react vue啥的出去都不好意思说自己是做前端的。但,我们在选择框架的时候,是否基于业务充分考虑到为什么我们选择了一个框架? 半年前,差不多是2016年中的样子,我跳槽到了一家电商公司做前端。当时新东家…
&p&很多人觉得,前后端的差异主要是分别承载了数据和样式,功能和皮肤。前端就是视觉方面的,后端是实质性的。追溯到很多年前,确实是这样的,所谓的前端只是由于后端MVC中的View过于复杂,为了提升用户体验,提高加载速度,以及降低服务器压力,所衍生出的一些优化技术。&br&&/p&&p&&b&前端框架演进&/b&&/p&&p&最初前端没有架构,也不需要。但随着UI交互的复杂度激增,我们发现API提供的数据仍然需要进行处理,再进行渲染,而分离这些需要处理的数据和视觉渲染部分后又需要一层进行控制,自然而然,将后端的MVC照搬了过来。但其实人们并没有发现,并不是我们把MVC搬到了前端,而是把后端的V搬到前端之后又分成了MVC,这个问题暂且搁下,后面会解释。&/p&&p&接着前端又再一次的变得复杂,尤其是不同交互对于同一资源的操作,导致过程化的控制器过于臃肿,而不堪重负,MVVM应运而生。人们都以为,MVVM就是把C变成了ViewModel,但是ViewModel是一个实体,如何控制呢?真正用会MVVM的开发者都会发现,MVVM提倡的是定义而不是控制,定义M和V的关系,什么样的Model应该呈现什么样的View,然后一切自然而然的随着用户的行为去改变。&/p&&p&其实原先的C被更高度的抽象了,变成了框架的一部分,读取M和V的关系,并监听他们,在一方改变的时候根据关系修改另一方,达到双向绑定。而ViewModel其实是为了描述这一关系而抽象出来的Model,因为它是相对于Model更偏向View的,所以叫ViewModel。接着出现的一系列MVWhatever很好的说明了ViewModel并不是C变的,人们以为既然C可以变成VM,那也可以变成别的。殊不知,ViewModel也是一种Model,它是由View分裂出来的,而View只能分裂出Model和View,不会出现别的。&/p&&p&&b&样式和数据的区别&/b&&br&&/p&&p&React横空出世,却没有人能说清楚它到底是MV什么,甚至许多人搞不清M在哪,最后干脆说React就是个View。那么React到底是什么架构呢?先别急,我想先讲一个故事:&/p&&blockquote&&p&有一个语言学者提出一个观点 - 法国人的数学很烂,为什么呢?因为法语中的quatre-vingt(80)的意思是 4个20,居然都不会把4乘以20计算出来,是不是数学很差?&/p&&/blockquote&&p&第一次听到这个故事,我感到很好笑,难道汉语就不是这样了吗?我们叫做“八十”,其实还是8个10,和4个20有什么区别,还不是都没有计算。后来再一想,不仅不是,而且法国人数学应该很好,因为汉语遵循了现代通用的10进制,而法语是20进制和10进制混合的,所以他们大脑可以自然的映射10进制和20进制,就好比是左撇子为了迎合右撇子的世界而变得思维敏捷一样的道理。&/p&&p&讲到这里,可能你会觉得莫名其妙,这跟前端有什么关系。其实我只是想说明一个道理,我们经常会被一瞬间的思考误导,比如这个故事中,人们会把习惯的“八十”看做是一个独立的东西,而嘲笑法国人他们的“quatre-vingt”,其实我们只是习惯了这种计算,或者说在大脑中建立了映射,就忽略了计算,而将其看做一个整体。由此说明,我们在看到一个信息的时候是会进行无意识计算的,从而你会认为你看到的就是那个东西本身,并不需要计算。我们认为‘八十’是一个对象,而不是表达式,但事实是没有符号可以表达80这个数,所以用‘八个十’的表达式来表示,只不过我们太熟练所以自动计算了。&/p&&p&抛弃固有思维,现在假设@为81进制数的最大数,既80,再假设有一种操作符可以把十进制变成81进制数,这一过程是不是数据的计算?但如果有一种字体格式可以把连在一起的8和0两个数字变成@的样子,这算不算样式的改变?也许你会觉得通过操作符是在计算机中当做了@,而字体只是长得像,但计算机真正认识的只有可能是二进制binary,所以整个过程是不是也可以看做都是样式?还有人会说,数据无论变成什么样式它本身都不会变,而样式会变。但如果显示器有色差呢,你看到的蓝色就真的是蓝色吗?样式没变,你看到的仍然会变。&/p&&p&其实数据和样式本质没有区别,区别只在于程度,从计算机到人类的理解程度。差异来自于我们自己,我们把难以理解的叫数据,容易理解的叫样式,计算时间长的叫数据,计算时间短的叫样式。一个矩形你知道是样式,一个长xx,宽xx,边框为xx的东西你会以为是数据,但对于程序来说其实是一样的。处理一下,得到另一种形式的等同的东西,这就是一个不断翻译的过程,从二进制翻译到人类语言,甚至到非语言的一种印象,比如视觉,语音,甚至意识。无论是什么,都是让人类更容易理解。&/p&&p&&b&Component架构&/b&&/p&&p&耗费了这么大的篇幅说明样式和数据没有区别的目的其实是为了解释React的架构。前面说到的MVC和MVVM其实都是对于View的一种演进,因为所谓View才是最复杂的,为什么说所谓呢,基于前面的结论,View就是Model,但它是人们难以理解的部分,所以没有被抽象为Model,而是直接显示出来让用户自己去读。为了便于理解,想象一种极端的情况,Model只有二进制形式,直接显示给了用户,理论上来说,用户是可以看懂的,只是难度高了一点点。而从View抽象成Model的过程,其实就是程序将二进制翻译出来的过程。而框架的所做的改进就是翻译程度的提升,让用户更容易的读取。&/p&&p&回到React身上,它的架构就十分清晰了,前面的MVC是把后端的View分离出了一部分Model,而MVVM,是把MVC的V又分离了一部分Model出来。React所做的犹如它的版本号一般,直接起飞,每个Component其实都是View分离出来的Model,理论上来说,你能抽象出无限层Component,这个极限上,View已经简单的没有意义了。而实际来说,你可以视项目情况而定,把View抽象到某个程度后扔给用户自己阅读。而由于分成无数层,M到V的过程也变得简单,不再需要控制,因为复杂的计算已经被分解成了极简单的计算分散到每一层中了,甚至有时候仅仅是Component为传入的props加上一些字面量,然后传入另一个Component,或者是分解或组合成Object再向下传递。一旦真的理解了View即是Model的思想,你就会发现,React似乎什么也没做,其实却把什么都做了,而且非常简单。&/p&&p&但Component这种架构也有其问题所在,那就是太过于松散,对架构设计的要求比较高。一旦你并非基于由机器到人类的理解程度来抽象分层你的Component,其复用性和扩展性就会大大降低。&/p&&b&前端面向对象&/b&&p&前面说到了View和Model没有本质上的区别,那么前端架构和后端架构为什么会有区别呢?原因很简单,后端可以把未翻译完的数据丢给前端,但前端不能随随便便丢给用户,所以前端变成了多层MV,而不是后端简单的分为了一层MV。前端面向对象的设计也更加的困难,尤其是拥有多年后端开发经验的开发人员,更容易误导自己,因为在后端翻译完成的东西,在前端就变成了最原始的东西。&/p&&p&举个例子,就拿最常见的电商说事吧,设计一个商品页面的Component架构。在拥有所谓数据的时候,它是某一个商品的页面,比如一件印着国旗的T恤。但显然我们的代码库在运行之前是没有这个从数据库传过来的数据的,所以我们没法把它抽象成一个叫做NationalFlagTShirtPage的Component的。退而求其次,在失去后端数据之后,它应该是一个衣服类的商品页面,比如有一些尺码对照和试衣功能,所以可以有一个叫做ClothesShowcase的Component。说到后端数据的这一层,并不是为了搞笑,它反映出了一个问题。其实后端对于前端,就是上一层的Component。同理,在下一层的Component中,我们也应该忽视这一层传入到下一层的数据,因为它不应该有这个数据。&/p&&p&比如ClothesPage还应该包含一个显示图片的区域,和一个显示尺码信息的区域。这时,很多人会在ClothesShowcase的里面再放一个ClothesImage和ClothesInformation,但是在上一层作为代码一部分的'Clothes',在这一层应该已经被忽略,我们应该放入ProductImage和SizeInformation。只有当ClothesPage调用SizeInformation并传入'S','M','L'之类衣服尺码作为参数的时候,它才是衣服尺寸,而它自身应该仅仅是尺寸信息的Component。我们会发现,上一层的代码(字面量'L'等),变成了下一层的数据,如此一直下去,所有的特性都会变成数据,而代码,可能仅仅是一些最基础的元素,比如按钮,方框之类的,甚至是HTML本身。&/p&&p&如果一直使用对于后端来说的数据层面的'clothes'的话,就只能一次把ClothesPage这个Component写好,而没法继续抽象了。而其子Component可能仅仅是由于过于臃肿而强行分割的patial了。这样做除了代码短一些之外,完全不具有复用性和扩展性,因为ClothesPage下的所有Component都只能为Clothes服务了。而其他每个概念都必须把这一切重复一遍。&/p&&p&如果走入另一种极端呢,抽象出一种万用Component,只要传入一个大而全的object,就可以渲染出任意的页面。这个时候虽然复用性有了,但是你会发现你什么也没做,因为这个Component就是HTML的另一层封装,那些传入的参数包含了所有数据,你需要把这些不同的数据同化。&/p&&p&归根结底,Component架构的精髓在于多层,按照人类理解程度分层。否则永远无法分清楚什么是数据,什么是样式,因为它们只会在某一层中有划分。混乱的分层只会导致架构回归到传统的MVC两层结构中去。也因此,前端面向对象必须基于一层,脱离了某一层而论对象或类,都是可笑的,一个类,到了下一层可能就是一个实例。&/p&
很多人觉得,前后端的差异主要是分别承载了数据和样式,功能和皮肤。前端就是视觉方面的,后端是实质性的。追溯到很多年前,确实是这样的,所谓的前端只是由于后端MVC中的View过于复杂,为了提升用户体验,提高加载速度,以及降低服务器压力,所衍生出的一…
几年前,还是痴迷java的那会儿,我也曾纠结于前端框架的选择。试图找出一套一劳永逸的前端框架继承到项目架构中。搜遍全网得出以下结论:&br&&br&&b&各大前端框架可以按照“封装度”的标准来区分。&/b&&br&&br&设计刚出的一套网页皮肤,封装度为0。层层封装到可以直接用后台语言写页面,封装度为10。那么我是这样来区分前端框架的。&br&&br&&b&&i&1级——纯html+css&/i&&/b&&br&放5年前,基本就是用Dreamweaver刚排出来的页面或者网页查看源代码扒下来的皮肤。不涉及到js,就是纯页面皮肤。&br&--------------------------------&br&&b&&i&2级—— bootstrap系列&/i&&/b&&br&bootstrap的出现是一个里程碑事件。发源于twitter,引入了不少html5/css3的特性。由于它对响应式的支持以及良好的体验,给人一种耳目一新的感觉。其源码,不管是css还是js都值得学习一下,看后经常会有“原来还可以这样做”这种恍然大悟的感觉。不过归根结底是一套ui皮肤+少量js组成的框架,属于封装度偏低的框架。经典页面大概是这样:&br&&img src=&/e74fd323fad008bcea24_b.png& data-rawwidth=&1021& data-rawheight=&840& class=&origin_image zh-lightbox-thumb& width=&1021& data-original=&/e74fd323fad008bcea24_r.png&&&br&--------------------------------&br&&b&&i&3~4级—— metronic/adminLTE系列&/i&&/b&&br&基于bootstrap或者其他1级框架,然后集成了各种jQuery插件、富文本编辑器等js库,组成的一个大杂烩工具包和案例库。皮肤基本是基于bootstrap自定义的一套主题。案例比较详尽,开发的时候找到需要的组件把前端代码复制粘贴,再稍微调试一下就能达到良好的视觉效果。根据集成的第三方库的多少,基本可以划分到3~4级封装度这样的范围。这个级别的框架的代码更多的是属于粘合剂,将各种不同的第三方库的前端代码粘合起来。经典页面大概是这样:&br&&img src=&/4ebc1ffe8fc2_b.jpg& data-rawwidth=&502& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&502& data-original=&/4ebc1ffe8fc2_r.jpg&&&br&--------------------------------&br&&b&&i&5级—— jQuery-ui&/i&&/b&&br&这里要单独把jQuery-ui拿出来讲,并不是因为它的封装度有多高,而是我认为它是一个分界点。jQuery以下级别的框架,代码以css为主,自身的js代码少,框架量级更轻,更灵活,更适合互联网web产品。jQuery以上级别的框架,属于前端的重度封装,通过框架暴露的接口进行开发,开发人员甚至不需要太多前端知识,只需要详细查看框架的开发文档即可。jQuery以上级别的框架更适合传统管理软件的开发。&br&--------------------------------&br&&b&&i&6~7级—— easy-ui/DWZ&/i&&/b&&br&easy-ui基于jQuery-ui,不过具有更丰富的组件库。貌似商业版收费很高。听说某大型国企花了大价钱购买下来使用。DWZ是国产框架中我认为综合表现还不错的,完全免费,有问题可以在他们的QQ群里提。其余的之前还用过金蝶的operamasks-ui,不过现在好像已经不更新了。这一类级别的框架还有一个另外的称呼——“富客户端框架”,意思就是重度js框架。使用起来开发效率很高,当年也是一度百花齐放,框架辈出。经典页面大概是这样:&br&&img src=&/cd589c8d0d7_b.png& data-rawwidth=&709& data-rawheight=&261& class=&origin_image zh-lightbox-thumb& width=&709& data-original=&/cd589c8d0d7_r.png&&--------------------------------&br&&b&&i&8级—— extjs系列&/i&&/b&&br&extjs属于前端框架领域中的庞然大物,封装程度很高,具有自成体系的元素选择引擎和浏览器兼容方案,js写法上也有自己的方式。组件很多很全。只看extjs的官方文档和示例几乎不必学习任何其他的前端知识就可以做出“很漂亮”的前端页面。当然页面很容易“撞衫”。使用时间长了,会对其产生严重依赖,离开extjs,几乎不会写前端页面了。经典页面大概是这样:&br&&img src=&/aec387db3f85bb45e166f9de63f8bd0b_b.png& data-rawwidth=&1439& data-rawheight=&789& class=&origin_image zh-lightbox-thumb& width=&1439& data-original=&/aec387db3f85bb45e166f9de63f8bd0b_r.png&&&br&--------------------------------&br&&b&&i&9级——vaadin/GWT&/i&&/b&&br&最后一级,也是封装度最高的一级,也就是所谓的使用后台语言写前端。如果说之前的八级至少前端和后端还是相对分离的,后台程序在java中写,前台程序在html或者js中写;那么这一级别的框架简直会颠覆你的认知!只需在后台使用java写好了类和对象,并设置好相关的属性,网页的元素是自动通过后台对象生成的。这当然有好处,妈妈再也不用担心我不会写js和css了。然而就学一下html/css/js真的那么难吗?个人认为,尽管GWT有google的这么强悍的背书,但是这种9级封装的本质上把前后台耦合得更紧密。一个人做一个项目还可以考虑,但是一个团队前后台分离、模块化开发的时候,使用这种框架是一种灾难!所以我是极度不建议使用9级封装框架的。&br&--------------------------------&br&&br&综上,针对不同的编程方式,给出以下参考:&br&&br&1
DOP(Deadline Oriented Program,面向截止日期编程)的程序猿们有两种选择:a、努力学习html/css/js,使用2~3级框架;b、看不上前端代码的,6~8级是不错的选择。对于业务优先、老板整天嚷嚷时间有多紧、客户有多急切的项目,你可以直接选b了,我觉得老板是不会给你时间学习html/css/js的。&br&&br&2
EOP(Experience Oriented Program,面向用户体验编程)的程序猿们,大多数做的是追求极致用户体验的互联网产品吧。那果断选1级封装度的框架,可适当借鉴2~4级的框架。&br&&br&3
MOP(Money Oriented Program,面向人民币编程)对于一直做后台,趁过年放假想赚个外快的程序猿们,我知道你们也不想在前端领域有多大发展,搞好后台就足够一辈子衣食无忧了,所以还是选择6~8级吧。&br&&br&此外,需要考虑搜索引擎优化的项目,慎用富客户端或者重ajax应用。&br&&br&什么?你还需要考虑ie6的兼容性?出门左转有一面墙,你可以撞上去了,不送!&br&&br&最后告诉大家,这些都是几年前我为了治疗自己的选择恐惧症而进行的一些分析。&br&&br&现在,答主我已经不再纠结各种前端框架了。因为心中有剑,枝叶、落花皆可为剑。&br&&br&----------------------------------------&br&有朋友提到backbonejs/angularjs/reactjs/vuejs这些新兴框架,感觉很有必要补充完善一下这个答案。&br&&br&大约五六年前,前端还是一个边缘岗位,前端的工作中:css方面的由设计师用dreamveaver等工具顺带就做了;js方面的由后台程序员写写实现了效果就行了。&br&&br&究其原因,主要还是由于当时在html5尚未大面积支持的情况下,浏览器网页端的表现力有限。为增强表现力甚至还需要依靠flash的支持。近几年随着移动端的兴起以及html5/css3等技术的推广,web端表现力日渐丰富,也越来越复杂。&br&&br&计算机这门学科就是这样,&b&当一件事物复杂到一定程度就一定有人抽象出各种框架来提高可维护性与可扩展性。&/b&&br&&br&&br&传输复杂了,有了osi 7层和5层框架;服务器集群复杂了,有了云计算各种框架;乃至销售问题复杂了,也有人总结出《销售技巧xx招》…这种抽象也是人类的一种基本思维方式。&br&&br&前端岗位正是在网页前端复杂性逐渐增加的推动下产生的。说实话,很多老程序员以前是是看不上前端行业的,认为无非是一些奇巧淫技而已。而现在,以javascript为基础的前端技术已经成功逆袭,nodejs的发展更是让js有了扬眉吐气的一天。&br&&br&现在回过头来看backbonejs/angularjs/reactjs/vuejs系列框架,它们其实并不是给后台程序员准备的框架。不要轻信它们官网上的提到的“简单易用快速上手”之类的宣传语,那不是跟后台程序员和js初学者说的。如果你对js原型链、作用域、异步回调的概念还很模糊,用了这些框架只会让自己陷入泥潭难以自拔!&br&&br&&br&虽然你也可以将这些框架简单粗暴得划分到7级封装度左右,但是我并不认为这些“深度前端”框架适合后台开发者。&br&&br&&br&当然啦,事无绝对,如果你像我一样兴趣广泛,喜欢折腾,前后端双修,那你自然清楚该选什么前端框架,也就不会到知乎上来问这个问题了。&br&&br&&br&这就是现在的我,有了一定的前端功力,开源社区的森林里那么多丰富的资源,枝叶、落花都是利刃,也无需在框架上纠结了。
几年前,还是痴迷java的那会儿,我也曾纠结于前端框架的选择。试图找出一套一劳永逸的前端框架继承到项目架构中。搜遍全网得出以下结论: 各大前端框架可以按照“封装度”的标准来区分。 设计刚出的一套网页皮肤,封装度为0。层层封装到可以直接用后台语言…
其实我觉得这三者,甚至包括xml,都不是很好的配置文件格式&br&&br&在小一点的工程中,我可能会考虑yaml,但个人强烈推荐的一个配置文件格式就是HOCON(Human-Optimized Config Object Notation)&br&是由typesafe(开发scala和play framework的公司)主导的项目:&br&&a href=&///?target=https%3A///typesafehub/config& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - typesafehub/config: Configuration library for JVM languages&i class=&icon-external&&&/i&&/a&&br&&br&在Google干过的同学可以参考GCL,会发现很多设计上的类似点。&br&&br&我觉得比较完美的配置文件格式需有这些特性&br&&br&&ol&&li&语法要简单,灵活&br&&/li&&/ol&简单大家都差不多&br&&br&HOCON是JSON和java property的超集,最为灵活,你可以写&br&&div class=&highlight&&&pre&&code class=&language-text&&a: {
&/code&&/pre&&/div&也可以单独写&br&&div class=&highlight&&&pre&&code class=&language-text&&a.b.c=5
&/code&&/pre&&/div&&:&号也可以换成&=&或者就完全省略&br&&br&2. 能够写注释,这点json简直可悲,不过可以考虑加预处理的过程&br&&br&3. 能够比较方便的覆盖参数值(方便书写或者debug),比如说在config文件中定义了&br&a=1&br&&br&可以在运行的时候,通过类似 program -Da=2或者a=2 program的的方式来覆盖参数值,而不需要跑去修改配置文件本身&br&&br&这一点HOCON完爆其他的几种&br&&br&4. 能够重用配置片段,比较大一点的project中,经常有很多地方的配置需要保持一致,最好的办法就是引入变量和引用的概念,比如可以类似&br&&div class=&highlight&&&pre&&code class=&language-text&&db_connection: {host: a, password: b, db_name: c, ..... }
service_a: {
db: $db_connection
service_b: {
db: $db_connection
&/code&&/pre&&/div&这样最大的好处是避免了copy and paste,在修改配置文件的时候能搞保证不出问题&br&&br&这点yaml和hocon基本上都是做的不错的,json没有,ini我用的不多,好像是没有。&br&yaml的实现其实比较简单,就是单纯的文本替换,这样导致我要说的下一点被HOCON完爆。&br&&br&5,可以继承&br&这是HOCON完爆其他语言的地方。还是上面那个例子,假设service_b.db不仅仅是是要是用全局db_connection的值,要稍微修改其中host的值,可以&br&&div class=&highlight&&&pre&&code class=&language-text&&service_b: {
db: $db_connection {
&/code&&/pre&&/div&而且不需要重新copy and paste之前所有的内容&br&&br&它的继承非常强大,语义可以说基本上和普通OO语言没有太大区别&br&&br&另外HOCON可以包含文件,比如说你可以写一个基础的配置文件base.conf,然后再针对dev,staging和production分别做一份不同的文件,这样可以很轻松地做到在不同的环境下,用不同的配置而且没有重复的配置代码,比如说&br&&div class=&highlight&&&pre&&code class=&language-text&&include 'base.conf'
// 覆盖默认值
db.connection = &product_machine:2000&
&/code&&/pre&&/div&&br&另外提一下twitter之前尝试用scala语言本身来当config language,但是好像过于笨重
其实我觉得这三者,甚至包括xml,都不是很好的配置文件格式 在小一点的工程中,我可能会考虑yaml,但个人强烈推荐的一个配置文件格式就是HOCON(Human-Optimized Config Object Notation) 是由typesafe(开发scala和play framework的公司)主导的项目:
&img src=&/v2-482d3b857a551fbaed438e621ac51093_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&/v2-482d3b857a551fbaed438e621ac51093_r.jpg&&&blockquote&&p&将 package.json 中的 Ionic 版本改为 2.0.0 的时候,我就思考一个问题。这个该死的问题是——我到底要用哪个框架继续工作下去。&/p&&/blockquote&&p&刚开始学习前端的时候,SPA(单页面应用)还没有现在这么流行,可以选择的框架也很少。而今天,我随便打开一个技术相关的网站、应用,只需要简单的看几页,就可以看到丰富的&strong&前端框架世界&/strong& Angular 2、React、Vue.js、Ember.js。&/p&&img src=&/v2-67de9bce8d7cc46593bceeec6a83a44c_b.jpg& data-rawwidth=&710& data-rawheight=&405& class=&origin_image zh-lightbox-thumb& width=&710& data-original=&/v2-67de9bce8d7cc46593bceeec6a83a44c_r.jpg&&&p&当我还是一个新手程序员,我从不考虑技术选型的问题。因为不需要做技术选型、不需要更换架构的时候,便觉得框架丰富就让它丰富吧,&strong&反正我还是用现在的技术栈&/strong&。等到真正需要用的时候,依靠之前的基础知识,我仍能很轻松地上手。&/p&&p&可是一旦需要考虑选型的时候,真觉得天仿佛是要塌下来一般。选择 A 框架,则使用过 B 框架的可能会有些不满。选用 B 框架,则使用 A 框架的人会有些不满。选择一个过时的框架,则大部分的人都会不满。这点“小事”,也足够让你几天几夜睡不了一个好觉。&/p&&h2&前端的选择恐惧症&/h2&&p&年轻的程序员都是好奇的猫,玩过一个又一个的前端框架。从毛球上弄出一条条的线,玩啊玩,最后这一个个的框架在脑子里搅浆糊。&/p&&img src=&/v2-2b2d6f4264aea99dc872_b.jpg& data-rawwidth=&450& data-rawheight=&273& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&/v2-2b2d6f4264aea99dc872_r.jpg&&&h3&技术选型:不仅仅受技术影响&/h3&&p&有太多的选择,就是一件麻烦的事;没有选择时,就是一件更麻烦的事;有唯一的选择时,事情就会变得超级简单。&/p&&img src=&/v2-9e232e57abddf99bc821a0e206b15175_b.jpg& data-rawwidth=&600& data-rawheight=&337& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-9e232e57abddf99bc821a0e206b15175_r.jpg&&&p&倘若,我是那个使用 Java 来开发 API 的少年,我会使用 Spring Boot 来作为开发框架。尽管 Java 是一门臃肿的语言,但保守的选择不会犯上大错。&/p&&p&倘若,我是那个使用 Python 来开发 Web 应用的少年,我会使用 Django 来作为开发框架。它可以让我快速地开发出一个应用。&/p&&p&只可惜,我不再是一个后台开发者,我不再像过去,可以直接、没有顾虑的选择。当我选择 JavaScript 时,我就犯上了「选择恐惧症」。技术选型也是没有银弹的——没有一个框架能解决所有的问题。&/p&&p&在《Growth:全栈 Web 开发思想》一书中,我曾提到过影响技术选型的几个因素。&/p&&br&&img src=&/v2-a0fc9baf648deaabb3faed3_b.jpg& data-rawwidth=&875& data-rawheight=&434& class=&origin_image zh-lightbox-thumb& width=&875& data-original=&/v2-a0fc9baf648deaabb3faed3_r.jpg&&&br&&p&这时,为了更好的考量不同的因素,你就需要列出重要的象限,如&strong&开发效率&/strong&、团队喜好等等。并依此来决定,哪个框架更适合当前的团队和项目。&/p&&img src=&/v2-f86ebe2dddc80_b.jpg& data-rawwidth=&881& data-rawheight=&661& class=&origin_image zh-lightbox-thumb& width=&881& data-original=&/v2-f86ebe2dddc80_r.jpg&&&p&即使,不考虑前端框架以外的因素,那么技术选型也是相当痛苦的一件事。&/p&&h3&上线时间影响框架&/h3&&p&每一个框架从诞生到受欢迎,都有其特定的原因和背景。不同的开发者选择时,也是依据于其特定情景下的原因和背景。&/p&&img src=&/v2-9e232e57abddf99bc821a0e206b15175_b.jpg& data-rawwidth=&600& data-rawheight=&337& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&/v2-9e232e57abddf99bc821a0e206b15175_r.jpg&&&p&如 Ruby On Rails诞生之时,带来了极大的开发效率,而开发效率正是当时大部分人的痛点。我们知道 Ruby On Rails 是一个大而广的框架,它可以提供开发者所需要的一切,开发者所需要做的就是实现业务代码。当开发效率不再是问题时,自由度变成了一些开发者的痛点,此时像 Sinatra 这样的微框架就受这些人欢迎。&/p&&p&也因此,开发效率会在很大程度上影响技术选型。毕竟,开发效率在很大程度上决定了上线时间,上线时间很大地影响了技术选型。&/p&&ul&&li&用几星期的时间来做一个网站,我首先想到的会是找一个模板。&/li&&li&用几个月的时候来做一个网站,我仍然会想到找一个框架。&/li&&li&用几个年的时间来做一个网站,我会想着是不是可以造几个轮子。&/li&&/ul&&p&遗憾的是,要遇到可以造轮子的项目不多。&/p&&h3&锤子定律:你需要更大的视野&/h3&&p&&strong&年轻的时候,学会了 A 框架,总觉得 Z 网站用 A 框架来实现会更好&/strong&,一定不会像今天这样经常崩溃、出Bug。**时间一长,有时候就会发现,Z 网站使用 A 不合适,他们的问题并不是框架的问题,而是运维的问题。&/p&&img src=&/v2-e0d270a25d8f934c657fef9c71d45d10_b.jpg& data-rawwidth=&450& data-rawheight=&329& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&/v2-e0d270a25d8f934c657fef9c71d45d10_r.jpg&&&br&&p&后来,出于对职业发展的探索,我开始了解咨询师,看到一本名为《咨询的奥秘》的书籍。在这其中,提到一个有意思的定律“锤子定律”(又称为工具定律)——&strong&圣诞节收到一把锤子的孩子,会发现所有东西都需要敲打&/strong&。 出现这种情况的主要原因是,&strong&开发者对一个熟悉的工具过度的依赖&/strong&。&/p&&p&认真观察,就会发现这个现象随处可见。当一个新手程序员学会了某个最新的框架,通常来说这个框架有着更多的优点,这个时候最容易出现的想法是:&strong&替换现有的框架&/strong&。可是,现有的框架并没有什么大的问题。并且凭估不充分时,新的框架则存在更多的风险。&/p&&p&并且,对于某个熟悉工具的过度依赖,特别容易影响到技术决策——看不到更多的可能性。这时候,我们就需要头脑风暴。但是这种情况下,头脑风暴很难帮助解决问题。&/p&&p&在这个时候,拥有更多项目、框架经验的人,可能会做出更好的选择。&/p&&h2&前端框架一览&/h2&&p&在这个复杂的前端框架世界里,我不敢自称是有丰富的徒刑经验。我只能去分享我用过的那些框架,读者们再结合其他不同的框架来做决定。&/p&&img src=&/v2-67de9bce8d7cc46593bceeec6a83a44c_b.jpg& data-rawwidth=&710& data-rawheight=&405& class=&origin_image zh-lightbox-thumb& width=&710& data-original=&/v2-67de9bce8d7cc46593bceeec6a83a44c_r.jpg&&&br&&h3&jQuery, 使用生态解决问题&/h3&&p&jQuery 创立之初的主要目标是,简化 HTML 与 JavaScript 之间的操作,开发者可以轻松地使用 $('elment').doSomething() 的形式来对元素进行操作。&/p&&img src=&/v2-f759bccf_b.jpg& data-rawwidth=&480& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&/v2-f759bccf_r.jpg&&&p&诞生之后,由于其简单容易手、并且拥有丰富的插件,几度成为最受欢迎的前端框架。大部分动态交互效果,都能轻松地找到 jQuery 插件。即使,没有也能通过其 API,快速地编写相应的插件。&/p&&p&在很多人看来,jQuery 似乎是一个不会在未来用到的框架。可惜到了今天(2017年),我仍然还在项目中使用 jQuery 框架。一年前,我们仍在一个流量巨大的搜索网站上使用用 jQuery。在这几个项目上,仍然使用 jQuery 的原因,大抵有:&/p&&ul&&li&项目功能比较简单。并不需要做成一个&strong&单页面应用&/strong&,就不需要 MV* 框架&/li&&li&项目是一个&strong&遗留系统&/strong&。与其使用其他框架来替换,不如留着以后重写项目&/li&&/ul&&p&所以,在互联网上仍有大量的网站在使用 jQuery。这些网站多数是 CMS(内容管理系统)、学校网站、政府机构的网站等等。对于这些以内容为主的网站来说,他们并不需要更好的用户体验,只需要能正确的显示内容即可。&/p&&p&因此即使在今天,对于一般的 Web 应用来说,JavaScript 搭配 jQuery 生态下的插件就够用。然而,对于一些为用户提供服务的网站来说,前端就不是那么简单。&/p&&h3&Backbone.js,脊椎连接框架&/h3&&p&从 Ajax 出现的那时候开始,前端便迎来了一个新的天地。后来,智能手机开始流行开来。Web 便从桌面端往移动端发展,越来越多的公司开始制作移动应用(APP 和 移动网站)。jQuery Mobile 也诞生这个特殊的时候,然而开发起中大型应用就有些吃力。随后就诞生了 Backbone、Angular 等等的一系列框架。&/p&&img src=&/v2-30ac5b5bdd94_b.jpg& data-rawwidth=&490& data-rawheight=&125& class=&origin_image zh-lightbox-thumb& width=&490& data-original=&/v2-30ac5b5bdd94_r.jpg&&&br&&p&毕竟,&strong&作为一个程序员,如果我们觉得一个工具不顺手,那么应该造一个新的轮子。&/strong&&/p&&p&Backbone.js 是一个轻量级的前端框架,其编程范型大致上匹配MVC架构。它为应用程序提供了模型(models)、集合(collections)、视图(views)的结构。&/p&&p&Backbone 的神奇之处在于,在可以结合不同的框架在一起使用。就像脊椎一样,连接上身体的各个部分。使用 Require.js 来管理依赖;使用 jQuery 来管理 DOM;使用 Mustache 来作为模板。它可以和当时流行的框架,很好地结合到一起。在今天看来,能结合其他前端框架,是一件非常难得的事。&/p&&p&遗憾的是,Backbone.js 有一些的缺陷,使它无法满足复杂的前端应用,如 Model 模型比较简单,要处理好 View 比较复杂。除此,还有更新 DOM 带来的性能问题。&/p&&h3&Angular,一站式提高生产力&/h3&&p&与 Backbone 同一时代诞生的 Angular 便是一个大而全的 MVC 框架。在这个框架里,它提供了我们所需要的各种功能,如模块管理、双向绑定等等。它涵盖了开发中的各个层面,并且层与层之间都经过了精心调适。&/p&&img src=&/v2-d8f3f4acf74efda8f0bcc_b.jpg& data-rawwidth=&692& data-rawheight=&463& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&/v2-d8f3f4acf74efda8f0bcc_r.jpg&&&p&我们所需要做的便是遵循其设计思想,来一步步完善我们的应用。Angular.js 的创建理念是:即声明式编程应该用于构建用户界面以及编写软件构建,而命令式编程非常适合来表示业务逻辑。&/p&&p&我开始使用 Angular.js 的原因是,我使用 Ionic 来创建混合应用。出于对制作移动应用的好奇,我创建了一个又一个的移动应用,也在这时学会了 Angular.js。对于我而言,选择合适的技术栈,远远比选择流行的技术栈要重要得多,这也是我喜欢使用 Ionic 的原因。当我们在制作一个应用,它对性能要求不是很高的时候,那么我们应该选择开发速度更快的技术栈。&/p&&p&对于复杂的前端应用来说,基于 Angular.js 应用的运行效率,仍然有大量地改进空间。在应用运行的过程中,需要不断地操作 DOM,会造成明显的卡顿。对于 WebView 性能较差或早期的移动设备来说,这就是一个致命伤。&/p&&p&幸运的是在 2016 年底,Angular 团队推出了 Angular 2,它使用 Zone.js 实现变化的自动检测、&/p&&p&而迟来的 Angular 2 则受&strong&奥斯本效应&/strong&&a href=&/?target=http%3A///%23footnote-osborne& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[osborne]&i class=&icon-external&&&/i&&/a&的影响,逼得相当多的开发者们开始转向其它的框架。&/p&&p&&a href=&/?target=http%3A///%23footnote-osborne& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[osborne]&i class=&icon-external&&&/i&&/a&: 颇受欢迎的个人电脑厂商奥斯本,其公司的创新式便携电脑还没有上市,就宣布他们要推出的更高档的机器,而又迟迟无法交货,消费者闻风纷纷停止下单订购现有机种,最后导致奥斯本因收入枯竭而宣布破产。&/p&&h3&React,组件化提高复用&/h3&&p&从 Backbone 和 Angular.js 的性能问题上来看,我们会发现 DOM 是单页面应用急需改善的问题——主要是DOM 的操作非常慢。而在单页面应用中,我们又需要处理大量的 DOM,性能就更是问题了。于是,采用 Virtual DOM 的 React 的诞生,让那些饱受性能苦恼的开发者欢迎。&/p&&img src=&/v2-5ae520839cbca3eb8561a44abdac2a54_b.jpg& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-5ae520839cbca3eb8561a44abdac2a54_r.jpg&&&p&传统的 DOM 操作是直接在 DOM 上操作的,当需要修改一系列元素中的值时,就会直接对 DOM 进行操作。而采用 Virtual DOM 则会对需要修改的 DOM 进行比较(DIFF),从而只选择需要修改的部分。也因此对于不需要大量修改 DOM 的应用来说,采用 Virtual DOM 并不会有优势。开发者就可以创建出可交互的 UI。&/p&&p&除了编写应用时,不需要对 DOM 进行直接操作,提高了应用的性能。React 还有一个重要思想是组件化,即 UI 中的每个组件都是独立封装的。与此同时,由于这些组件独立于 HTML,使它们不仅仅可以运行在浏览器里,还能作为原生应用的组件来运行。&/p&&p&同时,在 React 中还引入了 JSX 模板,即在 JS 中编写模板,还需要使用 ES 6。令人遗憾的是 React 只是一个 View 层,它是为了优化 DOM 的操作而诞生的。为了完成一个完整的应用,我们还需要路由库、执行单向流库、web API 调用库、测试库、依赖管理库等等,这简直是一场噩梦。因此为了完整搭建出一个完整的 React 项目,我们还需要做大量的额外工作。&/p&&p&大量的人选择 React 还有一个原因是:React Native、React VR 等等,可以让 React 运行在不同的平台之上。我们还能通过 React 轻松编写出原生应用,还有 VR 应用。&/p&&p&在看到 Angular 2 升级以及 React 复杂性的时候,我相信有相当多的开发者转而选择 Vue.js。&/p&&h3&Vue.js,简单也是提高效率&/h3&&p&引自官网的介绍,Vue.js 是一套构建用户界面的渐进式框架,专注于MVVM 模型的 ViewModel 层。Vue.js 不仅简单、容易上手、配置设施齐全,同时拥有中文文档。&/p&&img src=&/v2-c052f772c27deafd484df_b.jpg& data-rawwidth=&1280& data-rawheight=&720& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&/v2-c052f772c27deafd484df_r.jpg&&&p&对于使用 Vue.js 的开发者来说,我们仍然可以使用 熟悉的 HTML 和 CSS 来编写代码。并且,Vue.js 也使用了 Virtual DOM、Reactive 及组件化的思想,可以让我们集中精力于编写应用,而不是应用的性能。&/p&&p&对于没有 Angular 和 React 经验的团队,并且规模不大的前端项目来说,Vue.js 是一个非常好的选择。&/p&&p&虽然 Vue.js 的生态与 React 相比虽然差上一截,但是配套设施还是相当齐全的,如 Vuex 、 VueRouter。只是,这些组件配套都由官方来提供、维护,甚至连 awesome-vue 也都是官方项目,总觉得有些奇怪。&/p&&p&除此,Vue.js 中定义了相当多的规矩,这种风格似乎由 jQuery 时代遗留下来的。照着这些规矩来写代码,让人觉得有些不自在。&/p&&p&和 React 相似的是,Vue.js 也有相应的 Native 方案 Weex,仍然值得我们期待。&/p&&h3&小结&/h3&&p&除了上面提到的这些前端框架,我还用过 Reactive、Ember.js、Mithril.js,遗憾的是同 Vue.js 一样,我没有在大一点的、正式项目上用过。也因此,我没有能力、经验、精力去做更详细的介绍。有兴趣的读者,可以做更详细的了解,也可以在 GitHub (&a href=&/?target=https%3A///phodal/fe& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&phodal/fe&i class=&icon-external&&&/i&&/a&) 上给我们提交一个 Pull Request。&/p&&h2&总结&/h2&&p&今天,大部分的框架并不只是那么简单。为了使用这个框架你,可能需要学习更多的框架、知识、

我要回帖

更多关于 为什么用springmvc 的文章

 

随机推荐