手写简易springboot框架

手写简易springboot框架

本文由观看蚂蚁课堂手写springboot视频后,本地测试并整理而来。

1.手写Tomcat运行程序

步骤如下:
(1)在pom.xml中添加依赖:
<dependency>
      <groupId>org.apache.tomcat.embedgroupId>
      <artifactId>tomcat-embed-coreartifactId>
      <version>8.5.34version>
    dependency>

    <dependency>
      <groupId>org.apache.tomcat.embedgroupId>
      <artifactId>tomcat-embed-elartifactId>
      <version>8.5.34version>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webartifactId>
      <version>5.0.9.RELEASEversion>
    dependency>
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webmvcartifactId>
      <version>5.0.9.RELEASEversion>
    dependency>
      
    <dependency>
      <groupId>org.apache.tomcatgroupId>
      <artifactId>tomcat-jasperartifactId>
        <version>8.5.16version>
    dependency>

可以看到不需要加入任何springboot的依赖

(2)手动创建Tomcat底层执行程序 servlet代替springMVC功能:
package com.lqr.HWspringboot.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("this is index...tomcat");
    }
}
(3)创建Tomcat运行程序
public class Test {
    private static int PORT = 8080;
    private static String CONTEXT_PATH = "/hwtomcat";
    private static String SERVER_NAME = "indexServlet";
    public static void main( String[] args ) throws LifecycleException {
//        创建Tomcat服务器
        Tomcat tomcatServer = new Tomcat();
//        设置端口号
        tomcatServer.setPort(PORT);
//        是否设置自动部署
        tomcatServer.getHost().setAutoDeploy(false);
//        创建上下文
        StandardContext standardContext = new StandardContext();
        standardContext.setPath(CONTEXT_PATH);
//        监听上下文
        standardContext.addLifecycleListener(new Tomcat.FixContextListener());
//        给Tomcat容器添加standardContext
        tomcatServer.getHost().addChild(standardContext);
//        创建servlet
        tomcatServer.addServlet(CONTEXT_PATH,SERVER_NAME,new IndexServlet());
//        servleturl映射
        standardContext.addServletMappingDecoded("/index",SERVER_NAME);
        tomcatServer.start();
        System.out.println("tomcat启动成功...");
//        异步进行接收请求
        tomcatServer.getServer().await();
    }
}

启动项目,访问http://127.0.0.1:8080/hwtomcat/index即可看到效果:
手写简易springboot框架_第1张图片

2.手写springMVC注解方式启动

依赖与上一节相同

步骤如下:
(1)创建SpittrWebAppInitializer类

继承于AbstractAnnotationConfigDispatcherServletInitializer类,这个类是负责配置DispatcherServlet、初始化SpringMVC容器、spring容器。

getRootConfigClasses()用于加载根配置信息,初始化spring容器,

getServletConfigClasses()用于加载springMVC配置信息,初始化springMVC容器

getServletMappings()用于配置拦截url映射,这里“/”表示拦截所有请求

package com.lqr.HWspringboot.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class SpittrWebAppInitializer 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[] { "/" };
    }
}
(2)创建WebConfig类用于配置SpringMVC
package com.lqr.HWspringboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.lqr.HWspringboot.controller" })
public class WebConfig extends WebMvcConfigurerAdapter {

    //需要配置视图转换器
    //创建SpringMVC视图解析器
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        // 可以在JSP页面中通过${}访问beans
        viewResolver.setExposeContextBeansAsAttributes(true);
        return viewResolver;
    }
}
(3)创建RootConfig类用于配置Spring容器
package com.lqr.HWspringboot.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.lqr.HWspringboot")
public class RootConfig {

}
(4)更改上一节的手写Tomcat运行程序,将读取自己创建的Servlet改为读取项目生成的class文件,即读取springMVC生成的Servlet对象
package com.lqr.HWspringboot.Tomcat;

import com.lqr.HWspringboot.servlet.IndexServlet;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;

import java.io.File;

public class Test {
    private static int PORT = 8080;
//    private static String CONTEXT_PATH = "/hwtomcat";
//    private static String SERVER_NAME = "indexServlet";
    public static void main( String[] args ) throws LifecycleException {
//        创建Tomcat服务器
        Tomcat tomcatServer = new Tomcat();
//        设置端口号
        tomcatServer.setPort(PORT);
//        读取项目路径 加载静态资源
        StandardContext standardContext = (StandardContext)tomcatServer.addWebapp("/",
                new File("src/main").getAbsolutePath());
//        禁止重新载入
        standardContext.setReloadable(false);
//        class文件读取地址
        File additionWebInfClasses = new File("target/classes");
//        创建WebRoot
        WebResourceRoot resources = new StandardRoot(standardContext);
//        tomcat内部读取Class执行
        resources.addPreResources(
                new DirResourceSet(resources,"/WEB-INF/classes",
                        additionWebInfClasses.getAbsolutePath(),"/")
        );
        tomcatServer.start();
        System.out.println("tomcat启动成功...");
//        异步进行接收请求
        tomcatServer.getServer().await();
    }
}

(5)补充业务逻辑
手写简易springboot框架_第2张图片
比较简单,这里就不给出具体代码了

启动程序,访问http://127.0.0.1:8080/index即可看到效果:
手写简易springboot框架_第3张图片

你可能感兴趣的:(springboot,springboot框架理解)