美文网首页Java相关
Spring - MVC实现

Spring - MVC实现

作者: 万福来 | 来源:发表于2020-04-12 16:15 被阅读0次

    SpringMVC介绍

    SpringMVC是Spring提供给WEB应用的MVC框架,MVC框架一般来说由三部分组成:
    Model:模型层,一般由java bean完成,主要是进行数据库操作;
    View:视图层,用于前端展示,比如jsp、html等;
    Controller:控制层,链接前后端,处理用户请求,起着承前启后的作用;
    早期的MVC模式中,Model由java bean扮演,View由jsp扮演,Controller由Servlet扮演,三者组成一个三角形的MVC框架,使得前后端有了一定的分离,而且控制器和模型层的分离使得很多java代码得以重用,但是随着前端设备的多样化和前端各种技术的兴起,前端和后段的交互只变成json数据的交互,导致后端对于jsp的依赖减少,这就出现了Spring MVC的架构。它的最大特点是结构比较松散,在Spring MVC中能够使用JSP、JSON、XML、PDF等各类视图,所以它能满足手机、PC、平板等不同设备中的WEB请求。

    SrpingMVC初始化过程

    springmvc的核心是DispatcherServlet,它是前端控制器,负责拦截客户端发过来的请求,然后解析请求进行分发。DispatcherServlet是基于Servlet接口开发的,所以使用springmvc先在web.xml中配置DispatcherServlet;每个Servlet在第一次加载时都会调用其init()方法,但是DispatcherServlet本身没有这个方法,所以系统会去它父类寻找init()方法,最后在父类HttpServletBean找到并调用。

    @Override
        public final void init() throws ServletException {
            // Set bean properties from init parameters.
            PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
            if (!pvs.isEmpty()) {
                try {
                    BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
                    ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
                    bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
                    initBeanWrapper(bw);
                    bw.setPropertyValues(pvs, true);
                }
                catch (BeansException ex) {
                    if (logger.isErrorEnabled()) {
                        logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
                    }
                    throw ex;
                }
            }
            // 让子类去实现类似初始化的操作,这就是模版方法模式的使用吧
            initServletBean();
        }
    

    下面是子类org.springframework.web.servlet.FrameworkServlet#initServletBean的源码

    @Override
        protected final void initServletBean() throws ServletException {
            getServletContext().log("Initializing Spring " + getClass().getSimpleName() + " '" + getServletName() + "'");
            if (logger.isInfoEnabled()) {
                logger.info("Initializing Servlet '" + getServletName() + "'");
            }
            long startTime = System.currentTimeMillis();
            try {
                          //开始初始化web应用上下文
                this.webApplicationContext = initWebApplicationContext();
                initFrameworkServlet();//空方法,可以留给子类进行扩展
            }
            catch (ServletException | RuntimeException ex) {
                logger.error("Context initialization failed", ex);
                throw ex;
            }
                  //other code...
        }
    
    /**
         * This implementation calls {@link #initStrategies}.
         */
        @Override
        protected void onRefresh(ApplicationContext context) {
            initStrategies(context);
        }
    
        /**
         * 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) {
            initMultipartResolver(context);
            initLocaleResolver(context);
            initThemeResolver(context);
            initHandlerMappings(context);
            initHandlerAdapters(context);
            initHandlerExceptionResolvers(context);
            initRequestToViewNameTranslator(context);
            initViewResolvers(context);
            initFlashMapManager(context);
        }
    

    总结springMVC初始化过程

    web应用启动时扫描web.xml文件,扫描到DispatcherServlet,对其进行初始化
    调用DispatcherServlet父类的父类HttpServletBean的init()方法,把配置DispatcherServlet的初始化参数设置到DispatcherServlet中,调用子类FrameworkServlet的initServletBean()方法
    initServletBean()创建springMVC容器实例并初始化容器,并且和spring父容器进行关联,使得mvc容器能访问spring容器里面的bean,之后调用子类DispatcherServlet的onRefresh(ApplicationContext context)方法,onRefresh(ApplicationContext context)进行DispatcherServlet的策略组件初始化工作,url映射初始化,文件解析初始化,运行适配器初始化等等。

    Servlet的作用:

    • HttpServletBean:主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。
    • FrameworkServlet:将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。
    • DispatcherServlet:初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

    相关文章

      网友评论

        本文标题:Spring - MVC实现

        本文链接:https://www.haomeiwen.com/subject/kdfbmhtx.html