您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何手工搭建一個(gè)Servlet”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何手工搭建一個(gè)Servlet”吧!
前言
手工搭建一個(gè)Servlet
下載Tomcat
編譯程序
啟動(dòng)Tomcat
讀取日志
在初學(xué)Java web的時(shí)候,就曾聽到過這樣一種說(shuō)法:
java Web的演變過程大概可以分為4個(gè)階段:
jsp + Servlet + jdbc
spring + struts2+ hibernate(ssh)
spring + SpringMVC + mybatis(ssm)
微服務(wù)階段。
所以學(xué)習(xí) Java web,可以從第3個(gè)階段開始學(xué)習(xí),不用再去關(guān)注Servlet,那么Servlet是否還有學(xué)習(xí)的必要呢?
答案是有,并且非常重要。俗話說(shuō)萬(wàn)變不離其宗,這個(gè)宗指的就是技術(shù)的底層,你會(huì)發(fā)現(xiàn)技術(shù)的底層其實(shí)都是相通的,只要把握了這個(gè)宗,我們就能在技術(shù)的浪潮來(lái)臨時(shí),把握機(jī)會(huì),而不是去追逐一個(gè)又一個(gè)的泡沫。
我記得初學(xué)java的時(shí)候,還是大三上,教我們java的老師是我們學(xué)院的副院長(zhǎng)。他讓我們用記事本去編寫程序,用命令行去執(zhí)行程序,而隔壁班用的卻是eclipse。當(dāng)初非常羨慕隔壁班,能用上“高大上”的開發(fā)環(huán)境,不用去改一個(gè)又一個(gè)的編譯錯(cuò)誤。現(xiàn)在想起來(lái),卻非常感謝那段經(jīng)歷,它讓我對(duì)Java程序的執(zhí)行過程有了更直觀的認(rèn)識(shí),對(duì)java這門編程語(yǔ)言本身有了更深刻的認(rèn)識(shí)。
而現(xiàn)在作為一個(gè)Java程序員,我們已經(jīng)習(xí)慣了使用IDE和Web框架進(jìn)行開發(fā),IDE幫助我們做了編譯、打包的工作。Spring框架則幫助我們實(shí)現(xiàn)了Servlet接口,并把Servlet容器注冊(cè)到了Web容器中。這樣我們就可以專注于實(shí)現(xiàn)業(yè)務(wù)邏輯,但是同時(shí),卻缺少了接觸底層的機(jī)會(huì)。
如果程序一直都處于正常運(yùn)行的狀態(tài),不了解底層其實(shí)并沒有什么問題,但是如果程序一旦出現(xiàn)了預(yù)期之外的異常,那么如果我們不懂底層,就沒有辦法準(zhǔn)確的定位問題。
所以今天要和大家分享的是Servlet的學(xué)習(xí):
首先我們需要下載Tomcat :https://tomcat.apache.org/download-90.cgi
Tomcat的目錄如下: (Mac系統(tǒng)、Tomcat 8.5.38)
/bin:存放在windows(.bat)和Linux(.sh)環(huán)境下運(yùn)行的腳本文件。
/conf: 存放配置的文件,其中最重要的是server.xml(配置Servlet)
/lib:存放Tomcat以及所有Web應(yīng)用都可以訪問的jar文件
/logs:存放Tomcat執(zhí)行時(shí)產(chǎn)生的日志文件
/work:存放JSP編譯后的產(chǎn)生class文件
/webapps:Tomcat的Web應(yīng)用目錄
編寫Servlet程序
我們可以通過繼承GenericServlet抽象類或者HttpServlet抽象類來(lái)實(shí)現(xiàn)我們自己的Servlet。HttpServlet是在GenericServlet的基礎(chǔ)上,進(jìn)一步封裝了Http的特性,相對(duì)GenericServlet而言使用簡(jiǎn)單,我們只需要重寫doGet和doPost方法即可。所以這里我們使用HttpServlet。(這里我們是使用記事本編寫的,如果你是使用ide,請(qǐng)引入javax.servlet包,因?yàn)檫@個(gè)包不在jdk的標(biāo)準(zhǔn)開發(fā)包中,方法可以參考:http://www.kemok4.com/article/196463.htm)
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import java.io.IOException; import java.io.PrintWriter; /** * 自定義Servlet. * * @author jialin.li * @date 2019-12-15 20:46 */public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("開始處理get請(qǐng)求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h2>hello Servlet</h2>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("開始處理post請(qǐng)求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h2>hello Servlet</h2>"); } }
這里需要我們將Tomcat lib中的Servlet-api.jar拷貝到當(dāng)前目錄下。因?yàn)槲覀兙帉懙腗yServlet繼承了HttpServlet抽象類,而這個(gè)類屬于該jar包,調(diào)用下面的命令編譯代碼:
javac -cp ./servlet-api.jar MyServlet.java
可以看出,我們編譯成功,生成了一個(gè)class文件。
接著我們需要?jiǎng)?chuàng)建一個(gè)Web應(yīng)用的web文檔結(jié)構(gòu),把它放到Webapps中。結(jié)構(gòu)如下:
MyWebApp/WEB-INF/web.xml MyWebApp/WEB-INF/classes/MyServlet.class
我們將在web.xml中配置我們的Servlet,web.xml的內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0" metadata-complete="true"> <description> Servlet Example. </description> <display-name> MyServlet Example </display-name> <request-character-encoding>UTF-8</request-character-encoding> <servlet> <servlet-name>myServlet</servlet-name> <servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> </web-app>
這里要保證servlet和servlet-mapping中的servlet-name一致。這樣才能完成從url到servlet的映射。
接著我們啟動(dòng)tomcat,找到tomcat的bin目錄,然后執(zhí)行start.sh腳本(如果是windows系統(tǒng),請(qǐng)使用.bat的腳本):[code]sh
sh startup.sh
tomcat的默認(rèn)端口是8080,我們可以訪問一下myservlet,觀察結(jié)果:http://127.0.0.1:8080/MyWebApp/myservlet
hello Servlet
MyWebApp是我們的應(yīng)用名,即在webapps的文件夾,myservlet是我們配置在web.xml里的Servlet路徑。(如果啟動(dòng)tomcat出現(xiàn)異常,請(qǐng)移步http://www.kemok4.com/article/216973.htm,里面有具體的解決辦法)
讀tomcat的日志,也是后端開發(fā)工程師必不可缺的一項(xiàng)技能。它可以幫助我們快速的定位問題。tomcat中的日志分為兩類,一類是運(yùn)行日志,記錄著系統(tǒng)運(yùn)行過程中的信息,比如異常錯(cuò)誤 等。一類是訪問日志,記錄著訪問的時(shí)間、IP地址、訪問路徑等相關(guān)信息。
catalina.***.log
主要記錄著Tomcat啟動(dòng)過程中的信息,這個(gè)文件可以看到JVM參數(shù)以及操作系統(tǒng)等日志信息。
catalina.out
catalina.out是Tomcat的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出,在這個(gè)日志里我們可以看到MyServlet.java程序輸出的信息。
localhost.**.log
主要記錄Web應(yīng)用在初始化過程中,遇到的未處理的異常。
manager.***.log/host-manager.***.log
存放Tomcat自帶的Manager項(xiàng)目的日志信息
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.annotation.WebServlet; import java.io.IOException; import java.io.PrintWriter; /** * 自定義Servlet. * * @author jialin.li * @date 2019-12-15 20:46 */ @WebServlet("/myAnnotationServlet") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("開始處理get請(qǐng)求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h2>hello Servlet</h2>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("開始處理post請(qǐng)求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h2>hello Servlet</h2>"); } }
這個(gè)注解有兩層含義: 這個(gè)Java類是一個(gè)Servlet;這個(gè)Servlet對(duì)應(yīng)的url路徑是myAnnotationServlet
然后我們需要重新編譯文件,并刪除原來(lái)的web.xml,重新啟動(dòng)tomcat,驗(yàn)證結(jié)果:
hello Servlet
可以看出,使用注解和使用配置文件的效果是一樣的。
到此,相信大家對(duì)“如何手工搭建一個(gè)Servlet”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。