什么时候我们需要用什么有什么好处!
Web开发里的前后端分离的问题,很多web项目的操控层的技术框架由struts迁移到SpringMvc为什么做java的web开发,会选择struts2或者SpringMvc这样的框架,而不是使用Servle加jsp这样的技术?特别是现在web的前端页面都是都是使用velocity这样的模板语言进行开发,抛弃了jsp,这样的选择又会给开发带来什么样的好处,为什么现在很多java企业都会选择Spring框架,Spring框架给我们带来了什么?
软件里有很多优秀的框架,有一种类型的框架,他的特点是建立在一个现有的技术基础上,提供和现有的技术一样业务的功能的技术框架,这个新的技术框架比原技术更加易用,更加健壮同时功能更加强大,例如:jQuery,
以及Struts2和Spring MVC,探究这些框架详单之复杂,但他们的核心只有一个:就是让使用者只关心核心业务的开发,框架啊帮你屏蔽所有与开发无关的技术问题。像JQuery,struts2或Spring MVC这类框架之所以优秀,就因为他们在这点上做的太好了,以至于我们只知道怎么去使用这个框架却不知道他原有技术的真实面目,如果想要更好的理解Struts2使用的更加熟练和深入,我们就要跳出struts2到他的源头servlet,仔细研究下Servlt的特点,这样我们才能把Struts2学的更好。
Servlet的作用是接收浏览器传给服务端的请求(request),并将服务器和服务端之间通过http协议进行沟通,其过程是浏览器根据用户的选择将相关信息按照http协议报文的规范组装请求的http报文,报文通过网络传输到指定的服务器,服务器通过web容器接收这个报文信息,例如Tomcat,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里,这种转来转去的的事情对于项目开发绝对不是什么好事情,所以古老的steuts1为了这个问题找到了一种解决的方案,就是定义一个DTO对象(数据传输对象)专门负责做这样的事情,不过到了struts2,整个替代servlet的action本身就是一个javabean。
Java企业开发一个技术特点就是使用javabean进行的,struts2框架将页面传输的数据进行类型转化和封装后将请求信息封装到了这个javabean的属性里,这样我们开发web程序时就省去了烦心的类型转化和封装的问题,前面有说道servlet是根据http协议进行定义的,它会按照你的请求方式(post还是get方式)(根据http规范get用于信息获取、post表示可能修改变服务器上的资源)来处理用户请求,但对于一名程序员开发人员而言、一个请求具体到一个url,其实对于服务端而言就是服务端对外提供的一个功能,或者说是服务端对外的一个动作,如果我们使用servlet开发程序我们就得把http的动作转化为具体的业务动作,这就让程序开发变的繁琐,增强了开发难度,所以struts2替代servlet的javabean就屏蔽了servlet里http请求方式和具体业务动作转化问题,javabean里的每一个方法都可以和每一个url请求方式和具体业务转化的问题javabean里的每个方法都可以和每个url请求一一对应,这必然减轻了开发的难度问题。
Servlet另外一个作用就是构造response对象,让页面获得正确的响应,其实现代的浏览器是一个多媒体工具,文字,图片,视频等等东西都可以在浏览器里显示,资源的不同就会导致http响应报文的差别,如果我们使用servlet开发就要根据资源的不同在java程序里用硬编码的形式处理,这样的程序很难复用(也就是说servlet不会变通如果我要需要文字、图片、视频同时出来就需要好多的代码量!),而且如果程序员对某种资源处理理解不到位,就会导致问题的出现,struts2通过配置文件的形式将这样的逻辑从java程序里剥离出来,使用方式进行统一管理,做法和Spring的AOP方式类似,这样就让结果处理方式更加统一,更加利于管理,同时也提升了程序的健壮性以及降低了开发难度。
Servlet在MVC开发模式里就是其中C控制层,控制层就像俄罗斯的双头应(一个头向东看一个头向西看)一样,控制成也是一个头向M层模型层看一个头向V视图层看,模型也是用java编写的,控制层也属于服务端语言开发,所有M层和C层沟通没有什么天然的障碍,但是和V层视图层就不一样了,这是一个跨语言的沟通,对于浏览器,对于浏览器,它只懂得Html,javascript和CSS,浏览器是解决不了java这种语言的东西的,但是要让服务端的东西能被浏览器理解接受,我们就必须得把服务端的响应信息放到页面里,因此就需要一个技术把java的信息转化到Html页面里,这就是javaEE规范里提供了jsp技术,jsp其实是一种服务端技术而非客户端技术,最早的jsp开发都是直接将java代码写到页面里,这样视乎并不好,之后javaEE规范提供了自定义标签技术使我们方便写程序。
Servlet里还有两个比较重要的技术:监听器和过滤器,对于监听器在web开发了使用场景较少,一般都是一些十分特别的情况下才会使用,大部分web开发可以忽略他的使用,我们用的最多的监听器可能就是对servletContext创建和销毁的监听器,servletContext是整个web应用的全局对象,他和web应用的生命周期绑定在一起 因此使用监听器对web应用对全集信息进行初始化和销毁操作,例如Spring容器中的初始化操作。比较有意思的是过滤器,在Struts2里有一个拦截器,他们的作用都是用来拦截请求的,因为拦截器是struts2特有的功能,在struts2使用拦截器自然比使用过滤器更顺手,其实拦截器所用的技术比过滤器更加先进因为拦截器使用了反射技术,因此拦截器的面更大,控制请求的能力更强。
在我开始学习以及使用struts2的时候百度告诉我struts设计的目标就是想屏蔽在控制层里操作request和response对象,因为这两个http协议的儿子会造成web开发里思路混乱,但是在实际开发里很多人却不自觉的使用这个对象。最近听一个我认识的前端大神说他非常喜欢用ajax当时我就纳闷ajax好用么?我更加喜欢在页面中使用javascript技术处理各种信息、最终struts2就是servlet的变体,那是不是就可以抛弃struts2了直接使用servlet?,一位内struts2里用到太多反射机制特别是使用注解(注解是用反射实现的),在java里反射的执行效率是非常低的,直接使用servlet一定能提升web应用的执行效率。其实这个倒很难做到,这一点struts倒是简化了。
下面是Spring了。
Spring技术可以说是java企业开发里最为重要的技术了,不过真的想理解spring的作用和意义还真是意见麻烦的事情,很多人spring理解其实都是停留在使用阶段(例如:声明式实物很好用等等),当今spring技术生态的环境里可谓是蔚为壮观,spring已经保罗万象了它的内容之多完全不亚于它的本原java语言了、而spring这么大的框架都是建立在ioc和aop技术之上只有深入理解这两个技术才能明白为什么Spring这个框架能装的下那么多东西了。
首先是ioc,ioc技术第一个解释叫做控制反转,他还有一个解释是依赖注入,这两个名字似乎很难理解,但是当你理解他的原理后就会发现他们的描述是何等准确。Ioc技术的本质就是构建对象的技术换句话说就是将一个类实例化成一个对象的技术,在java里实例化类通过new关键字进行的,每次new一个类都会产生一个新的对象,这么做似乎很浪费,有时候这种浪费还挺危险,因为在程序开发时候我们常常只需要某个类永远只能产生一个实例化对象这时候就等使用单例模式,此外在设计模式里还可以通过工厂方式产生对象,使用过Spring的人看到上面对文字就知道了,Spring里bean的定义就和上面的内容一一对应scope属性singe产生单利对象,prototype产生新对象,bean还可以通过工厂模式产生对象可以说Spring里bean就是制造对象的工具。面向对象编程里对象相当于现实生活中的一个实体。怎么消除对象互相嵌套相互依赖的关系了?Spring提供了一种方式,这种方式就是Spring提供一个容器,我们在xml文件里定义各个对象的依赖关系,由容器完成对象的构建,当我们java代码里需要使用某个实例的时候就可以从容器里获取那么对象的构建操作就被spring容器接管,所以他被称为控制反转,(控制反转的意思就是本来属于java程序里构建对象的功能交由容器接管,依赖注入就是当程序需要使用某个对象时,容器会把它注入到程序里、这就叫依赖注入)在java开发里我们想使用某个类提供的功能,有两种方式,一种就是构建一个新的类,新的类继承该类,另外一种则是将某个类定义在新类里,那么两个类之间就建立一种关联关系Spring的Ioc容器就是实现了这中关联关系(友情提示:不是继承关系)那么某个类要被赋予到新类有哪些办法了?一般只有两种:一种就是通过构造函数,一种就是通过setXXX方式,这也是spring容器使用到了两种标准的注入方式。
不管是上面说的继承方式,还是关联方式其实都是增强目标对象能力的开发手段,在设计模式里有一种代理模式,代理模式将继承模式和关联模式结合在一起使用,代理模式就是继承模式和关联模式的综合体,不过这个综合体的作用倒不是解决对象注入的问题,而是为具体操作对象找到一个保姆或者是秘书,这就和小说里的二号首长一样,这个二号首长对外代表了具体的实例对象,实例对象的入口和出口都是通过这个二号首长,因为具体的实例对象是一号首长,一号首长是要干大事的,所以一些事务性,重复性的工作例如泡茶,安排车子,这样的工作是不用劳烦一号首长的大驾,而是二号首长帮忙解决的,这就是aop的思想,aop解决程序开发里事务性,和核心业务无关的问题,但这些问题对于业务场景的实现是很有必要的,在实际开发里aop也是节省代码的一种方式。
Spring的核心技术的作用本质就是一个 沟通机制,spring总是尽全力的让沟通的双方信息畅通,同时降低双方的沟通成本,在现实机构里一个善于沟通的人肯定是该公司的领导,很会沟通的领导能调动起各种资源的积极性,善于沟通的领导就会做到海纳百川,让各种不同人追随他,所以当今的spring就是一个大框,什么都可以往里装。
Spring很像银行,它不能直接创造物质财富,但是一切资源都要通过它进行流通,它能控制经济发展的走向,回到程序的世界,spring的作用是被标榜为程序之间的解耦,spring能降低不同模块之间的耦合度,原因就是在程序开发里不同模块之间信息的沟通是通过对象传递完成的,而对象能否顺利传递就是要合理的构建好对象,而管理好对象的构建方式就能管理好对象传递,这就是spring给系统架构设计带来的好处。
浙公网安备 33010602011771号