SSH(Struts+SpringMVC+Spring+Hibernate),SSM(Struts/springMVC+Spring+Hibernate)
而我近来做的项目itoo中,应用到框架为easyUI+SpringMVC+EJB+hibernate.做项目分层是为了更好的解耦,分层可以完全不必你框架就可以处置惩罚,为何还不须要这么多框架呢?
而且如今公司许多web项目的掌握层的手艺框架由struts2迁移到springMVC,为何我们如今做java的web开辟,会挑选struts2或许springMVC如许的框架,而不是应用servlet加jsp如许的手艺呢?
迥殊是如今我们web的前端页面都是应用velocity如许的模板言语举行开辟,扬弃了jsp,如许的挑选又会给我们java的web开辟带来什么样的长处,延着这个题目的思绪,我又发明新的疑问,为何如今许多java企业级开辟都邑去挑选spring框架,spring框架给我们开辟的应用带来了什么?
这么一深切的想还真是不太想的邃晓,我好像很难找到一串能让人完全佩服的答案,终究我发明,这些我以为我很熟习很常常使用的手艺,实在另有许多让我生疏不解的处所,这些生疏和不解的处所也恰是我是否能更高条理应用它们的症结,不过struts2,spring如许的手艺经由这么多年的积聚已是相称庞大和庞杂,它们的面很广,本人虽然已用了它们很长时刻,照样有许多手艺不熟习和不清楚.
应用框架有一个很笼统的长处:第一,可以加速开辟历程,在相似项目中重用代码将为开辟者节约大批的时刻和精神.框架为实行烦琐的代码使命供应预建模块.
这个长处放在哪个框架都是很实用的.然则再往深层的想呢?
实在在软件里有许多优异的框架,有一种范例的框架,它的特性是竖立在一个现有手艺的基础上,供应和现有手艺一样营业功用的手艺框架,这个新的手艺框架比原手艺越发易用,越发硬朗同时功用越发壮大。
比方:jQuery,以及本文所要谈到的struts2和springMVC,穷究这些框架都是相称之庞杂,然则它们的长处实在只要一个:就是让应用者只体贴中心营业的开辟,框架帮你屏障原有手艺跟营业开辟无关的种种手艺题目。像jQuery,struts2或springMVC这类框架之所以优异,就是它们在这点上做的太好了,以至于许多应用它的顺序员都已不清楚原有手艺的实在面貌,因而我们要将struts2明白的更好,应用的越发闇练和深切,这里我们就要跳出struts2的手艺,到struts2手艺的泉源servlet,细致研讨下servlet的特性,只要如许我们才把struts2框架学的更好。
Servlet的作用是吸收浏览器传给服务端的要求(request),并将服务端处置惩罚完的响应(response)返回给用户的浏览器,浏览器和服务端之间经由历程http协定举行沟通,其历程是浏览器依据用户的挑选将相干信息按http协定报文的范例组装要求的http报文,报文经由历程收集传输到指定的服务器,服务器经由历程特定的web容器吸收这个报文信息。
比方:tomcat,jetty,jboss如许的web容器,web容器会将http报文剖析出来,如果是用户要求,终究剖析出来的报文信息会用一个request对象存储起来,服务端应用这个request做完响应的处置惩罚后,服务端顺序将效果信息封装到response对象里,然后将response对象交给web容器,web容器则把这个response对象转变为http协定的报文,并将报文回传给浏览器,浏览器末了剖析这个响应报文,将终究效果展现给用户。
Web容器制作了servlet接口,servlet接口就是开辟人员自身完成营业逻辑的处所,顺序员开辟servlet就好比做填空题,而填空题的语境或许说上下文提醒就是由request和response对象,然则javaEE范例里的servlet接口很简朴,就三个要领init,service和destory,然则这个接口太笼统,所以范例里还供应了一个HttpServlet类,这个类依据http要求范例供应了doGet,doPost等要领,servlet接口最大的特性就是依据http协定的特性举行定义,因而做servlet开辟时刻如果应用者对http协定特性不是迥殊熟习,都邑遇到或多或少使人疑惑的题目,迥殊是遇到一些庞杂特别的要求时刻:
比方文件上传,返回特别的文件花样到浏览器,这时刻应用servlet开辟就不是很方便了,servlet开辟另有个题目能够人人常常被忽视,就是要求的数据的范例转化,http协定传输都是文本情势,到了web容器剖析后也是文本范例,如果遇到钱银,数字,日期如许的范例须要我们依据实际状况举行转化,如果页面传送的信息异常多,我们就不得不做大批范例转化,这类事变没有什么手艺含量,是个体力活而且很轻易致使顺序毛病。
同时java的企业开辟都是缭绕javabean举行,范例转化好的数据还要封装到对应的javabean里,这类转来转去的事变关于项目开辟绝对不是什么好事变,所以陈旧的struts1为这类题目找到了一种处置惩罚方案,就是定义了一个DTO对象(数据传输对象),特地担任做如许的事变,不过到了struts2,全部替换servlet的action自身就是一个javabean。
Java的企业开辟一个手艺特性就是应用javabean举行的,struts2的特性之一就是它替换servlet的操纵类就是一个典范的javabean,起首struts2框架将页面传输的数据举行范例转化和封装后将要求信息封装到了这个javabean的属性里,如许我们开辟web顺序时刻就省去了烦心的范例转化和封装的题目,前面我讲到传统的servlet是依据http协定举行定义的,它会按你要求体式格局(post照样get体式格局)来处置惩罚用户的要求。
然则关于一位顺序开辟人员而言,一个要求,细致到一个url,实在关于服务端而言就是服务端对外供应的一个功用,或许说是服务端对外的一个行动,如果我们应用servlet开辟顺序我们就得把http的行动转化为细致的营业行动,这就让顺序开辟变得烦琐,加强了开辟的难度,所以struts2替换servlet的javabean就屏障了servlet里http的要求体式格局和细致营业行动转化的题目,javabean里的每个要领都可以和每个url要求一一对应,这必定减轻了开辟的难度题目。
Servlet另一个作用就是组织response对象,让页面取得正确的响应,实在当代的浏览器是一个多媒体东西,笔墨,图片,视屏等等东西都可以在浏览器里显现,资本的差异就会致使http响应报文的差异,如果我们应用servlet开辟就要依据资本的差异在java顺序里用硬编码的情势处置惩罚,如许的顺序很难复用,而且如果顺序员对某种资本的处置惩罚明白不到位,就会致使题目的涌现,struts2经由历程设置文件的情势将如许的逻辑从java顺序里剥离出来,应用设置的体式格局举行一致治理,这个做法和spring的AOP体式格局相似,如许就让效果处置惩罚体式格局越发一致,越发利于治理,同时也提拔了顺序的硬朗性以及下降了开辟的难度。
Servlet在MVC开辟形式里就是个中C层即掌握层,掌握层就像俄罗斯的双头鹰(一个头向东看一个头向西看)一样,一个头向M层模子层看,一个头向V层视图层看,模子层也是用java编写的,掌握层也属于服务端言语开辟,所以M层和C层的沟通没有天然的停滞,然则和V层视图层就不一样了,这是一个跨言语的沟通,关于浏览器,它只懂得html,javascript和css,浏览器是明白不了java这类言语的东西,然则要让服务端的东西能被浏览器明白接收,我们就必须得把服务端的响应信息放到页面里。
因而就须要一个手艺把java的信息转化到html页面里,这就是javaEE范例里供应了jsp手艺,jsp实际上是一种服务端手艺而非客户端手艺,不过它看起来好像更像html手艺,最早的jsp开辟里都是直接将java代码写到页面里,这类害处谁都晓得,以后javaEE范例供应了自定义标签手艺,应用一种相似html标签的体式格局来剖析java代码,struts2框架供应了一整套完全的自定义标签手艺,这好像听起来不算啥,然则它的作用特殊,由于自定义标签之所以叫自定义就是每个人都可以自身来定义,如果没有一个范例必定发生杂沓,而且一套完美的自定义标签是个体系工程,一套完全的自定义标签相称于我们在自身定义一套新的开辟言语,做顺序的人听到这个肯定就会邃晓开辟一套完全的自定义标签的事变量和开辟难度都是不可思议的,而且自定义标签都是和掌握层严密相连,其难度又会增添一个维度,所以struts2供应的自定义标签关于营业开辟带来的将是质的飞越。
Servlet里另有两个主要的手艺:监听器和过滤器,关于监听器在web开辟里应用的场景比较少,都是一些非常迥殊的状况才会应用,大部分web开辟里可以疏忽它的应用,我们用的最多的监听器能够就是对ServletContext创建和烧毁的监听器,ServletContext是全部web应用的全局对象,它和Web应用的生命周期绑定在一起,因而应用这个监听器对Web应用的全局信息举行初始化和烧毁操纵,比方spring容器的初始化操纵。比较有意义的是过滤器,在struts2里有个阻拦器,它们的作用雷同都是用来阻拦要求的,由于阻拦器是struts2的特有功用,在struts2里应用阻拦器天然比应用过滤器更随手,实在阻拦器所用的手艺比过滤器越发先进,由于阻拦器应用了反射手艺,因而阻拦器阻拦的面更大,掌握要求的才更强,它能完成的使命也会越发的丰富多彩。
在我第一次打仗struts2是在gxpt体系中,有人告诉我struts设想的一个目的就是想屏障在掌握层里操纵request和response对象,由于这两个http协定的儿子会形成web开辟里思绪的杂沓,然则我在实际开辟里却常常不自觉的应用这两个对象。struts2里用到了太多反射机制,迥殊是应用注解做设置,在java里反射的实行效力是异常低的,直接应用servlet肯定能提拔web应用的实行效力。实在这个倒很难做到,由于当时我没法在servlet里天真的应用spring手艺。
spring手艺可以说是java企业开辟里最主要的手艺,不过真的明白spring的作用和意义还真是一件贫苦的事变,许多人对spring明白实在都是停留在应用阶段(比方:声明式事件很好用等等),现今的spring手艺生态环境里可谓是蔚为壮观,spring已应有尽有,它的内容之多完全不亚于它的根源java言语了,而spring这么大的框都是竖立在ioc和aop手艺之上,只要深切明白了这两个手艺我们才邃晓为何spring这个框能装的下那末多东西了。
起首是ioc,ioc手艺第一个诠释叫做掌握反转,它另有个诠释就是依靠注入,这两个名字很难从字面明白,然则当你明白它的道理后就会发明它们的形貌是多么正确。Ioc手艺的实质就是构建对象的手艺换句话说就是将一个类实例化成对象的手艺,在java里实例化类经由历程new症结字举行的,每次new一个类都邑发生一个新的实例对象,这么做视乎很糟蹋,偶然这类糟蹋还挺风险,由于在顺序开辟时刻我们常常只须要某个类永久只能发生一个的实例对象这个时刻就得应用单例形式,此外在设想形式里还可以经由历程工场体式格局发生对象,应用过spring的人看到上面的笔墨就晓得了,spring里bean的定义就和上面的内容一一对应,scope属性single发生单例对象,prototype发生新对象,bean还可以经由历程工场体式格局发生对象,可以说spring的bean就是制作对象的东西。面向对象编程里对象相称于显现生活中的一个实体,
比方我们有个对象作用是完成狩猎的操纵,那末狩猎这个对象内部包括两个辅佐对象:人和枪,只要人和枪给予了狩猎这个对象,那末狩猎对象才完成狩猎的操纵,然则构建一个人和枪的对象并非看起来那末简朴,这里以枪为例,要制作一把枪我们须要金属,须要机床,须要枪弹,而机床和枪弹又是两个新对象,这些对象一个个互相嵌套互相关联,大伙试想下如果我们在java代码里构建一个枪的对象那是何其的庞杂,如果我们要组织的不是简朴的枪对象而是越发庞杂的航空母舰,那末组织这个对象的本钱之高是让人不可思议的,怎样来消弭这类对象互相嵌套互相依靠的关联了?
spring供应了一种体式格局,这类体式格局就是spring供应一个容器,我们在xml文件里定义各个对象的依靠关联,由容器完成对象的构建,当我们java代码里须要应用某个实例的时刻就可以从容器里猎取,那末对象的构建操纵就被spring容器接受,所以它被称为掌握反转,掌握反转的意义就是原本属于java顺序里构建对象的功用交由容器接受,依靠注入就是当顺序要应用某个对象时刻,容器会把它注入到顺序里,这就叫做依靠注入。
在java开辟里我们想应用某个类供应的功用,有两种体式格局,一种就是组织一个新的类,新的类继续该类,另一种体式格局则是将某个类定义在新类里,那末两个类之间就竖立一种关联关联,spring的ioc容器就是完成了这类关联关联(记着不是继续关联哦),那末某个类要被给予到新类有哪些方法了?平常只要两种:一种就是经由历程组织函数,一种就是经由历程setXXX体式格局,这也是spring容器应用到了两种规范的注入体式格局。
不管是上面说的继续体式格局,照样关联体式格局实在都是加强目的对象才的开辟手腕,在设想形式里有一种代办形式,代办形式将继续形式和关联形式连系在一起应用,代办形式就是继续形式和关联形式的综合体,不过这个综合体的作用倒不是处置惩罚对象注入的题目,而是为细致操纵对象找到一个保姆或许是秘书,这就和小说里的二号首长一样,这个二号首长对外代表了细致的实例对象,实例对象的进口和出口都是经由历程这个二号首长,由于细致的实例对象是一号首长,一号首长是要干大事的,所以一些事件性,重复性的事变比方沏茶,部署车子,如许的事变是不必劳烦一号首长的大驾,而是二号首长帮助处置惩罚的,这就是aop的头脑,aop处置惩罚顺序开辟里事件性,和中心营业无关的题目,但这些题目关于营业场景的完成是很有必要的,在实际开辟里aop也是节约代码的一种体式格局。
Spring的中心手艺的作用实质就是一个沟通机制,spring老是尽全力的让沟通的两边信息通顺,同时下降两边的沟通本钱,在实际机构里一个擅长沟通的人肯定是该公司的指导,很会沟通的指导能调动起种种资本的积极性,擅长沟通的指导就会做到海纳百川,让种种差异人跟随他,所以现今的spring就是一个大框,什么都可以往里装。
Spring很像银行,它不能直接制作物质财富,然则统统资本都要经由历程它举行流畅,它能掌握经济发展的走向,回到顺序的天下,spring的作用是被标榜为顺序之间的解耦,spring能下降差异模块之间的耦合度,缘由就是在顺序开辟里差异模块之间信息的沟通是经由历程对象通报完成的,而对象可否顺遂通报就是要合理的构建好对象,而治理好对象的构建体式格局就可以治理好对象通报,这就是spring给体系架构设想带来的长处。
以上就是java框架有什么用?的细致内容,更多请关注ki4网别的相干文章!