纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。

代码实现。
1.pom.xml文件,需要依赖的jar包。

<dependencies>
        <!--Java语言操作Tomcat-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>8.5.23</version>
        </dependency>
        <!--tomcat对jsp的支持-->
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jasper</artifactId>
            <version>7.0.47</version>
        </dependency>
        <!--spring-web-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <!--spring-webmvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
    </dependencies>

2.配置SpringMVC、Spring、DispatcherServlet的初始化类:

/**
 * 加载springmvc====dispatcherservlet
 */
public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    //加载根配置信息 spring核心
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }
    //springmvc 加载配置信息
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }
    //springmvc拦截的url映射,拦截所有请求
    protected String[] getServletMappings() {
        return new String[]{"/"};//拦截所有请求
    }
}

AbstractAnnotationConfigDispatcherServletInitializer这个类负责"初始化Spring容器、SpringMVC容器、配置DispatcherServlet"。

  • getRootConfigClasses()方法用于获取Spring应用容器的配置文件,这里我们给定预先定义的RootConfig.class;
  • getServletConfigClasses负责获取Spring MVC应用容器,这里传入预先定义好的WebConfig.class;
  • getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。

SpringMVC配置,加载SpringMVC容器。这里的@Configuration相当于springmvc.xml配置文件;@ComponentScan(basePackages = "com.jiuyue.controller")相当于配置文件sringmvc.xml的扫描controler应该还有印象吧;@EnableWebMvc则是开启SpringMVC功能。

/**
 * SpringMVC配置信息
 */
@Configuration  //相当于配置文件springmvc.xml
@EnableWebMvc //开启SpringMVC功能
@ComponentScan(basePackages = "com.jiuyue.controller")//扫springMVC的
public class WebConfig extends WebMvcConfigurerAdapter {
    //配置视图转换器
}

根配置,加载Spring容器。

/**
 * 根配置
 */
@Configuration
@ComponentScan(basePackages = "com.jiuyue")//扫整个spring项目的
public class RootConfig {
}

3.启动类

public class APP {
    public static void main(String[] args) throws ServletException, LifecycleException {
        //使用Java内置tomcat运行SpringMVC框架
        //原理:tomcat加载到SpringMVC注解启动方式,就会创建SpringMVC容器
        start();
    }
    public static void start() throws LifecycleException, ServletException {
        //创建tomcat服务器
        Tomcat tomcatServer = new Tomcat();
        //设置port
        tomcatServer.setPort(8085);
        //读取项目路径,‘/‘可以加载静态资源
        StandardContext ctx = (StandardContext) tomcatServer.addWebapp("/", new File("src/main").getAbsolutePath());
        //禁止重新载入
        ctx.setReloadable(false);
        //class文件读取地址
        File addtionWebInfoClasses = new File("target/classes");
        //创建WebRoot
        WebResourceRoot resources = new StandardRoot(ctx);
        //tomcat内部读取class文件进行执行
        //内部虚拟Tomcat空间
        resources.addPreResources(new DirResourceSet(resources,"/WEB-INF/classes",addtionWebInfoClasses.getAbsolutePath(),"/"));
        tomcatServer.start();
        System.out.println("Java语言创建Tomcat启动成功");
        //异步进行接收请求
        tomcatServer.getServer().await();

    }
}

controller类

@Controller
public class IndexController {
    @RequestMapping(value = "/index",produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String index(){
        return "纯手写Java语言实现SpringBoot注解启动SpringMVC容器";
    }
}

访问效果图

配置视图解析器

直接下WebConfig配置类中配置就可以,WebConfig就相当于springmvc.xml配置文件,前面我们在里面配置了扫包与开启springMVC功能,接下来就在下面继续配置视图解析器。

@Configuration  //相当与配置文件
@EnableWebMvc //开启SpringMVC功能
@ComponentScan(basePackages = "com.jiuyue.controller")//扫springMVC的
public class WebConfig extends WebMvcConfigurerAdapter {
    //配置视图转换器
    //SpringMVC视图解析器
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        //可以在JSP页面中通过${}访问bean
        viewResolver.setExposeContextBeansAsAttributes(true);
        return viewResolver;
    }
}

JspController控制器类

@Controller
public class JspController {
    @RequestMapping(value = "/jspIndex")
    public String jspIndex(){
        return "jspIndex";
    }
}

WEB-INF/jsp目录

访问jspIndex返回jsp页面

业务逻辑层

将根配置,配置到初始化类

/**
 * 根配置
 */
@Configuration
@ComponentScan(basePackages = "com.jiuyue")//扫整个spring项目的
public class RootConfig {
}

public class SpringWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    //加载根配置信息 spring核心
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }
    //springmvc 加载配置信息
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }
    //springmvc拦截的url映射,拦截所有请求
    protected String[] getServletMappings() {
        return new String[]{"/"};//拦截所有请求
    }
}

Service类

@Service
public class IndexService {
    public String index(){
        return "纯手写Java语言实现SpringBoot注解启动SpringMVC容器";
    }
}

控制器类

    @ResponseBody
    @RequestMapping(value = "/index2",produces = "text/html;charset=UTF-8")
    public String index2(){
        return indexService.index();
    }

如果文章有错的地方欢迎指正,大家互相交流。

原文地址:https://blog.51cto.com/14311648/2412945

时间: 2024-10-12 02:39:10

纯手写SpringBoot框架之注解方式启动SpringMVC容器的相关文章

Spring Boot2.0之注解方式启动Springmvc

回顾下springmvc原理图: DispatcherServlet是Spring MVC的核心,每当应用接受一个HTTP请求,由DispatcherServlet负责将请求分发给应用的其他组件. 在旧版本中,DispatcherServlet之类的servlet一般在web.xml文件中配置,该文件一般会打包进最后的war包种:但是Spring 3引入了注解,我将要介绍,如何基于注解配置Spring MVC. 1.Spring mvc无配置文件夹,采用注解方式启动. 把配置的内容 转换为 Ja

vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件

vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库 一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件.iScroll不仅仅是 滚动.它可以处理任何需要与用户进行移动交互的元素.在你的项目中包含仅仅4kb大小的iScroll,你的项目便拥有了滚动,缩放,平移,无限滚动,视差滚动,旋转功能.iScroll的强大毋庸置疑,本人也非常欢迎大家使用iScr

springmvc 动态代理 JDK实现与模拟JDK纯手写实现。

首先明白 动态代理和静态代理的区别: 静态代理:①持有被代理类的引用  ② 代理类一开始就被加载到内存中了(非常重要) 动态代理:JDK中的动态代理中的代理类是动态生成的.并且生成的动态代理类为$Proxy0 静态代理实例1.创建一个接口: package proxy; public interface People { public void zhaoduixiang()throws Throwable; } 2.创建一个实现类,张三,张三能够吃饭,张三可以找对象 package proxy;

跟着刚哥学习Spring框架--通过注解方式配置Bean(四)

组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件. 特定组件包括: 1.@Component:基本注解,识别一个受Spring管理的组件 2.@Respository:标识持久层组件 3.@Service:标识业务层组件 4.@Controller:标识表现层组件 Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称 当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件

纯手撸web框架

纯手撸web框架 一.Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览器,需要强调的一点是:S端由server和application两大部分构成,如图所示: 上图:Web应用组成 二.手鲁web应用 2.1 基本版 import socket """ @author RansySun @create 2019-10-18-11:

手写Spring框架,加深对Spring工作机制的理解!

在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越来越轻松,我们用 Spring Boot 分分钟可以新建一个Web项目. 记得自己刚开始工作的时候还是在用Servlet写Web项目,自己写数据库连接池,用原生JDBC操作数据库,好了不发散了.回到这篇文章的主题,今天通过手写Spring框架,帮大家深入了解一下Spring的工作机制,文中涉及的代码

纯手写wcf代码,wcf入门,wcf基础教程

<pre name="code" class="cpp">/* 中颖EEPROM,使用比较方便,但有个注意点,就是每次无论你写入 什么数据或者在哪个地址写数据,都需要将对 对应的块擦除,擦 除后才能写入成功. */ #define SSPWriteFlag 0x5A #define SSPEraseFlag 0xA5 //数据区 扇形区1 #define ADDR_START1 (uint16)0x100 //数据存储区起始地址 #define ADDR

SQL纯手写创建数据库到表内内容

建表啥的只点点鼠标,太外行了,不如来看看我的纯手写,让表从无到有一系列:还有存储过程临时表,不间断的重排序: 一:建数据库 1create Database Show 2 on 3 primary 4 ( 5 name= Show_data , 6 filename= 'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\Show.mdf' , 7 size=10MB, 8 maxsize=UNLIMITED,

qt之旅-1纯手写Qt界面

通过手写qt代码来认识qt程序的构成,以及特性.设计一个查找对话框.下面是设计过程 1 新建一个empty qt project 2 配置pro文件 HEADERS += Find.h QT += widgets SOURCES += Find.cpp main.cpp 3 编写对话框的类 代码如下: //Find.h #ifndef FIND_H #define FIND_H #include <QDialog> class QCheckBox; class QLabel; class QL