Tomcat嵌入式開發(fā) (三) Mapping注冊及入?yún)⑻幚?/h2>

簡介

本章實現(xiàn) @RestController標(biāo)注Controller、@RequestMapping注冊url、@RequestBody解析json請求參數(shù)、@RequestParam標(biāo)注請求入?yún)ⅰ?/p>


創(chuàng)建Application啟動類

首先我們需要一個入口用起來配置以及啟動Tomcat。先簡單的說一下Tomcat啟動流程

  1. 初始化Tomcat(基本參數(shù)配置)
  2. 掃描啟動類對應(yīng)包下的所有類
  3. 掃描標(biāo)注了RestController的類
  4. 注冊Servlet(添加Handler到context中)
  5. 使用DispatcherServlet 統(tǒng)一處理所有請求,并轉(zhuǎn)發(fā)到對應(yīng)的Handler中進(jìn)行處理
  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();

            //獲取啟動類對應(yīng)包下的所有類
            Set<Class<?>> classes = ClassUtil.getChildClass(primarySource.getPackageName());

            //掃描標(biāo)注了RestController的類
            Set<Class<?>> servletClassSet = ClassUtil.findContainAnnotation(classes, RestController.class);

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

            //添加dispatcherServlet統(tǒng)一控制器
            //Tomcat會將所有請求提交到dispatcherServlet,dispatcherServlet再根據(jù)uri調(diào)用對應(yīng)的方法
            TomcatStarter.addServlet("dispatcherServlet", new DispatcherServlet(), "/");

            //啟動Tomcat
            starter.startUp();

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


創(chuàng)建Tomcat啟動類

? 我們創(chuàng)建一個Tomcat的啟動類,用于初始化以及啟動Tomcat,并提供添加Servlet到Tomcat中的方法。

? init()方法中的代碼都是上一章所講述過的,這章不重復(fù)講述,這個類只是對上一章的代碼簡單封裝了一下,忘記的同學(xué)可以打開上一章博文回顧一下~

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


public class TomcatStarter implements WebApplicationInitializer{

    public static Tomcat tomcat;
    public static StandardContext defaultContext;
    //默認(rèn)端口
    public static final int PORT = 8888;
    //默認(rèn)項目路徑
    public static final String CONTEXT_PATH = "";

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

        //創(chuàng)建上下文
        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進(jìn)行處理請求,請求規(guī)則如下圖:

三-DispatchServlet請求模型


這個時候我們就需要把所有類掃描出來,并找出使用@RestController注解標(biāo)注的類,并把對應(yīng)所需要調(diào)用的方法注冊成Handler。


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

碼字不易~請多多支持 *_*




?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容