当我们在使用一个新的开源框架时,需要对其核心类进行了解,对其工作原理进行了解之后,才能更加得心应手的去理解框架。接下来我们简单介绍一下各框架中的核心类,由于各框架的差异和同类框架版本的差异,对于其核心的实现也是同尽相同的,有些框架核心实现技术是Servlet而有些框架是Listener还有些框架用的是filter。
1. Spring MVC
它的核心类主要是一个Servlet,org.springframework.web.servlet.DispatcherServlet。
整个过程开始于客户发出的一个请求,第一个接受这个请求的组件是Spring的DispatcherServlet。Spring MVC将所有请求都经过一个前端Servlet控制器。DispatcherServlet就是这个前端控制器。
DispatcherServlet 同其他的Servlet一样要在web.xml中进行配置。
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servelt>
当DispatcherServlet装载后,它将从xml文件中载入spring的应用上下文,这个xml文件的名字取决于servlet 的名字。在本例中因为servlet叫test,所以DispatcherServlet将试图从一个叫做test-servlet.xml的文件中载入应用上下文。
接下来,你必须指定哪些URL需要由DispatcherServlet来处理。在web.xml中添加:
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
*url-pattern可以根据自己实际的业务来配置
2. Spring
spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.,在这里ContextLoaderPlugIn只作为了解即可。
spring的核心类可以是一个servlet也可以是一个Listener,只是Spring的实现不同,spring的核心接口ContextLoader接口有两个实现:ContextLoaderListener和ContextLoaderServlet。两者都实现同样的功能,但不同的是,ContextLoaderListener不能在与Servlet 2.2兼容的web容器中使用,根据Servlet 2.4规范, servlet context listener要在web应用程序的servlet context建立后立即执行,并要能够响应第一个请求(在servlet context要关闭时也一样):这样一个servlet context listener是初始化Spring ApplicationContext的理想场所。虽然使用哪个完全取决于你,但是在同等条件下应该首选ContextLoaderListener;
两个核心类的路径分别是:org.springframework.web.context.ContextLoaderListener
org.springframework.web.context.ContextLoaderServlet
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<!--Listener对应的配置-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Servlet对应的配置-->
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
*但是需要注意的是,在这两个中间我们只能选择一个
监听器首先检查contextConfigLocation参数,如果它不存在,它将使用/WEB-INF/applicationContext.xml作为默认值。如果已存在,它将使用分隔符(逗号、冒号或空格)将字符串分解成应用上下文将位置路径。ContextLoaderServlet同ContextLoaderListener一样使用'contextConfigLocation'参数。
3. Struts1
Struts1的核心类是一个Servlet,核心类是org.apache.struts.action.ActionServlet
Web.xml的配置如下
<servlet>
<servlet-name>struts</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml,
/WEB-INF/struts-config-Wildcard.xml
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
**如果在Servlet配置的时候不使用init-parm的话,默认该servlet会去查找WEB-INFO下的servletname-servlet.xm,如果使用该参数的话,则会加载指定的XML。换个角度想一下,如果我们在使用servlet的时候想修改默认的配置文件的名字的话,可以使用init-parm来修改。对于servlet都可以这样实现,在以后的文章中就不再强调。
4. Struts2
在我们使用Struts2时或者在看使用了Struts2的项目时,可能会发现Struts2用到的核心过滤器是不一样的,
org.apache.struts2.dispatcher.FilterDispatcher
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
但是这两个是可以实现我们所需要的功能的,这也是struts2在版本的升级演变过程中产生的,但是这两个有什么区别呢
FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.!
StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.!
这样的改革当然是有好处的,为什么这么说?
如果我们在使用过FilterDispatcher的开发人员知道,如果我们自己定义过滤器的话, 是要放在strtus2的过滤器之前的, 如果放在struts2过滤器之后,自己定义过滤器对action的过滤作用会失效的,所以在使用FilterDispatcher的时候我们必须注意过滤器定义的位置,当然不只是在过滤器的位置上不方便,而且当我们必须使用Action的环境,而又想在执行action之前通过Filter做一些事, 显然用FilterDispatcher是做不到的!
而StrutsPrepareAndExecuteFilter可以把他拆分成StrutsPrepareFilter和StrutsExecuteFilter,可以在这两个过滤器之间加上我们自己的过滤器.!
给你打个比喻, 现在有病人要做手术, 现在struts2要做两件事, 搭病床(环境),执行手术.! 那么打麻药的工作呢.? 不可能要病人站着打吧, 所以必须有病床的环境,打完麻药之后再动手术.! 这个比喻非常形象了.!【红色部分源于网上】
FilterDispathcer (org.apache.struts2.dispatcher.FilterDispatcher) 在早期的Struts2开发中使用,从Struts 2.1.3开始,它已不推荐使用。如果你使用的Struts的版本 >= 2.1.3,推荐升级到新的Filter-StrutsPrepareAndExecuteFilter (org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter)。
下来我们看一下他们在WEB.XML中是如何配置的
<!--FilterDispatcher的配置-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--StrutsPrepareAndExecuteFilter的配置-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
开源框架就介绍到此,可能有些肤浅,但是对于初学者,理解有很大的帮助,希望此博客能给大家带来方便,对于hessian,webservice或者一些其它框架的配置,后续会给出,请大家继续关注此博客。