Tomcat嵌入式开发 (三) Mapping注册及入参处理

简介

本章实现 @RestController标注Controller、@RequestMapping注册url、@RequestBody解析json请求参数、@RequestParam标注请求入参。

创建Application启动类

首先我们需要一个入口用起来配置以及启动Tomcat。先简单的说一下Tomcat启动流程

  1. 初始化Tomcat(基本参数配置)
  2. 扫描启动类对应包下的所有类
  3. 扫描标注了RestController的类
  4. 注册Servlet(添加Handler到context中)
  5. 使用DispatcherServlet 统一处理所有请求,并转发到对应的Handler中进行处理
  6. 启动Tomcat

TomcatStartApplication

public class TomcatStartApplication {

    private static final Log log = LogFactory.getLog(TomcatStartApplication.class);
    
    public static void run(Class<?> primarySource) {

        log.debug(" StartBoot begin run ... ");
        try {

            TomcatStarter starter = TomcatStarter.init();

            //获取启动类对应包下的所有类
            Set<Class<?>> classes = ClassUtil.getChildClass(primarySource.getPackageName());

            //扫描标注了RestController的类
            Set<Class<?>> servletClassSet = ClassUtil.findContainAnnotation(classes, RestController.class);

            //注册Servlet
            ServletRegister servletRegister = new ServletRegister();
            servletRegister.registerServlet(servletClassSet);

            //添加dispatcherServlet统一控制器
            //Tomcat会将所有请求提交到dispatcherServlet,dispatcherServlet再根据uri调用对应的方法
            TomcatStarter.addServlet("dispatcherServlet", new DispatcherServlet(), "/");

            //启动Tomcat
            starter.startUp();

        } catch (LifecycleException e) {
            e.printStackTrace();
            log.error(" StartBoot run fail  ");
        }
    }
}

创建Tomcat启动类

​ 我们创建一个Tomcat的启动类,用于初始化以及启动Tomcat,并提供添加Servlet到Tomcat中的方法。

​ init()方法中的代码都是上一章所讲述过的,这章不重复讲述,这个类只是对上一章的代码简单封装了一下,忘记的同学可以打开上一章博文回顾一下~

public interface WebApplicationInitializer {
    void startUp() throws LifecycleException;
}


public class TomcatStarter implements WebApplicationInitializer{

    public static Tomcat tomcat;
    public static StandardContext defaultContext;
    //默认端口
    public static final int PORT = 8888;
    //默认项目路径
    public static final String CONTEXT_PATH = "";

    public static TomcatStarter init() {
        TomcatStarter starter = new TomcatStarter();
        tomcat = new Tomcat();

        //创建上下文
        defaultContext= new StandardContext();
        defaultContext.setPath(CONTEXT_PATH);
        defaultContext.addLifecycleListener(new Tomcat.FixContextListener());
        tomcat.getHost().addChild(defaultContext);

        Connector connector = new Connector();
        connector.setPort(PORT);
        tomcat.setConnector(connector);

        return starter;
    }

    @Override
    public void startUp() throws LifecycleException {
        tomcat.start();
    }

    public static void addServlet(String servletName, Servlet servlet,String pattern) {
        tomcat.addServlet(CONTEXT_PATH,servletName , servlet);
        defaultContext.addServletMappingDecoded(pattern,servletName);
    }
}

注册Servlet

注意: 由于我们只注册了一个 "/" 路径到Tomcat中,该路径会将所有请求解析到DispatcherServlet,再由DispatcherServlet进行处理请求,请求规则如下图:

三-DispatchServlet请求模型

这个时候我们就需要把所有类扫描出来,并找出使用@RestController注解标注的类,并把对应所需要调用的方法注册成Handler。

更多文章详情请移步http://blog.seasedge.cn/archives/66.html

码字不易~请多多支持 *_*

Image placeholder
fifi
未设置
  12人点赞

没有讨论,发表一下自己的看法吧

推荐文章
侵入式服务治理方案,读这一篇就够

尽管在程序执行效率上,Java不如C、C++,在开发效率、易用性以及学习难度上,Java又不如Ruby、Python、Go,但Java无疑是当今后端系统开发中使用最为广泛的语言。Java所累积的大量生

tomcat的重启

点击下方截图可插入当前视频播放画面,了解更多Mackdown语法可以点击上方?图标jsp运行不需要重启tomcat而servlet需要

写SERVLET再重启tomcat 后台模板放在新建的manage

写SERVLET再重启tomcat后台模板放在新建的manage

原生线程池这么强大,Tomcat 为何还需扩展线程池?

前言Tomcat/Jetty是目前比较流行的Web容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度。JDK提高完整线程池实现,但是Tomcat/Jetty都没有直接使用。

TiDB Binlog 组件正式开源

TiDBBinlog组件用于收集TiDB的binlog,并准实时同步给下游,如:TiDB/MySQL等。该组件在功能上类似于MySQL的主从复制,会收集各个TiDB实例产生的binlog,并按事务提交

校准产品质量,把控出海航向,腾讯WeTest《2019中国移动游戏质量白皮书》正式开放预约

每当步入一个新的年份,温故知新是我们常常做的事。对于不少游戏人来说,刚过去的2019年是一个新起点,也是一个修养生息、应对挑战的年份。这一年,国产网络游戏版号新政的落实,使得国内市场产品门槛更加抬高,

Pandas数据处理三板斧——map、apply、applymap详解

微信公众号:「Python读财」如有问题或建议,请公众号留言在日常的数据处理中,经常会对一个DataFrame进行逐行、逐列和逐元素的操作,对应这些操作,Pandas中的map、apply和apply

Go 中使用 memcache 存储对象

之于B/S端用http连接,像mysql,redis,memcache这种服务端之间的交流,通常直接采用TCP通信。而对于缓存的内存存储,过期时间是必备,进行必要的对象序列化编码也不可缺。本文用me

OceanBase数据库创始人阳振坤分享征战6088万tpmC的艰辛之路

前言:中国人民大学常被誉为是“中国人文社会科学的最高学府”,其实人民大学也是“中国数据库的发源地”。由中国人民大学教授萨师煊与王珊合作编写的《数据库系统概论》是国内第一部系统阐明数据库原理、技术和理论

中国已成为NVIDIA注册开发者数量最多的国家

在过去几年中,人工智能(AI)技术得到了飞速的发展,为医疗、电信、金融、零售、交通、制造……等等越来越多的行业带来了巨大的变革,极大地推动了行业进步与产业升级。整个过程中,GPU加速计算为AI应用的运

《从PPTV网络视频,到PPIO区块链分布式存储》

摘要:2019年11月26日,同济创业谷与PPIOCodeTalks联合举办了《创新X-区块链与创新创业》区块链技术分享会,本期我们为读者带来主题分享--《从PPTV网络视频,到PPIO区块链分布式存

Spring Boot 中关于自定义异常处理的套路!

在SpringBoot项目中,异常统一处理,可以使用Spring中@ControllerAdvice来统一处理,也可以自己来定义异常处理方案。SpringBoot中,对异常的处理有一些默认的策略,我们

SpringBoot个人应用开发框架(SpringBoot版本2.1)+IDEA

前言: 此笔记为本人首个SpringBoot项目框架学习实践记录,期间参考了许多大神的笔记和心得。 参考文档如下: 项目git地址: 一、创建SpringBoot工程 1.1创建父POM工程结

Nginx 之父被抓:Rambler集团声称他工作时间开发了NGINX,要求全部代码所有权

俄罗斯搜索引擎Rambler.ru声称拥有NGINX代码的全部所有权。俄罗斯警方近日突击搜查了F5Networks子公司NGINX的莫斯科办事处,NGINX公司开发了互联网上最受欢迎的Web服务器

BAT大牛推荐开发人员必备Spring源码剖析文档,深度剖析Spring

为什么学习读源码我们每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。

从词袋到transfomer,梳理十年Kaggle竞赛,看自然语言处理的变迁史

大数据文摘出品来源:medium编译:LYLM、胡笳自2010年创办以来,Kaggle作为著名的数据科学竞赛平台,一直都是机器学习领域发展趋势的风向标,许多重大突破都在该平台发生,数以千计的从业人员参

Spring-SpringAOP原理,手写Spring事务框架

一、Spring核心知识Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由RodJohnson在其著作ExpertOne-On-OneJ2EEDevelopm

注册登录要点击两次终极解决方案

概述 社区vue基础教程用到自定义的v-validator指令,首次加载表单登录或注册页,都需要点击两次才能正常跳转对该问题,本文提供了两个解决办法,一个是settimeout,另一个则利用js事件

微服务架构之「 服务注册 」

微服务架构是一个庞大复杂的工程,为什么说它庞大复杂呢?因为想要做好微服务,就必须先要建设好微服务所需的一系列基础设施和组件。我在前面的文章《架构设计之「微服务入门」》中已经初步介绍过了这些组件,包括:

快看,我们的分布式缓存就是这样把注册中心搞崩塌

写公众号两年以来,每当有机会写故障类主题的时候,我都会在开始前静静地望着显示器很久,经过多次煎熬和挣扎之后才敢提起笔来,为什么呢?因为这样的话题很容易招来吐槽,比如“说了半天,不就是配置没配好吗?”,

Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘

问题描述上周四晚刚回到家,就接到了软负载同学的电话,说是客户线上出了故障,我一听”故障“两个字,立马追问是什么情况,经过整理,还原出线上问题的原貌:客户使用了Dubbo,注册中心使用的是Nacos,在

Nacos 服务注册与发现原理分析

Nacos另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服务是非常重要的,而在Nacos中服务更被称为他的一等公民。Nacos支持几乎所有主流类

IOS APP开发需要学什么知识和技能?

IOSAPP开发需求学什么学问和技艺?目前IOS系统的APP和Android系统的APP,是手机APP开发的两大主流。就拿IOS系统的APP开发来说,需求和安卓完整不同的开发言语和工具。本文着重来讨论

PPT 分享:《10 个 Go Web 开发框架对比》

在SpeakerDeck上发现一个不错的PPT分享给大家。 原链接:https://speakerdeck.com/fedir/comparison-o... 百度盘链接:https://pan.ba

python 处理多个异常

处理多个异常 我们可以使用三种方法来处理多个异常。 第一种方法需要把所有可能发生的异常放到一个元组里。像这样: try: file=open('test.txt','rb') except(IOErr