深入剖析MVC的(java实现)

深入剖析MVC(基于的java实现)

      谈到MVC(模型视图控制器),不能不谈Servlet。因为它是javaWeb MVC框架实现的基础,所以还的从它谈起。Servlet就是Web服务器端的一个java类,这个java类和别的java类不一样它不是很自由,必须要让一个称为Servlet容器(比如Tomcat)的程序管理它的一切(对象的初始化、方法的调用等等)。虽然没有那么的自由但Servlet的作用很重要,那就说说它的作用:一般我们写的java类是比较自由的在一般情况下只要谁想使用都可以创建其对象,但是那些java类不能够直接工作在以Http为协议的互联网上,而这些正式Servlet的强大之处,它可以处理来自互联网上的请求并且对请求做出响应 ,这个功能就是Servlet的重要的作用。

      对Servlet有了初步认识之后,接下来应该对它深入的了解一下,解决任何问题都要抓住问题的本质。要想深入理解MVC我们一样也要抓住问题的本质。接下来我们就来探讨一下Servlet这个比较神秘的“东西”。其实站在程序员的角度编写Servlet已经很容易了,那些比较复杂的工作(比如和网络的连接(HTTP协议也是建立在TCP/IP协议之上的所以每一个HTTP请求都要和Web服务器进行一次连接)比较底层的功能,而所有具体的业务都是建立在这些的基础上的,也就是说这些底层功能是必须的、是重复的)已经由定义Servlet这一标准的厂商(SUN)实现了而这一部分就是所谓的Servlet容器。我们只需要遵守人家厂商的规范(API)编写我们自己的类,再交给Servlet容器让它进行管理,这样一来我们就把注意力集中在在对业务逻辑的编写了。这个过程是这样的,Servlet 标准由SUN公司定义,当然Servlet容器也必须遵守这一标准,程序员写的Servlet类也遵守这一标准,接下来将程序员实现了Servlet标准的具体Servlet类交给Servlet容器让容器管理Servlet的生命周期,这就是它们之间的关系。这就是面向对象里面提倡的面向接口编程,在这里Servlet容器和我们自己编写的Servlet都遵守Servlet API而Servlet容器和我们写的Servlet类都是这一标准的实现只是各自所提供的功能(职责)不一样罢了。

      好像上面说的和MVC没有一点关系,其实不然在java里面所有实现了MVC这一设计模式的框架中的控制器就是Servlet,接下来看看这个Servlet怎样进行控制的。在刚开始时程序员将所有对请求的响应结果(HTML或其他的文件)都编写在Servlet里面,这样以来将HTML代码和java代码混合在一起使程序的可读性大大降低也不利于代码的管理。所以后来SUN公司就定义了JSP标准,将HTML这样的模版代码和业务代码分开,这就是现在大家所说的显示了(其实Jsp在运行时还是一个Servlet只是在程序员编写程序时方便罢了)。再加上JavaBean就可以将显示和业务逻辑分开了,JSP+JavaBean这就是MVC的“雏形”了。虽然这样可以将显示和业务逻辑分开,但是这也有不好的方面比如显示和业务之间是一对一的关系;假如有很多不同请求要显示不同的页面(显示层)但是所对应的业务都一样。这样问题就出来了我们必须给每个请求写对应的业务逻辑,而达不到代码的复用。那能不能将这些请求都先交给一个组件再由该组件调用具体的业务进行处理呢?答案是肯定的,这就是MVC这个思想,这样一来显示和业务(模型)就变成了多对一的关系,不仅是编写程序简单而且也达到了代码的最大化利用。要实现这个功能有一个概念必须的清除那就是请求转发 在理清这个概念之前得知道什么是一个JavaWeb工程:根据SUN官方的定义就是Servlet、Jsp、Html和其他一些资源文件的集合,并且这些组件都能够运行在Servlet 容器。 我们都知道程序员写的所有Servlet类不能自己创建对象就更谈不上调用该Servlet的方法,都得交给Servlet容器来进行管理,这样以来在一个JavaWeb工程里面就没有办法用一个Servlet调用另一个Servlet了而Servlet也属于JavaWeb工程里面的组件,这就是说在容器里面的一个具体的工程各组件之间是没有办法通信的,这就是存在的问题,那么问题可以解决吗?答案是肯定的,而请求转发就是用来解决这个问题的,它提供了Web程序各组件之间的通信能力,使他们之间可以进行通信这就是请求转发。在具体一点就是将一个Servlet里面的数据转交个另一个Servlet进行处理。为什么在MVC里面控制器能够将很多不同的请求交给相同或不同的模型呢?基本原理就是请求转发。

对应的在java EE里面有一个叫RequestDispatcher这样一个类,它里面提供了一个forward这样一个方法就能进行请求转发,而这个类我们不能自己创建必须使用ServletContxt或HttpRequest两个类提供的getRequestDispatcher方法才能获得RequestDispatacher对象。说到这了这就不能不说MVC怎么样工作的了,在MVC里面所有的请求先到控制器(Servlet),由控制器调用对应的模型进行处理再将结果(响应)发送给客户端(浏览器)。这样我们就可以把所有的转发规则写在控制器(Servlet)里面,再由控制器进行控制这就是MVC的进行控制的原理。但是我们要开发很多这样的Web项目时这些工作(就是控制信息编码这些工作)就又是重复的那该怎么办呢,能不能把这些工作先给做了。把这些重复的部分提取出来进行抽象再实现而这些实现就是框架(MVC框架),那我们怎样和框架进行交互呢?可以将我们自己具体的规则写在一个配置文件告诉(MVC)框架,一般使用XML做配置文件。这样一来(MVC)框架把这些XML配置文件进行解析在将里面的关系在程序运行时动态的注入给具体的控制器就可以了。这就是MVC框架的本质,其实在java这个大家庭里面有很多的开源框架都是这样的思想,程序员跟框架交互的数据用XML来进行描述而框架本身又提供了解析XML文件的功能,这样我们写的程序就可以和框架进行通信了,这也达到了代码的最大化利用。

 

 

 

写在后面:今天没事随便写点东西和大家分享,有什么不妥的地方希望和大家一起探讨


你可能感兴趣的:(JavaWeb文章)