SpringMVC-执行流程(含Spring)

222 阅读3分钟

前言

在告别了 Spring 的火海后,站在我面前的,又是一座刀山——SpringMVC,它是基于Spring的一种更趋向于前端的框架,这篇博客中,详细讲一讲SpringMVC的执行流程

正文

在正式开始前,先回顾一下Spring的执行流程,不想看的直接跳吧。

Spring执行流程

  • 读取配置文件或配置类,获取初步的信息,并将这些信息封装到BeanDefinition中,之后存入BeanDeinitionMap
  • ApplicatioonContext底层遍历beanDefinitionMap,并创建实例对象,
    • 创建对象的过程中存在BeanDefinitionRegistryPostProcessor(注册器)对该对象的注册操作,存在BeanFactoryPostProcessor 的增强操作等等..
    • 期间如果存在循环引用,则该beanDefinition的实例对象会被存入三级缓存(singletonFactories),并同时创建另外一个bean的实例对象,因为所依赖的bean已经在三级缓存中,所以它可以正常生成实例对象。

      这一步完成后,已经实例化的对象会被存入一级缓存(singletonObjects),同时,处于三级缓存的实例对象进入二级缓存(earlySingletonObjects),之后删除该对象在三级缓存存在的证明以节约空间。
  • 当执行getBean()方法时从容器的一二级缓存中获取对象并返回

SpringMVC执行流程

在 Javaweb 中没什么存在感的 web.xml 在这里可算是大放异彩呀

  • 在web.xml中配置Servlet与监听器,其中监听器用来减少对Spring容器的引用,即在服务器启动时就优先创建容器,而不需要在请求到来时再一次又一次的调用容器,要达到这种效果,就联系到之前Javaweb中的各种域了

request域:仅在请求中有效,在进行转发操作时可以共享数据,在重定向时不能共享数据

session域:仅在一次会话中有效,存在时间默认为半小时,在会话结束后会关闭

ApplicationContext域:仅在一次服务器的启动到关闭过程中有效,是范围最大的域,其中储存的数据都具有唯一性,即不能被覆盖。

另外,忘记补代码啦,啊哈哈。。。如下:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:Spring-web1.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
  • 接下来就是创建一个Controller,因为种种原因,SpringMVC的操作基于Controller,并提供映射路径.(这里很多东西我不懂,不敢乱说(流汗流汗)),直接上代码吧:(注意,这个Controller需要被存入Spring容器才能被直接调用,所以应该在 Spring-web1.xml 中对这个Controller进行配置,这个Spring-web1.xml是上面代码中classpath后面的文件,千万不要瞎搞哦,报错就不好玩了,大把的红色报错真的很搞心态
package Web1.MyWebControllers;

import Web1.MyWebService.MyWebService1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@Controller
public class MyControllers1 {

    @Autowired
    private MyWebService1 myWebService1;

    /**
     * 通过控制器执行方法时,需要注意该方法的返回值应该是一个视图名称,即 网页名
     * @return 一个网页路径名,在该网页是<b>JSP</b>时,可以不写/
     */
    @RequestMapping("/show")
    public  String  show(){
        System.out.println("show ..."+myWebService1);
        return "hello.jsp";
    }
    //http://localhost:8080/Spring_web_war/show
    }

在以上代码中@RequestMapping用来指定访问路径,对应我的项目文件,URL是最下面的注释。

  • 通过Tomcat开启服务器吧,好像已经差不多了。