学习MVC设计模式有一段时间了,发现有些心得体会,现在写一下,作为一个时间的见证
Java软件开发,核心的思想就是MVC,因为我们每一步的编写,都围绕着这个设计思想来做,它指导我们不要将程序陷入毫无章法之中,我们可以从一个最简单的用户登录与注册的例子进行分析,看看MVC离我们有有多近。
拿到这个登录的例子,我们可以很快的分析出,我们的操作就是用户,根据分层的思想,我们的步骤如下:
1、设计数据库
2、写持久化对象以及与Hibernate映射文件
3、写数据库操作DAO
4、写Service层代码
5、写Action
6、写JSP页面
基本上这个模式已经把程序员限制在了一个很小的范围内进行编程,他们不必担心自己的程序格式是否良好,代码是否优雅,因为按照这个模式来,无论从格式上,还是在代码上都给人一种清晰的感觉,不过为了更好的代码维护,我们需要对上面再一次进行细化
对于第二步,我们知道后面的操作都是围绕着这个持久化对象进行的,所以我们可以将对持久化对象的操作的SQL语言全部写入到一个固定的配置文件xml中 ,这样便于我们的管理,也减少了Java文件中大量的SQL语句
对于第三步,我们可以写一个DAO接口,然后写一个Impl实现类,这样更加体现出面向接口编程,可以做到一定的可扩展性
对于第四步,我们可以写一个Service接口,然后写一个Impl实现类。效果和第三步一样。
对于第五步,有一点编程经验的人都知道使用struts2可以很好的实现属性的注入功能,但是我们为了进行再次的代码简化,我们的属性注入的全部是对象,这样不断可以体现出面向对象的程序设计,更能优化我们的代码
对于第六步,我们为了使界面更加的清新,不至于出现java片段,可以使用一些标签库,特别是OGNL标签库,不断可以使用界面标签,更重要的是对于集合框架中的元素也可以进行迭代,不但减少了我们JSP中代码的数量,也让人一目了然。对于JavaScript代码,以及CSS代码也可以全部写入到指定的文件中,这样可以做到有条有理,给人一种清爽的感觉。
这其中MVC的设计模式体现的淋淋尽致,我们可以看出,我们发现其实一个具体的业务功能就是对MVC的一个具体的流程化,MVC更多的是将我们平时可能要做的操作进行了流程的处理,使我们可以按照同样的一个思维进行程序设计,而不至于对于多个业务功能使用多种不同的设计风格。
其实关于MVC配置文件成为了信息流动的核心。我们知道struts2中的配置文件是为了做到请求与响应的流程转发,Spring提供的bean的配置也体现了我们完成一个任务所需要使用的对象,他可以在我们操作之前就产生出来,为后面的操作做好准备,可谓是处处体现面向对象的思维方式,特别是在Hibernate文件的配置中,我们发现数据库与实体对象之间不能很好的过度,但是Hibernate却使用了ORM对象关系映射机制很好的解决了这个问题,将数据库的一条一条的记录,全部封装成了一个一个的对象,这时对对象的操作也就可以映射为对数据库的操作,这样面向对象的思维有进一步的体现了。
别人都说MVC模式是为了更好的职责分散,我是很赞同的,通过MVC我们可以很好的将一个事情需要完成某项功能完全交给能够处理的对象身上,这不就是和现实生活中的处理一件事物一样吗,然而对象的产生确实重中之重,所以Spring使用IOC依赖注入的功能实现了对象的动态产生,Structs也同样使用IOC对请求参数进行了注入,同理,Hibernate也做了同样的事情,目的都是为了产生对象这也体现出了一切皆是对象的一般规律,其实对象不能平白无顾的产生,一定有一个最开始的诱因,这个就是Spring的监听器,是它在Tomcat启动时对对象进行了动态的产生。既然处理事件的关键对象在程序初始化都已经可以动态的产生了,那么对象的具体实施也就成了一个很总要的问题,所以struts2利用过滤器在具体的请求与相应过程中按照他规定的流程一步一步的执行,这之中,对象作为整个流程的守护对象,它保证了整个流程能够顺利的进行。对象为什么能够做到这点呢,其实这之中对象的行为被一个一个的交接棒传递下来进行了处理,就好比美国总统来中国访问一样,在这个访问的全程中,一定有保安24小时跟随,并且车辆以及路面一切都是最好的状态,其实处理这些事情的对象是在接到通知后自动的进行自己本分的工作,为后面的流程做好准备。
其实MVC中还有一个很重要的东西,那就是数据流与控制流,刚才大概讲了下控制流的问题,现在来讲讲数据流,我们都知道WEB开发的本质就是请求与响应,这也是Http协议限定的结果,所以我们无论怎么样也逃脱不了这个最根本性的约束,那么我们看看MVC中数据的流动究竟是怎么样的,我们知道数据的流动可以分为好几种,特别是get post两种请求方式,那么我们对此进行分析,我们为了数据在整个任务中完美的流动,我们定义了
请求响应方式get与post,他们都是可以携带数据的,数据就因为可以被他们携带所以可以在前台与后台之间进行交互。特别是我们将信息保存为对象之后在进行流动这是最好的方式,体现了面向了对象。在struts2中我们可以使用OGNL表达式使用值栈来进行数据的保存,然后在前台与后台之间进行共享,这种方式显然是最好的,现在我们能够把数据在前台与后台之间进行交互,其实还不能做到多个页面之间进行数据的共享,为此我们可以使用页面技术隐藏域来做到数据的保存与转发,这样就算不是一个请求也能做到数据的传递,当然对于session等也可以在一次会话中共享数据的。
其实说到底,WEB开发核心价值就是面向对象的思想体现,如果我们不具备这种思维方式,当然是可以很熟练的胜任现在大部分公司的业务的,因为前人已经将最好的实践方式告诉我们了,我们只要照着做就不会出现太大的问题,但是我们作为软件开发人员,我们要知道我们究竟在做什么,为什么要这么做,这才是我们闲暇之余应该想的问题。
有时候我们需要研究开源框架来更好的理解自己所使用的技术,同时也能够让我们更加了解什么是面向对象。这样我们才能面对新鲜的技术而不至于束手无策
最后希望大家在编程之余多想想为什么编出来的程序会是这样的,那么我们才有可能进行改进,做出适合自己的框架。
以上只为个人学习后的一点见解,有错误之处请多多包涵。