手工搭建Servlet實現
前言
在初學Java web的時候,就曾聽到過這樣一種說法:
java Web的演變過程大概可以分為4個階段:
- jsp + Servlet + jdbc
- spring + struts2+ hibernate(ssh)
- spring + SpringMVC + mybatis(ssm)
- 微服務階段。
所以學習 Java web,可以從第3個階段開始學習,不用再去關註Servlet,那麼Servlet是否還有學習的必要呢?
答案是有,並且非常重要。俗話說萬變不離其宗,這個宗指的就是技術的底層,你會發現技術的底層其實都是相通的,隻要把握瞭這個宗,我們就能在技術的浪潮來臨時,把握機會,而不是去追逐一個又一個的泡沫。
我記得初學java的時候,還是大三上,教我們java的老師是我們學院的副院長。他讓我們用記事本去編寫程序,用命令行去執行程序,而隔壁班用的卻是eclipse。當初非常羨慕隔壁班,能用上“高大上”的開發環境,不用去改一個又一個的編譯錯誤。現在想起來,卻非常感謝那段經歷,它讓我對Java程序的執行過程有瞭更直觀的認識,對java這門編程語言本身有瞭更深刻的認識。
而現在作為一個Java程序員,我們已經習慣瞭使用IDE和Web框架進行開發,IDE幫助我們做瞭編譯、打包的工作。Spring框架則幫助我們實現瞭Servlet接口,並把Servlet容器註冊到瞭Web容器中。這樣我們就可以專註於實現業務邏輯,但是同時,卻缺少瞭接觸底層的機會。
如果程序一直都處於正常運行的狀態,不瞭解底層其實並沒有什麼問題,但是如果程序一旦出現瞭預期之外的異常,那麼如果我們不懂底層,就沒有辦法準確的定位問題。
所以今天要和大傢分享的是Servlet的學習:
手工搭建一個Servlet
下載Tomcat
首先我們需要下載Tomcat :https://tomcat.apache.org/download-90.cgi
Tomcat的目錄如下: (Mac系統、Tomcat 8.5.38)
- /bin:存放在windows(.bat)和Linux(.sh)環境下運行的腳本文件。
- /conf: 存放配置的文件,其中最重要的是server.xml(配置Servlet)
- /lib:存放Tomcat以及所有Web應用都可以訪問的jar文件
- /logs:存放Tomcat執行時產生的日志文件
- /work:存放JSP編譯後的產生class文件
- /webapps:Tomcat的Web應用目錄
編寫Servlet程序
我們可以通過繼承GenericServlet抽象類或者HttpServlet抽象類來實現我們自己的Servlet。HttpServlet是在GenericServlet的基礎上,進一步封裝瞭Http的特性,相對GenericServlet而言使用簡單,我們隻需要重寫doGet和doPost方法即可。所以這裡我們使用HttpServlet。(這裡我們是使用記事本編寫的,如果你是使用ide,請引入javax.servlet包,因為這個包不在jdk的標準開發包中,方法可以參考:https://www.jb51.net/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請求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h1>hello Servlet</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("開始處理post請求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h1>hello Servlet</h1>"); } }
編譯程序
這裡需要我們將Tomcat lib中的Servlet-api.jar拷貝到當前目錄下。因為我們編寫的MyServlet繼承瞭HttpServlet抽象類,而這個類屬於該jar包,調用下面的命令編譯代碼:
javac -cp ./servlet-api.jar MyServlet.java
可以看出,我們編譯成功,生成瞭一個class文件。
接著我們需要創建一個Web應用的web文檔結構,把它放到Webapps中。結構如下:
MyWebApp/WEB-INF/web.xml MyWebApp/WEB-INF/classes/MyServlet.class
我們將在web.xml中配置我們的Servlet,web.xml的內容如下:
<?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的映射。
啟動Tomcat
接著我們啟動tomcat,找到tomcat的bin目錄,然後執行start.sh腳本(如果是windows系統,請使用.bat的腳本):[code]sh
sh startup.sh
tomcat的默認端口是8080,我們可以訪問一下myservlet,觀察結果:http://127.0.0.1:8080/MyWebApp/myservlet
hello Servlet
MyWebApp是我們的應用名,即在webapps的文件夾,myservlet是我們配置在web.xml裡的Servlet路徑。(如果啟動tomcat出現異常,請移步https://www.jb51.net/article/216973.htm,裡面有具體的解決辦法)
讀取日志
讀tomcat的日志,也是後端開發工程師必不可缺的一項技能。它可以幫助我們快速的定位問題。tomcat中的日志分為兩類,一類是運行日志,記錄著系統運行過程中的信息,比如異常錯誤 等。一類是訪問日志,記錄著訪問的時間、IP地址、訪問路徑等相關信息。
catalina.***.log
主要記錄著Tomcat啟動過程中的信息,這個文件可以看到JVM參數以及操作系統等日志信息。
catalina.out
catalina.out是Tomcat的標準輸出和錯誤輸出,在這個日志裡我們可以看到MyServlet.java程序輸出的信息。
localhost.**.log
主要記錄Web應用在初始化過程中,遇到的未處理的異常。
manager.***.log/host-manager.***.log
存放Tomcat自帶的Manager項目的日志信息
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請求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h1>hello Servlet</h1>"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("開始處理post請求"); PrintWriter writer = resp.getWriter(); resp.setContentType("text/html;charset=utf-8"); writer.println("<h1>hello Servlet</h1>"); } }
這個註解有兩層含義: 這個Java類是一個Servlet;這個Servlet對應的url路徑是myAnnotationServlet
然後我們需要重新編譯文件,並刪除原來的web.xml,重新啟動tomcat,驗證結果:
hello Servlet
可以看出,使用註解和使用配置文件的效果是一樣的。
到此這篇關於手工搭建Servlet實現的文章就介紹到這瞭,更多相關Servlet手工搭建內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java中Servlet的生命周期詳解
- 淺談Servlet的Cookie和Session機制
- IDEA 2021配置JavaWeb項目超詳細教程
- 實現Servlet程序的三種方法(小結)
- SpringBoot中使用Servlet的兩種方式小結