SpringMVC的原理

SpringMVC的MVC即模型-视图-控制器,该框架围绕一个DispatcherServlet设计,DispatcherServlet会把请求分发给各个处理器进行处理。SpringMVC的工作流程如下图所示。
在这里插入图片描述

  1. 浏览器发起HTTP请求,发送给DS;
  2. DS寻找映射处理器HandlerMapping,这个对象是个Mapping对象,保存了URL->方法的映射关系,通过HandlerMapping找到对应的Controller;
  3. 调用Controller;
  4. Controller调用Service;
  5. Controller返回ModelAndView,ModelAndView包含了数据Model和视图名称;
  6. 通过试图处理器ViewResolver找到对应的视图View,并将数据Model交给视图View渲染;
  7. 返回HTTP响应。

精简后的源码如下:

	@Override
	protected void doService(HttpServletRequest request, HttpServletResponse response) {
		doDispatch(request, response); // 在doservice方法中调用doDispath方法
	}

	protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {

		// 根据当前请求在HandlerMapping中找到Controller,HandlerMapping是个接口,一般在其实现类RequestMappingHandlerMapping中调用方法,返回的controller被包装在HandlerExecutionChain类中,HandlerExecutionChain中主要包含Controller和Interceptor拦截器
		HandlerExecutionChain mappedHandler = getHandler(processedRequest);
		// 如果没找到,返回404
		if (mappedHandler == null) {
			noHandlerFound(processedRequest, response);
			return;
		}
		// 根据当前controller找到HandlerAdapter,一般是RequestMappingHandlerAdapter
		HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
		// 执行前置拦截器
		if (!mappedHandler.applyPreHandle(processedRequest, response)) {
			return;
		}
		// 调用handle方法返回ModelAndView  
		ModelAndView  mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
		// 调用后置拦截器
		mappedHandler.applyPostHandle(processedRequest, response, mv);
		processDispatchResult(processedRequest, response, mappedHandler, mv);
		
	}

	private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
			@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,
			@Nullable Exception exception) throws Exception {
		// 通过ViewResolver返回View
		if (mv != null && !mv.wasCleared()) {
			render(mv, request, response);
		}
	}
	protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
		// Determine locale for request and apply it to the response.
		Locale locale =
				(this.localeResolver != null ? this.localeResolver.resolveLocale(request) : request.getLocale());
		response.setLocale(locale);

		View view;
		String viewName = mv.getViewName();
		if (viewName != null) {
			// 通过viewName解析出View
			view = resolveViewName(viewName, mv.getModelInternal(), locale, request);

		}
		// 视图渲染
		view.render(mv.getModelInternal(), request, response);
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC是Spring框架中用于开发Web应用程序的模块,它的核心原理是基于前端控制器、处理器映射器、处理器适配器和视图解析器等组件的协作。 1. 前端控制器(Front Controller):Spring MVC的核心是一个Servlet,称为DispatcherServlet,它充当了应用程序的前端控制器。当请求到达应用程序时,DispatcherServlet负责接收请求并将其分派给相应的处理器。 2. 处理器映射器(Handler Mapping):处理器映射器负责将请求映射到相应的处理器(Controller)上。它根据请求的URL或其他条件来确定请求应该由哪个处理器来处理。 3. 处理器适配器(Handler Adapter):处理器适配器负责将请求发送给正确的处理器,并根据处理器的类型和方法来调用相应的方法进行处理。处理器适配器能够适配各种类型的处理器,包括带注解的控制器、基于接口的控制器等。 4. 控制器(Controller):控制器是Spring MVC应用程序的核心组件,它负责处理请求并返回相应的结果。控制器可以是一个普通的Java类,通过注解或配置来标识其为一个控制器,并定义处理请求的方法。 5. 视图解析器(View Resolver):视图解析器负责将处理器返回的逻辑视图名解析为实际的视图对象。它可以根据配置文件或约定来解析视图,将数据模型与视图进行合并,并最终生成响应结果。 6. 视图(View):视图是最终呈现给用户的界面,它可以是JSP、HTML、JSON、XML等格式。控制器将处理结果传递给视图,由视图负责生成最终的响应内容。 在整个请求处理过程中,前端控制器DispatcherServlet负责协调各个组件的工作,并提供了一种灵活的扩展机制,可以通过拦截器、异常处理器等进行功能增强和定制。Spring MVC原理是基于这些组件的协作,实现了请求的分发、处理和响应等功能,使得开发Web应用程序更加简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值