昨天买了本淘宝大牛写的书-《深入分析java web 技术内幕》,从今天开始,记录下自己的总结。
由于本人是使用spring MVC开发的,所有就先看了下spring MVC 工作机制与设计模式这章,感觉看了之后受益匪浅啊!!!
小结一:spring MVC的总体设计
在一个工程中如果想要使用 spring MVC的话,只需要两个步骤
- 在web.xml中配置一个DispatcherServlet。
需要配置一个org.springframework.web.servlet.DispatcherServlet的servlet。
- 再定义一个dispatcherServlet-servlet.xml配置文件。
在这个配置文件里面我们只需要扩展一个路径映射关系,定义一个视图解析器,再定义一个业务逻辑的处理流程规则。
这样就可以搞定一个最基本的Spring MVC的应用了。
--------------------------邪恶的分割线------------------------------------------------
对于DispatcherServlet初始化的时候初始了哪些东西,这些可以在initStrategies中看到。
/**
* Initialize the strategy objects that this servlet uses.
* <p>May be overridden in subclasses in order to initialize further strategy objects.
*/
protected void initStrategies(ApplicationContext context) {
//初始化MultipartResolver,主要是处理文件上传服务。
initMultipartResolver(context);
//用于处理应用的国际化问题
initLocaleResolver(context);
//用于定义一个主题
initThemeResolver(context);
//用于定义用户设置的请求映射关系
initHandlerMappings(context);
//用于根据Handler的类型定义不同的处理规则
initHandlerAdapters(context);
//当Handler处理错误的时候,通过这个handler来做统一的处理
initHandlerExceptionResolvers(context);
//将指定的ViewName按照定义的RequestToViewNameTranslator替换成想要的格式。
initRequestToViewNameTranslator(context);
//用于将view解析成页面
initViewResolvers(context);
//用于映射flash管理的。
initFlashMapManager(context);
}
--------------------------------------邪恶的分割线-------------------------------
小结: 对于spring MVC框架中,有三个组件是用户必须定义和扩展的:
- 定义URL映射规则:handlerMapping
- 实现业务逻辑的handler实例对象:handlerAdapter
- 渲染模版资源:ViewResolver
--------------------------------------邪恶的分割线-------------------------------
看看DispatcherServlet启用的时候做了哪些工作?
- 调用HttpServletBean的init()方法。在init()方法中,创建了BeanWrapper对象,并且执行了initServletBean()方法;
/**
* Map config parameters onto bean properties of this servlet, and
* invoke subclass initialization.
* @throws ServletException if bean properties are invalid (or required
* properties are missing), or if subclass initialization fails.
*/
@Override
public final void init() throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("Initializing servlet '" + getServletName() + "'");
}
// Set bean properties from init parameters.
try {
PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
initBeanWrapper(bw);
bw.setPropertyValues(pvs, true);
}
catch (BeansException ex) {
logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
throw ex;
}
// Let subclasses do whatever initialization they like.
initServletBean();
if (logger.isDebugEnabled()) {
logger.debug("Servlet '" + getServletName() + "' configured successfully");
}
}
- 调用FrameworkServlet的createWebApplicationContext方法,初始化spring容器。
- 调用FrameworkServlet的onRefresh方法完成配置文件的加载,配置文件的加载同样是先查找servlet的init-param参数中设置的路径,如果没有,就会根据namespace+Servlet的名称来查找XML文件。
- Spring容器加载的时候会调用DispatcherServlet的initStrategies方法来初始化springMVC框架所需要的八个组件,这八个组件对应的八个bean对应都保存在DispatcherServlet类中。
这样:spring MVC的初始化工作就完成了。这样就可以接受你的http请求了。