Servlet還有學習的必要嗎?(手工搭建Servlet)

前言

  在初學Java web的時候,就曾聽到過這樣一種說法:
  java Web的演變過程大概能夠分爲4個階段:
    1. jsp + Servlet + jdbc
    2. spring + struts2+ hibernate(ssh)
    3. spring + SpringMVC + mybatis(ssm)
    4. 微服務階段。
  因此學習 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://blog.csdn.net/q343509740/article/details/79515911)
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 bin中的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的腳本):
sh startup.sh
  tomcat的默認端口是8080,咱們能夠訪問一下myservlet,觀察結果: http://127.0.0.1:8080/MyWebApp/myservlet
hello Servlet
  MyWebApp是咱們的應用名,即在webapps的文件夾,myservlet是咱們配置在web.xml裏的Servlet路徑。
(若是啓動tomcat出現異常,請移步 http://www.javashuo.com/article/p-hmqwhkhk-cc.html,裏面有具體的解決辦法)

讀取日誌

  讀tomcat的日誌,也是後端開發工程師必不可缺的一項技能。它能夠幫助咱們快速的定位問題。tomcat中的日誌分爲兩類,一類是運行日誌,記錄着系統運行過程當中的信息,好比異常錯誤  等。一類是訪問日誌,記錄着訪問的時間、IP地址、訪問路徑等相關信息。

catalina.***.log

  主要記錄着Tomcat啓動過程當中的信息,這個文件能夠看到JVM參數以及操做系統等日誌信息。

catalina.out

  catalina.out是Tomcat的標準輸出和錯誤輸出,在這個日誌裏咱們能夠看到MyServlet.java程序輸出的信息。

localhost.**.log

  主要記錄Web應用在初始化過程當中,遇到的未處理的異常。

manager.***.log/host-manager.***.log

  存放Tomcat自帶的Manager項目的日誌信息
  除了使用xml的形式配置,servlet3.0又引入了註解開發的方式,大大簡化了開發流程,咱們先修改代碼,給Servlet類加上@WebServlet註解:
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
  能夠看出,使用註解和使用配置文件的效果是同樣的。
相關文章
相關標籤/搜索