文档章节

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

bosscheng
 bosscheng
发布于 2013/05/09 16:13
字数 782
阅读 3824
收藏 23

昨天买了本淘宝大牛写的书-《深入分析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请求了。




© 著作权归作者所有

bosscheng
粉丝 80
博文 303
码字总数 95443
作品 0
南京
前端工程师
私信 提问
加载中

评论(1)

chape
chape
mark
java 设计模式用了哪些

看到有个面试题:除了使用单例模式,你在项目中还使用了什么设计模式? 我仔细想了下,貌似真的就只是用了单例模式. 我用的spring MVC+ mybaties开发电商.

小小丁灬
2016/09/06
725
11
Spring框架中的设计模式(四)​

Spring框架中的设计模式(四) 本文是Spring框架中使用的设计模式第四篇。本文将在此呈现出新的3种模式。一开始,我们会讨论2种结构模式:适配器和装饰器。在第三部分和最后一部分,我们将讨...

瑞查德-Jack
2018/07/20
89
0
面试官:Spring中用了哪些设计模式?

前言 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪...

Java填坑路
02/15
563
0
这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行...

Java填坑之路
2018/08/17
0
0
Java面似宝典--Java Web(JSP、Servlet、各常用框架SSH、MyBatis等)

1、什么MVC模式?说说你对MVC的理解。 2、工作中经常用到的框架有哪些?它们各自的优缺点是什么? 3、说说Struts、Spring中的设计模式。 4、拦截器和过滤器两者的区别是什么? 5、简述一下,...

瓜子葫芦侠
2014/03/26
32
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker下使用disconf:细说demo开发

Docker下的disconf实战全文链接 《Docker搭建disconf环境,三部曲之一:极速搭建disconf》; 《Docker搭建disconf环境,三部曲之二:本地快速构建disconf镜像》; 《Docker搭建disconf环境,...

程序员欣宸
30分钟前
6
0
centos7配置nfs共享存储服务

nfs 是一种网络文件系统,需要依赖rpc进行过程调度 注意nfs只验证id,验证用户名,并且只能在类unix os上进行文件共享服务,由于它的脆弱的验证机制,所以不适宜在internet上工作,在内网使用...

老孟的Linux私房菜
33分钟前
8
0
【F5小常识】F5的 Web 应用防火墙 (WAF)有什么优势?

     现如今传统防火墙已无法满足企业安全需求,网络攻击大多发生在应用层和网络层故障,且呈上升趋势,传统的防火墙存在着很大的不足之处,包括无法检测加密的Web流量、无法扩展深度检测...

梅丽莎好
44分钟前
4
0
整合到 Mockito 2

为了能够持续改进 Mockito 和在未来提升测试体验,我们希望你能够升级到 Mockito 2.10!Mockito 按照语义化版本(semantic versioning)的方式对版本进行编排,并且只在主版本升级的时候包含...

honeymoose
44分钟前
4
0
spring boot actuator

actuator 是监控系统健康的工具,引入 spring-boot-starter-actuator会暴露一些endpoint. 可通过如下配置来配置这些endpoint的基本配置: 可通过http:${url}:28081/management/actuator/*来访...

ZH-JSON
50分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部