其实每个 MVC framework 的执行过程都是大同小异的,当个 request 过来时,它都通过一个 Servlet 来响
应 request,再根据 request 的路径名和配置将这个 request dispatch 给一个 Controller 执行,最后将之返
回配置文件里对应的页面。在 Spring MVC 里,这个 Servlet 的名字叫 DispatchServlet。稍看一下它的源
码会发现这是一很简单的类。
简单吧,这是典型的 Template Method 模式。每个类都会完成一些自己的本职工作,把不属于自己的工作
延迟到子类来完成。这些类的子职责在下面会有分析。其实整个 SpringFramework 用的最多的模式就是
Template Method(Strategy 也挺多,呵呵),也许任何Framework 用的最多的都是 Template Method 模
式。Why?看看 Expert One on One J2EE Design and Development吧,至少 Template Method 和 Strategy
模式的分析这本书甚至比 Head first Design Pattern 还好。
我们先来看 DispatchServlet 的初始化执行过程分析吧:
我们知道每个 Servlet 在 Web 服务器启动时都会有一个初始化的机会,这就是 Servlet 的 init 过程,这是配
置 Servlet 的最好机会。我们可以在这个阶段干些啥事情呢?
1、把初始化的那些 init-param 读到 Servlet 的属性里。我们知道 Servlet 的 init-param 是放在 ServletConfig
里的,我们可以用循环去取这些属性。但是每次都这么干实在太累了,干吗不把在 Servlet 里增加几个
property,再这些 init-param 直放到 Servlet 的 property 里呢?呵呵,以后那些初始参数都可以直接拿来用
啦,真方便。DispatchServlet 的一个祖先类叫做 HttpServletBean 就是专门干这个的。以后假如我们要写
自己的 Servlet 也可以直接继承 HttpServletBean 这个类,这样读 ServletConfig 的操作都省掉了,哈哈!
在 ApplicationContext 之谜里我们已经提到我们可以用 Servlet Listner 执行的机会把 ApplicationContext
放到 ServletContext 中去。但是不是直接拿这个 ApplicationContext 就足够了呢?no。我们先问一个简单
评论0
最新资源