1. 程式人生 > 實用技巧 >Servlet基礎解析

Servlet基礎解析

建立第一個sevlet案例(通過黑視窗)

建立servlet(瀏覽器頁面輸入內容)

package com.hhxx.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException { 
    PrintWriter out = response.getWriter();

    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01Transitional//EN\">"); out.println("<HTML>");
    out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");     out.println(" <BODY>");
    out.println("<font color=red>Hello World111</font>");       out.println(" </BODY>");
    out.println("</HTML>"); out.flush();
    out.close();
    } 
}
  • 由於javax包是Tomcat提供的,因此需要使用命令進行匯入,否則無法編譯,會報錯,servlet包位於tomcat的lib目錄中
C:\java>javac -classpath "C:\java\Tomcat\apache-tomcat-9.0.34\lib\servlet-api.jar" HelloWorld.java

web.xml建立

  • 什麼是web.xml是專案部署描述檔案,tomcat啟動時會先解析該配置檔案獲得專案配置資訊,因此必須有web.xml檔案,來配置servle等技術
<?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>HelloWorld</servlet-name>
<servlet-class>com.hhxx.servlet.HelloWorld</servlet-class> </servlet>

<servlet-mapping> 
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping> 
</web-app>

servlet-name:標籤名(別名隨意取)
servlet-class:全名(包名+類名)
servlet-mapping標籤:用於url和servlet的對映(繫結)
需要注意的是url-pattern標籤中url隨便寫,但一定要加/

servlet部署與訪問

  • servlet就相當於一個應用程式,而tomcat的webapps用於存放應用,但不是將檔案直接拖入需要建立一個web工程進行部署(對應的檔案包)
  • helloworld即編譯好的.class檔案
  • 完成上述資料夾的相應建立,就可以啟動tomcat,啟動完成,瀏覽器輸入我們的URL:http://localhost:8080/servletdemo/hello

    localhost:8080:這是訪問tomcat地址
    servletdemo:專案名
    hello:這個專案下的hello
    訪問結果:

繼承結構

sevlet生命週期

servlet生命週期是由容器管理的(tomcat),分別經歷3個階段

  • inin():初始化
  • service():服務
  • destroy():銷燬
    當客戶端瀏覽器第一次請求 Servlet 時,容器會例項化這個 Servlet,然後呼叫一次 init 方法(是在GenericServlet實現的),並在新的執行緒中執行 service 方法處理請求。service 方法執行完畢後容器不會銷燬這 個 Servlet 而是做快取處理,當客戶端瀏覽器再次請求這個 Servlet 時,容器會從快取中直接 找到這個 Servlet 物件,並再一次在新的執行緒中執行 Service 方法。當容器在銷燬 Servlet 之 前對呼叫一次 destroy 方法(destory()方法)不是來銷燬Servlet的,而是完成資源釋放功能的。

sevlet處理請求的原理

當瀏覽器基於 get 方式請求我們建立 Servlet 時,我們自定義的 Servlet 中的 doGet 方法 會被執行。doGet 方法能夠被執行並處理 get 請求的原因是,容器在啟動時會解析 web 工程 中 WEB-INF 目錄中的 web.xml 檔案,在該檔案中我們配置了 Servlet 與 URI 的繫結,容器通 過對請求的解析可以獲取請求資源的 URI,然後找到與該 URI 繫結的 Servlet 並做例項化處理 (注意:只例項化一次,如果在快取中能夠找到這個 Servlet 就不會再做次例項化處理)。在實 例化時會使用 Servlet 介面型別作為引用型別的定義,並呼叫一次 init 方法,由於 HttpServlet 中重寫了該方法所以最終執行的是 HttpServlet 中 init 方法(HttpServlet 中的 Init 方法是一個空 的方法體),然後在新的執行緒中呼叫 service 方法。由於在 HttpServlet 中重寫了 Service 方法 所以最終執行的是 HttpServlet 中的 service 方法。在 service 方法中通過 request.getMethod() 獲取到請求方式進行判斷如果是 Get 方式請求就執行 doGet 方法,如果是 POST 請求就執行 doPost 方法。如果是基於 GET 方式提交的,並且在我們自定義的 Servlet 中又重寫了 HttpServlet 中的 doGet 方法,那麼最終會根據 Java 的多型特性轉而執行我們自定義的 Servlet 中的 doGet 方法。

sevlet的作用

  • 獲取使用者提交資料
  • 獲取瀏覽器附加資訊
  • 處理資料(訪問資料庫或呼叫介面)
  • 給瀏覽器產生一個響應
  • 在響應中新增附加資訊