手寫一個(gè)main的Tomcat容器,構(gòu)建Http服務(wù)器
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來(lái),我們一起精進(jìn)!你不來(lái),我和你的競(jìng)爭(zhēng)對(duì)手一起精進(jìn)!
編輯:業(yè)余草
blog.csdn.net/m0_37892044
推薦:https://www.xttblog.com/?p=5317
當(dāng)我們開始接觸到 SpringBoot 項(xiàng)目的時(shí)候,我們特別驚訝,為什么沒(méi)有了tomcat服務(wù)器,web項(xiàng)目還能跑起來(lái)。為什么只用了一個(gè)main方法就能講一個(gè)web項(xiàng)目跑起來(lái)。學(xué)習(xí)了這篇文章你就能明白了。

文章目錄
發(fā)現(xiàn)內(nèi)置Tomcat 創(chuàng)建一個(gè)maven項(xiàng)目 添加tomcat依賴 創(chuàng)建一個(gè)servlet:IndexServlet 創(chuàng)建一個(gè)tomcat 定義servlet配置參數(shù) 內(nèi)置Tomcat常用API介紹 創(chuàng)建tomcat并且添加servlet 啟動(dòng)main方法創(chuàng)建tomcat 訪問(wèn)IndexServlet
1.發(fā)現(xiàn)內(nèi)置Tomcat
打開一個(gè)SpringBoot項(xiàng)目,我們發(fā)現(xiàn),有tomcat的依賴

接下來(lái)讓我們把tomcat的依賴找到。
首先找到spring-boot-starter-web。

點(diǎn)進(jìn)去之后我們看到他用的是2.1.0版本,我們繼續(xù)點(diǎn)擊去。

果然在里面找到tomcat的依賴,我們繼續(xù)點(diǎn)進(jìn)去。

這是我們我們就能看到tomcat的相關(guān)依賴了。

因此我們是可以使用Java提供內(nèi)置Tomcat容器框架,使用Java語(yǔ)言操作Tomcat容器。這樣我們也能創(chuàng)建一個(gè)maven項(xiàng)目,并且內(nèi)置一個(gè)tomcat容器了。
2.創(chuàng)建一個(gè)maven項(xiàng)目
略
3.添加tomcat依賴
這里我們使用8.5版本的tomcat
<dependency>
?<groupId>org.apache.tomcat.embedgroupId>
?<artifactId>tomcat-embed-coreartifactId>
?<version>8.5.16version>
dependency>
4.創(chuàng)建一個(gè)servlet:IndexServlet
public?class?IndexServlet?extends?HttpServlet?{
?private?static?final?long?serialVersionUID?=?1L;
?@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("IndexServletIndexServletIndexServletIndexServletIndexServletIndexServlet");
?}
}
我們先看看傳統(tǒng)的Servlet需要怎么配置,我們需要在WEB-INF目錄下的web.xml文件中,配置sevlet的映射。

當(dāng)我們?cè)L問(wèn)這個(gè)servlet的時(shí)候,訪問(wèn)地址應(yīng)該是:ip:<端口>/。
但是,但是,但是。。。
當(dāng) tomcat和web.xml 沒(méi)了,怎么配置?
簡(jiǎn)單,沒(méi)有我們就用main方法來(lái)創(chuàng)建一個(gè)tomcat。
5.創(chuàng)建一個(gè)tomcat
5.1.定義servlet配置參數(shù)
我們先定義幾個(gè)servlet的配置參數(shù):servlet的名字,servlet的映射。

5.2.內(nèi)置Tomcat常用API介紹
「org.apache.catalina.startup.Tomcat」
「創(chuàng)建tomcat」
Tomcat?tomcatServer?=?new?Tomcat();
「設(shè)置tomcat端口」
void?setPort(int?port);
「設(shè)置上下文地址」
void?setPath(String?path)
「添加監(jiān)聽(tīng)」
void?addLifecycleListener(LifecycleListener?listener)
「添加sevlet」
Wrapper?addServlet(String?contextPath,String?servletName,Servlet?servlet)
「添加sevlet映射」
void?addServletMappingDecoded(String?pattern,?String?name)
「啟動(dòng)tomcat」
void?start()?throws?LifecycleException
「獲取服務(wù)」
Server?getServer()
「服務(wù)異步」
tomcatServer.getServer().await()
「將Web應(yīng)用程序添加到Tomcat的webapps目錄中,」
等效的默認(rèn)web.xml將應(yīng)用于該Web應(yīng)用程序,并且與該應(yīng)用程序打包的任何 WEB-INF/web.xml和META-INF/context.xml都將被正常處理。
Context?addWebapp(String?contextPath,?String?docBase)?throws?ServletException
「web應(yīng)用資源添加到此Web應(yīng)用程序」
void?addPreResources(WebResourceSet?webResourceSet)
5.3.創(chuàng)建tomcat并且添加servlet
public?class?TestTomcat?{
?private?static?int?PORT?=?8080;
?private?static?String?CONTEX_PATH?=?"/demosevlet";
?private?static?String?SERVLET_NAME?=?"index";
?private?static?String?MAPPING?=?"index";
?public?static?void?main(String[]?args)?throws?LifecycleException,?InterruptedException?{
??System.out.println("開始啟動(dòng)tomcat");
??Tomcat?tomcatServer?=?new?Tomcat();
??//設(shè)置tomcat端口
??tomcatServer.setPort(PORT);
??//此tomcat端口是否自動(dòng)部署
??tomcatServer.getHost().setAutoDeploy(false);
??//創(chuàng)建一個(gè)web應(yīng)用程序
??StandardContext?standardContex?=?new?StandardContext();
??//設(shè)置web應(yīng)用程序的上下文地址
??standardContex.setPath(CONTEX_PATH);
??//添加web應(yīng)用程序的監(jiān)聽(tīng)
??standardContex.addLifecycleListener(new?FixContextListener());
??//將web應(yīng)用程序添加到服務(wù)器中
??tomcatServer.getHost().addChild(standardContex);
??//配置servelt和映射
??tomcatServer.addServlet(CONTEX_PATH,?SERVLET_NAME,?new?IndexServlet());
??standardContex.addServletMappingDecoded("/"+MAPPING,?SERVLET_NAME);
??//啟動(dòng)tomcat
??tomcatServer.start();
??System.out.println("啟動(dòng)tomcat完畢");
??//開啟異步服務(wù),接收請(qǐng)求
??tomcatServer.getServer().await();
?}
}
5.4.啟動(dòng)main方法創(chuàng)建tomcat
啟動(dòng)結(jié)果如下,我們看到tomcat以8080端口啟動(dòng)

并且在此目錄下生成了tomcat.8080文件夾。

5.5.訪問(wèn)IndexServlet
請(qǐng)求地址:ip:<端口>/。
請(qǐng)求地址:127.0.0.1:8080/demosevlet/index。

有了本文的基礎(chǔ),后面我在給大家手寫 SpringBoot 教程時(shí),就能更得心應(yīng)手了!
使用 Java 手寫一個(gè) Redis 服務(wù)端!
手把手教你設(shè)計(jì)一個(gè)更通用的查詢接口!
