webxml引申来的

来源:互联网 发布:交通组织优化方案 编辑:程序博客网 时间:2024/04/30 08:05

1.今天突然想起来web.xml中都有哪些元素的问题。看了几篇帖子之后,才知道,web.xml是sun公司定义的,应该属于J2EE的规范。在发布web项目时需要遵从标准的来组织web.xml,从而让实现了J2EE规范的各种web容器可以无差别的运行符合标准的web项目。

2.既然说到J2EE,就盗一张图吧:

最常用的还是JSP,Servlet,JavaBean。所有的JSP最终都编译成了Servlet,说白了,这个容器里面放的都是一个一个servlet,用来对应处理用户的各种请求。记得刚参加工作那会,公司的一个老项目,webxml里面配置了1000多个servlet,光一个webxml看起来都够人喝一壶了。对比现在的spring,简直一个天上一个地下。spring用一个servlet做入口,webxml只需要配一个spring的监听器,在web容器启动时,根据配置文件初始化spring容器,从此以后程序员只需要关注业务,再也不用自己配servlet了,因为spring准备了更加符合OOP的controller,更加简洁,纯粹。此时,引入restful规范,让我们的访问变得更加优雅,更加规范化。

3.说起spring,以前总觉得它像哆啦A梦的口袋,总是能掏出各种各样神奇的东西,其实,你看了这张图,就不会那么的无奈了。

  • 核心容器:核心容器提供Spring 框架的基本功能。核心容器的主要组件是BeanFactory ,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC ) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文:Spring 上下文是一个配置文件,向Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI 、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP : 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功 能集成到了Spring 框架中。所以,可以很容易地使Spring 框架管理的任何对象支持AOP 。Spring AOP 模块为基于Spring 的应用程序中的对象提供了事务管理服务。通过使用Spring AOP ,不用依赖EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO :JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向JDBC 的异常遵从通用的DAO 异常层次结构。
  • Spring ORM :Spring 框架插入了若干个ORM 框架,从而提供了ORM 的对象关系工具,其中包括JDO 、Hibernate 和iBatisSQLMap 。所有这些都遵从Spring 的通用事务和DAO 异常层次结构。
核心容器不用说开盖即食;上下文中的JNDI,国际化,调度等,也是比较常见的应用;AOP不用说了,事物全靠它;DAO可以看做是对JDBC的封装,不用自己写connection,statement,resultset了。ORM相当于提供了与几种流行的ORM框架比如hibernate,ibatis等提供了支持的接口。SpringMVC现在火的不要不要的,个人觉得它彻底打败了Struts的MVC。springweb,我们用的controller只是一个普通的Java类,只是因为加上了@controller注解,它就可以信手拈来的引用request,response这些servlet内置的对象,都是靠springweb了。

4.上面说到spring启动依赖webxml中配置的监听器,想起来监听器,拦截器,过滤器的概念好像不是很清楚,翻了几篇帖子,大概搞清楚了:

监听器listener,监听的是web容器的事件,比如启动,关闭这些。spring容器注册监听器就是要在web容器启动时初始化;

过滤器filter,过滤的是request,response请求,用户的请求,比如有用户请求过来,我们检查这个请求是否合法,用户是否登录,我们就检查请求有没有对应的session信息,如果没有就做相应跳转处理,有的话就使用filterchain.doFilter(req,resp)放行;

拦截器interceptor,说白了就是AOP,基于反射机制,对某一个方法进行拦截,在目标方法的前后加上拦截器中定义的操作。执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。

5.扯到AOP,摘抄一段大牛的话,个人觉得理解的非常透彻:面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。但是人们也发现,在分散代码的同时,也增加了代码的重复性。什么意思呢?比如说,我们在两个类中,可能都需要在每个方法中做日志。按面向对象的设计方法,我们就必须在两个类的方法中都加入日志的内容。也许他们是完全相同的,但就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。也许有人会说,那好办啊,我们可以将这段代码写在一个独立的类独立的方法里,然后再在这两个类中调用。但是,这样一来,这两个类跟我们上面提到的独立的类就有耦合了,它的改变会影响这两个类。那么,有没有什么办法,能让我们在需要的时候,随意地加入代码呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 
      一般而言,我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
这样看来,AOP其实只是OOP的补充而已。OOP从横向上区分出一个个的类来,而AOP则从纵向上向对象中加入特定的代码。有了AOP,OOP变得立体了。如果加上时间维度,AOP使OOP由原来的二维变为三维了,由平面变成立体了。从技术上来说,AOP基本上是通过代理机制实现的。AOP在编程历史上可以说是里程碑式的,对OOP编程是一种十分有益的补充。

6.上面提到的ORM框架,其中的hibernate很是有名,不过我一直没有接触过,但是其底层的缓存机制,用的是ehcache,我在项目中用过。想想还是有点小激动呢。

0 0
原创粉丝点击