使用Idea創建一個Servlet項目並自動部署到Tomcat上

一、Servlet簡介

Servlet技術背景

Servlet 是 Server Applet 的縮寫,譯爲“服務器端小程序”,是一種使用 Java 語言來開發動態網站的技術。

Servlet 雖然被稱作“小程序”,但是它的功能卻異常強大,因爲它是基於 Java 的,幾乎可以使用所有的 Java API,Java 能做的事情,Servlet 也能做。

Java 是一種功能強大的通用型編程語言,可以處理 HTTP 請求,可以訪問數據庫,可以生成 HTML 代碼,您完全可以使用原生 Java 來開發動態網站。但是,使用原生 Java 開發動態網站非常麻煩,需要自己解析 HTTP 請求的報頭,需要自己分析用戶的請求參數,需要自己加載數據庫組件……種種原因導致使用原生 Java 開發動態網站幾乎是一件不能被接受的事情。正是基於這種原因,Java 官方後來推出了 Servlet 技術,它對開發動態網站需要使用的原生 Java API 進行了封裝,形成了一套新的 API,稱爲 Servlet API。

使用 Servlet 開發動態網站非常方便,程序員只需要集中精力處理業務邏輯,不需要再爲那些基礎性的、通用性的功能編寫代碼,這使得 Servlet 在動態網站開發領域具備了很高的實用性。

Servlet 基於 Java,可以使用幾乎全部的 Java API,所以它的功能異常強大,完全可以勝任企業級開發,能夠處理那些高併發、大吞吐量、業務邏輯複雜的應用場景。

您可以這樣理解,Servlet 是 Sun 公司推出的一種基於 Java 的動態網站開發技術。編寫 Servlet 代碼需要遵循 Java 語法,一個 Servlet 程序其實就是一個按照 Servlet 規範編寫的 Java 類。Servlet 程序需要先編譯成字節碼文件(.class文件),然後再部署到服務器運行。

Servlet 是一種規範

所有的 Servlet 功能都是通過一個名爲Servlet的接口(Interface)向外暴露的,編寫 Servlet 代碼,可以從實現 Servlet 接口開始,就像下面這樣: 

public class ServletDemo implements Servlet {    //TODO:}

直接實現 Servlet 接口比較麻煩,需要實現很多方法,所以 Servlet 規範又提供了兩個抽象類,分別是 GenericServlet 類和 HttpServlet 類,它們都實現了 Servlet 接口的很多常用功能。和 GenericServlet 類相比,HttpServlet 類更加方便,所以實際開發中一般都繼承自 HttpServlet 類。

JSP是Servlet基礎上的進一步封裝

Servlet 是第一代 Java Web 開發技術,它將 HTML 代碼以字符串的形式向外輸出,編寫 HTML 文檔就是在拼接字符串,非常麻煩,所以 Java 官方又推出了第二代 Web 開發技術——JSP。

JSP 纔是現代化的 Web 開發技術,它允許 HTML 代碼和 JSP 代碼分離,讓程序員能夠在 HTML 文檔中直接嵌入 JSP 代碼。

現在沒有人直接使用 Servlet 開發動態網站,至少都要用 JSP。但是 JSP 依賴於 Servlet,用戶訪問 JSP 頁面時,JSP 代碼會被翻譯成 Servlet 代碼,最終,HTML 代碼還是以字符串的形式向外輸出的。您看,JSP 只是在 Servlet 的基礎上做了進一步封裝。

JSP 代碼可以調用 Servlet 類,程序員可以將部分功能在 Servlet 中實現,然後在 JSP 中調用即可。

總之,Servlet 是 JSP 的基礎,Servlet 雖然不直接面向用戶,但是它依然是 JSP 的後臺支撐。

Web容器

我們知道,Servlet 是基於 Java 語言的,運行 Servlet 必然少不了 JRE 的支持,它負責解析和執行字節碼文件(.class文件)。然而 JRE 只包含了 Java 虛擬機(JVM)、Java 核心類庫和一些輔助性性文件,它並不支持 Servlet 規範。要想運行 Servlet 代碼,還需要一種額外的部件,該部件必須支持 Servlet 規範,實現了 Servlet 接口和一些基礎類,這種部件就是 Servlet 容器。

Servlet 容器就是 Servlet 代碼的運行環境(運行時),它除了實現 Servlet 規範定義的各種接口和類,爲 Servlet 的運行提供底層支持,還需要管理由用戶編寫的 Servlet 類,比如實例化類(創建對象)、調用方法、銷燬類等。

我們自己編寫的 Servlet 類爲什麼需要 Servlet 容器來管理呢?這是因爲我們編寫的 Servlet 類沒有 main() 函數,不能獨立運行,只能作爲一個模塊被載入到 Servlet 容器,然後由 Servlet 容器來實例化,並調用其中的方法。

一個動態頁面對應一個 Servlet 類,開發一個動態頁面就是編寫一個 Servlet 類,當用戶請求到達時,Servlet 容器會根據配置文件(web.xml)來決定調用哪個類。

您看,Web 服務器是整個動態網站的“大門”,用戶的 HTTP 請求首先到達 Web 服務器,Web 服務器判斷該請求是靜態資源還是動態資源:如果是靜態資源就直接返回,此時相當於用戶下載了一個服務器上的文件;如果是動態資源將無法處理,必須將該請求轉發給 Servlet 容器。

Servlet 容器接收到請求以後,會根據配置文件(web.xml)找到對應的 Servlet 類,將它加載並實例化,然後調用其中的方法來處理用戶請求;處理結束後,Servlet 容器將處理結果再轉交給 Web 服務器,由 Web 服務器將處理結果進行封裝,以 HTTP 響應的形式發送給最終的用戶。

常用的 Web 容器有 Tomcat、Jboss、Jetty、WebLogic 等,其中 Tomcat 由 Java 官方提供,是初學者最常使用的。

爲了簡化部署流程,Web 容器往往也會自帶 Web 服務器模塊,提供基本的 HTTP 服務,所以您可以不用再安裝 Apache、IIS、Nginx 等傳統意義上的服務器,只需要安裝一款 Web 容器,就能部署 Servlet 網站了。正是由於這個原因,有的教材將 Tomcat 稱爲 Web 容器,有的教材又將 Tomcat 稱爲 Web 服務器,兩者的概念已經非常模糊了。

總之,Servlet 容器就是 Servlet 程序的運行環境,它主要包含以下幾個功能:

  • 實現 Servlet 規範定義的各種接口和類,爲 Servlet 的運行提供底層支持;
  • 管理用戶編寫的 Servlet 類,以及實例化以後的對象;
  • 提供 HTTP 服務,相當於一個簡化的服務器。


二、JavaWeb應用的目錄結構

JavaWeb 應用由一組 Servlet/JSP、HTML 文件、相關 Java 類、以及其他的資源組成,它可以在由各種供應商提供的 Servlet 容器中運行。

由 JavaWeb 應用的定義可知, Servlet 是 JavaWeb 應用的一個組件。

爲了讓 Servlet 容器順利地找到 JavaWeb 應用的各個組件,Servlet 規範規定,JavaWeb 應用必須採用固定的目錄結構,即每種組件在 JavaWeb 應用中都有固定的存放目錄。

以 Tomcat 爲例,通常將 JavaWeb 應用存放到 Tomcat 的 webapps 目錄下。在 webapps 下,每一個子目錄都是一個獨立的 Web 應用,子目錄的名字就是 Web 應用的名字,也被稱爲 Web 應用的上下文根。用戶可以通過這個上下文根來訪問 JavaWeb 應用中的資源。

webapps 的目錄結構如下圖。

下表中對 webapps 下各個目錄進行了介紹。

 

三、新建一個簡單Servlet項目

創建一個普通的java項目

右鍵點擊項目,再點擊add framework support,勾選web Application(默認勾選上 create web.xml),點擊ok。 

在servlet包下創建一個servletTest類

package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class servletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doGet(req, resp);
        System.out.println("get請求");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        super.doPut(req, resp);
        System.out.println("post請求");
    }
}

在web下創建一個login.jsp頁面(一定要在web下創建,不然訪問不到)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登錄</title>
</head>
<body>
<form action="/servletTest/login" method="post">
    用戶名:<input type="text" name="username"> <br>
    密碼:<input type="password" name="password"> <br>
    <input type="submit" value="提交">
</form>
</body>
</html>

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">
    <servlet>
        <servlet-name>servletTest</servlet-name>
        <servlet-class>com.servlet.servletTest</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>servletTest</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>

在目錄WEB-INF下,還缺少兩個目錄classes和lib,我們自己新建一下這兩個目錄即可。

我們知道JavaWeb應用的目錄結構中: 

  • \WEB-INF\classes目錄存放各種 .class 文件或者包含 .class 文件的目錄,Servlet 類的 .class 文件也存放在此。
  • \WEB-INF\lib目錄存放應用所需的各種 jar 包,例如 JDBC 驅動程序的 jar 包。

因此我們要對編譯生成的字節碼文件的路徑進行一下更改。 

點擊File-Project Structure,將Modules中的Paths改成你項目中的classes目錄

繼續,在Libraries中添加lib目錄 

此時我們想要新建一個servlet是新建不了的,因爲JRE並沒有包含這個包,這個包在Tomcat中存在,因此我們需要將這個包添加進來。

右鍵項目名,選擇Open Module Settings,添加Tomcat安裝目錄下的servlet-api.jar包。  

此時,servletTest.java提示可以找到servlet類了。

接下來設置Tomcat自動部署。

因爲我們是需要在IDEA中啓動Tomcat,並把我們的項目部署上去。因此我們需要對Tomcat進行設置。

點擊菜單欄上的Run-Edit Configuration,點擊加號,選擇Tomcat server中的Local

配置一下Tomcat安裝目錄,然後系統會自動識別出Tomcat的版本。 

點擊切換到Deployment下,點擊下面的加號,選擇Artifact。 

配置了一下熱部署,當類代碼或者JSP代碼修改時會自動部署到Tomcat上,

點擊綠色小三角,運行Tomcat。 

瀏覽器欄輸入:

http://localhost:8080/servlet_xxe_test_war_exploded/login.jsp

  • servlet_xxe_test_war_exploded:部署到Tomcat上的app名稱
  • login:url映射路由,在web.xml中已經配置了對應的servlet處理類servletTest.class

隨機輸入用戶名和密碼並提交數據

控制檯打印信息

說明我們的servlet項目已經成功部署在本地運行的Tomcat上。 

參考鏈接:

https://blog.csdn.net/eadzsdad/article/details/123395673
https://blog.csdn.net/qq_41854911/article/details/122460601
https://blog.51cto.com/u_15319091/4575565

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章