Spring,Django,Rails,Express这些框架技术的出现都是为了解决什么问题,如今这些框架都应用在哪些方面? - 知乎 https://www.zhihu.com/question/25654738/answer/31302541html
2、那么问题就来了,框架究竟是什么?要不要学,怎么学?前端
上面我说过了,框架其实就是一个或一组特殊的类库,特殊在什么地方?特殊在控制权转移!程序员
框架与通常类库不一样的地方是,咱们调用类库,而框架调用咱们。也就是说框架掌握整个程序的控制权,咱们必须必定程度上把程序流程的控制权交给框架,这样框架才能更好的帮助咱们。数据库
下面以JavaWeb开发为例再进行一些说明,并顺便简单介绍一下JavaWeb的一些脉络。编程
①
静态网页时代后端
原本网站都是一个个静态HTML组成的,或许这些网页仍是用Dreamweaver写的,可是这样的静态页面显然不能知足咱们,很快咱们就迎来了动态网页的时代。设计模式
②
Servlet时代浏览器
若是熟悉HTTP协议的话,咱们就知道其实访问网页的过程不过是一次TCP链接罢了。浏览器发起TCP链接到服务器,服务器接受请求,而后返回HTML代码做为响应。那么咱们彻底能够等到接受到请求以后,再动态生成HTML代码返回给客户端。服务器
Servlet就是这么作的,其主要代码不过是利用out.write()一点一点的输出HTML代码罢了。固然咱们能够在其中掺杂一点动态的东西,如返回当前的时间。框架
out.write("<!DOCTYPE html>\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<title>Index Page</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("Hello, " + new Date() + "\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
③ JSP包打天下的时代
纯粹的Servlet非常丑陋,给前端程序员理解和修改这样的代码带来了不少困难。所以JSP技术被发明了出来,原理也不复杂,就是不直接写Servlet,而是先写好JSP文件,再由服务器将JSP文件编译成Servlet。而JSP中是以常见的HTML标签为主,这样前端程序员就能方便的修改这些代码了。
<!DOCTYPE html>
<html>
<head>
<title>Index Page</title>
</head>
<body>
Hello, <%=new Date()%>
</body>
</html>
PS:由只使用 Servlet到使用JSP,虽然是一个简单的变化,但这迎合了先后端专业分工的大趋势,让前段人员只须要懂得HTML/CSS/JavaScrip代码就能够开始工做,而不须要学习Servlet那枯燥无味的用法,所以借着JSP技术的东风,JavaWeb技术迅速的扩展开来了。
④ Servlet + JSP 时代
随着JSP技术的发展,用它写成的网站也愈来愈大,业务逻辑也愈来愈复杂。开发人员渐渐发现整个网站渐渐的再次变成了一团乱麻,不只仅是JSP中夹杂了大量的Java代码,页面之间的耦合关系也愈来愈紧密。
即使是要修改一个简单的按钮文本,或者是引入一段静态的内容,也须要打开愈来愈庞大的JSP页面,艰难到找到须要修改的部分,有时还不只仅是一处,这种修改是有很大的风险的,彻底有可能引入新的错误。
这时候开发者渐渐意识到,仅仅使用JSP是不行的,JSP承担了太多的责任。这时人们又想起了Servlet,Servlet中主要使用Java代码,处理业务逻辑很是轻松。若是JSP只使用HTML代码,而将业务逻辑的代码转移到Servlet中,就能够大大的减轻JSP的负担,而且让先后端分工更加明确。
⑤
MVC模式时代
在
Servlet + JSP模式的基础上,Java阵营进一步发展出了一种适合JavaWeb应用的设计模式,MVC设计模式,即将程序分为显示层(Viewer),控制层(Controller),模型层(Model)。以下图所示:
1. 用户输入网址或点击连接或提交表单,浏览器发起请求
2. --> 经过互联网,经过HTTP协议 -->
3. Tomcat接受到HTTP请求,生成HttpServletRequest对象,根据Web.xml的配置,调用开发者编写的HttpServlet,HttpServlet根据请求内容,调用JavaBean获取数据,JavaBean从数据库获取数据,返回HttpServlet,HttpServlet将数据转发给JSP,JSP负责将数据渲染为HTML,由Tomcat负责将HTML转化为HTTP响应,返回客户端。
4. --> 经过互联网,经过HTTP协议 -->
5. 客户端浏览器接收到HTTP响应,浏览器将HTML渲染为页面,并运行其中可能存在的JavaScript进一步调整界面。
整个流程必须由开发者精确设计才能运做流畅,其中客户端HTML和JavaScript属于前端设计,服务器运行的其余内容属于后端设计。虽然符合J2EE规范的Tomcat等应用服务器已经帮咱们实现了最复杂的一块,即HTTP协议部分,还给咱们提供了JSP这个模板引擎,以及自定义标签等手段。可是在控制层,在模型层,J2EE能给咱们的帮助少之甚少。
就拿用户提交一个表单为例,而咱们在Servlet中获取参数为例,虽然不用咱们解析HTTP报文,应该已是要谢天谢地了,可是咱们要作的事情仍然不少,分析一下:
1. 客户端传过来的数据全是文本,而咱们须要的是Java对象。
2. 凡是文本就有编码问题,而这须要先后端配合解决。
3. 客户端的输入是不可信的,咱们必须校验参数的合法性。
4. 咱们还必须将校验结果反馈给客户,而且最好不要让客户所有从新输入。
5. 咱们每每不是只有一个参数须要,而是有几个甚至更多参数,要妥善的处理各类状况组合。
这些事情几乎所有都须要咱们手动编码来完成,几乎每个 Servlet 都充斥着这样的代码,设置编码,获取参数,校验参数,校验通不过返回错误信息,校验经过则进行业务处理。而更重要的是,获取参数仅仅是整个流程中的一小步,咱们的Servlet中存在着大量的重复性,机械性代码,而处理业务逻辑的代码可能只有一两行。
⑥
JavaWeb框架
既然存在着大量的重复,咱们固然不能忍,必须请出DRY大法。显然JavaWeb应用是一个规模庞大,流程复杂的应用,咱们正须要JavaWeb框架的帮助。以Struts2框架为例,他能给咱们什么帮助呢?
1. 在控制层,由Struts2的核心控制器接管控制权,将原本在Web.xml进行配置的一些工做,转移到自定义的struts.xml文件中,这个文件的配置形式更友好。
2. Struts2封装了Serlvet Api,使用POJO对象做为控制器(Action),大量使用反射,不要求继承特定类,有利于复用及单元测试。提供ActionSupport类,结合struts2标签,能很方面实现的校验信息的收集及反馈。
3. 提供国际化支持,在显示层有国际化相关的标签,在控制层由国际化相关的API。提供基于配置的校验及JS生成技术。智能化的参数类型转换,支持自定义转换器。提供Action拦截器,方便实现AOP模式。
4. 提供了基于OGNL表达式的数据共享模式,先后端数据交流更简单,提供了Struts2标签库,简单好用,支持多种模板,如FreeMarker,支持各类插件,如JSON,支持整合多种框架,如Spring。总之一句话,能在各方各面给咱们强大的帮助。
⑦
因此固然要学框架,要用框架,那么要怎么学?
1. 用框架要知其然,还要知其因此然,要大致明白框架实现一个功能特性的原理,不能只是会用,只是以为很神奇就能够了。就拿前面的Hibernate + Spring声明式事务为例,要弄明白框架这部分是怎么实现的。
2. 首先要夯实你的语言基础,如JavaSE基础,语法掌握,用法掌握,有些同窗语法还不熟练就开始学框架,等于地基没打就起高楼,你可能会快一步,可是早晚要遇到瓶颈,甚至摔跟头。
3. 那么什么时候开始学习框架?我不建议新手一开始就直接使用框架。
就好像一开始学习编程语言,你们都不推荐直接使用IDE,必定要用命令行本身编译运行几个文件以后,了解清楚了以后才可使用IDE,要否则对于底层原理不了解,遇到问题无法本身手动排查。
4. 使用框架也是同样,若是不是本身写多了重复性的代码,就很难理解框架为何要这么设计。若是不尝试几种不一样的实现,就很难理解框架为了灵活性而作出的设计和扩展点。若是不写几十个权限检查语句,就很难理解AOP到底有什么好处。
5. 框架这么好,我该所有使用框架吗?首先只有在规模以上的程序中,才有应用框架的必要,一个简单的程序不必使用框架,固然若是你很熟练,使用也无所谓。
6. 要学习一下框架的核心源代码,要为扩展框架作好准备,由于虽然框架基本上还算灵活,可是面对错综复杂的业务需求,永远不可能面面俱到,而你不了解框架的话,可能会给你实现业务需求形成麻烦。这也是有些人坚持使用Servlet+JSP原生开发,而不是用框架的理由。
7. 只要程序大了,归根究底仍是要使用框架的,不是用别人写好的,就是本身写一套。这里我不建议本身写,不要重复造轮子,总有专业造轮子的。你草草写就的每每不如别人已经千锤百炼的代码。除非你是为了学习与研究的目的,本身写,那就是一件很好的事情。