spring MVC工做机制与设计模式-读后小结(一)

昨天买了本淘宝大牛写的书-《深刻分析java web 技术内幕》,从今天开始,记录下本身的总结。 java

因为本人是使用spring MVC开发的,全部就先看了下spring MVC 工做机制与设计模式这章,感受看了以后受益不浅啊!!! web

小结一:spring MVC的整体设计

在一个工程中若是想要使用 spring MVC的话,只须要两个步骤 spring

  • 在web.xml中配置一个DispatcherServlet。

须要配置一个org.springframework.web.servlet.DispatcherServlet的servlet。 设计模式

  • 再定义一个dispatcherServlet-servlet.xml配置文件。

在这个配置文件里面咱们只须要扩展一个路径映射关系定义一个视图解析器,再定义一个业务逻辑的处理流程规则app

这样就能够搞定一个最基本的Spring MVC的应用了。 框架

--------------------------邪恶的分割线------------------------------------------------ ide

对于DispatcherServlet初始化的时候初始了哪些东西,这些能够在initStrategies中看到。 ui

/**
	 * 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框架中,有三个组件是用户必须定义和扩展的: this

  • 定义URL映射规则:handlerMapping
  • 实现业务逻辑的handler实例对象:handlerAdapter
  • 渲染模版资源:ViewResolver

--------------------------------------邪恶的分割线------------------------------- spa

看看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请求了。

相关文章
相关标签/搜索