0003-选择Spring(Spring MVC)的理由

为什么现在做Java Web开发,要用Struts 2或者Spring MVC这样的框架,而不使用Servlet,JSP呢?特别是现在我们Web的前端页面都是使用Freemaker这样的模板语言进行开发,抛弃了JSP,这样开发带来什么好处?为什么现在很多企业级开发都选择Spring框架?

   首先,软件里有很多优秀的框架,其中有一种,它们的特点是建立在一个现有技术的基础上,提供和现有技术一样业务功能的技术框架,这个新的技术框架比原技术更加易用,更加健壮同时功能更加强大,例如常用的jQuery,Vue,Rect,Angular,当然还有Spring。深究这些框架都是很复杂的,但是它们的优点其实只有一个:就是让使用者只关心核心业务的开发,框架帮你屏蔽原有技术跟业务开发无关的各类技术问题。这类框架之所以优秀,就是它们在这方面做的太好了,以至于很多使用它的程序员都已经不清楚原有技术的真实面目,因此我们要将Spring理解的更好,使用的更加熟练和深入,这里我们就要跳出Spring的技术,到Spring技术的源头Servlet,仔细研究下Servlet的特点,只有这样我们才能把Spring框架学的更好。

 

   Servlet的第一个作用是根据接收到的请求(Request)作出相应的响应(Response)返回给用户的浏览器。B、S之间通过http协议进行沟通,其过程是浏览器相关信息按http协议报文的规范组装请求的http报文,通过网络传输到指定的服务器,服务器通过特定的web容器接收这个报文信息,例如:tomcat,jetty,jboss这样的web容器,将http报文解析出来,如果是用户请求,解析出来的报文信息用一个request对象存储起来,服务端使用这个request做完相应的处理后,服务端程序将结果信息封装到response对象里,然后将response对象交给web容器,web容器则把这个response对象转变为http协议的报文回传给浏览器,浏览器最后解析这个响应报文,将最终结果展示给用户。

 

  Servlet的第二个作用是根据 根据http协议的特点定义相应的方法,并在返回数据中作相应的类型转化。Web容器创造了servlet接口,servlet接口是实现业务逻辑的地方,程序使用request和response对象开发servle接口。是javaEE规范里的servlet接口很简单,就三个方法init,service和destory,这个接口太笼统了,所以规范里提供了一个HttpServlet类,它根据http请求类型提供了doGet,doPost等方法,servlet接口最大的特点就是根据http协议的特点进行定义,如果对http协议特点不熟悉,会在有些地方遇到令人困惑的问题,特别是碰到一些复杂特殊的请求时候:例如文件上传,返回特殊的文件格式到浏览器,这时候使用servlet开发就不是很方便了,servlet开发还有个问题可能大家常常被忽视,就是请求的数据的类型转化,http协议传输都是文本形式,到了web容器解析后也是文本类型,如果碰到货币,数字,日期这样的类型需要我们根据实际情况进行转化,如果页面传送的信息非常多,我们就不得不做大量类型转化,这种工作没有什么技术含量,是个体力活而且很容易导致程序错误。

 

  servlet另一个作用就是构造response对象,让页面获得正确的响应,其实现代的浏览器是一个多媒体工具,文字,图片,视频等等东西都可以在浏览器里显示,资源的不同就会导致http响应报文的差别,如果我们使用servlet开发就要根据资源的不同在java程序里用硬编码的形式处理,这样的程序很难复用,而且如果程序员对某种资源的处理理解不到位,就会导致问题的出现。

 

  而在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。

 

  Servlet里还有两个重要的技术:监听器和过滤器,对于监听器在web开发里使用的场景比较少,都是一些十分特别的情况才会使用,大部分web开发里可以忽略它的使用,我们用的最多的监听器可能就是对ServletContext创建和销毁的监听器,ServletContext是整个web应用的全局对象,它和Web应用的生命周期绑定在一起,因此使用这个监听器对Web应用的全局信息进行初始化和销毁操作,例如spring容器的初始化操作。而过滤器方面,使用SpringMVC拦截器和Struts2一样,Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口。

 

说完Servlet再说Spring,Spring技术可以说是java企业开发里最重要的技术,不过真的理解spring的作用和意义还真是一件麻烦的事情,很多人对spring理解其实都是停留在使用阶段(例如:声明式事务很好用等等),当今的spring技术生态环境里可谓是蔚为壮观,spring已经包罗万象,它的内容之多完全不亚于它的本源java语言了,而spring这么大的框都是建立在ioc和aop技术之上,只有深入理解了这两个技术我们才能明白为什么spring这个框能装的下那么多东西了。

 

  首先是ioc,ioc技术被叫做控制反转,也被称为依赖注入。Ioc技术的本质就是构建对象的技术,即类实例化成对象的技术。在java里实例化类通过new关键字进行的,每new一个对象都会产生一个新的实例对象。我们常常只需要某个类永远只能产生一个实例对象,这样就显得 上述做法很浪费 。这时就得使用单例模式。还可以使用工厂模式。spring里bean的定义就和上面的内容一一对应,scope属性single产生单例对象,prototype产生新对象,bean还可以通过工厂方式产生对象,spring的bean就是制造对象的工具。面向对象编程里对象相当于现实生活中的一个实体,例如我们有个对象作用是完成打猎的操作,那么打猎这个对象内部包含两个辅助对象:人和枪,只有人和枪赋予了打猎这个对象,那么打猎对象才能完成打猎的操作,但是构建一个人和枪的对象并不是看起来那么简单,以枪为例,要创造一把枪需要金属,机床,子弹,而机床和子弹又是两个新对象,这些对象一个个相互嵌套相互关联,在java代码里构建一个枪的对象那是何其的复杂。怎么来消除这种对象相互嵌套相互依赖的关系?spring提供一个容器,我们在xml文件里定义各个对象的依赖关系,由容器完成对象的构建,当我们java代码里需要使用某个实例的时候就可以从容器里获取,那么对象的构建操作就被spring容器接管,所以它被称为控制反转,意即本来属于java程序里构建对象的功能由容器接管,依赖注入就是当程序要使用某个对象时候,容器会把它注入到程序里。在java开发里我们想使用某个类提供的功能,有两种方式,一种就是构造一个新类继承该类,另一种方式则是将某个类定义在新类里,那么两个类之间就建立一种关联关系,spring的ioc容器就是实现了这种关联关系(不是继承关系)。某个类被赋予到新类一般只有两种方式:一是通过构造函数,再就是通过setMethod方式,spring容器也使用这两种标准的注入方式。

 

 继承方式和关联方式本质上都是增强目标对象能力的开发手段,在设计模式里还有一种代理模式,代理模式将继承模式和关联模式结合在一起使用。代理模式就是继承模式和关联模式的综合体,这个综合体的作用不是解决对象注入的问题,而是为具体操作对象找到一个代理人或者是秘书,这就是aop的思想。aop解决程序开发里事务性,和核心业务无关的问题,但这些问题对于业务场景的实现是很有必要的,在实际开发里aop也是节省代码的一种方式。

 

  Spring的核心技术的作用本质是一个沟通机制,spring的目的是让沟通的双方信息畅通,同时降低双方的沟通成本。所以spring被称为程序之间的解耦器。spring能降低不同模块之间的耦合度,原因就是在程序开发里不同模块之间信息的沟通是通过对象传递完成的,而对象能否顺利传递就是要合理的构建对象,而管理好对象的构建方式就能管理好对象传递,这就是spring给系统架构设计带来的好处。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值