官方api檔案:https://tomcat.apache.org/tomcat-8.0-doc/servletapi/index.html
Tomcat的web服務拿到一個請求後:
如果web服務發現是該請求是和java相關的,或者說是一個Servlet(動態請求,比如說可能會去運算元據庫),那麼Tomcat會去尋找Servlet,Servlet又去呼叫java程式,進行資料庫操作
如果Tomcat的web服務發現請求的是一個靜態資源,比如html,圖片等,就直接拿到該資源,然後返回,不會和java程式或者資料庫發生關係
因此我們說Tomcat其實是有兩個功能的:一是充當Servlet的容器;二是充當普通的web服務
只支撐靜態資源返回的還有apache,如果是一個靜態資源的網站,不需要和資料庫進行互動,其實完全可以使用Apache來作為web服務,或者只使用一個Nginx就可以了
什麼是Servlet
Servlet在開發動態WEB工程中得到了廣泛地應用,掌握好Servlet非常重要,Servlet是SpringMVC的基礎
Servlet(java伺服器小程式),它的特點有:
它是由伺服器呼叫和執行的
即由tomcat解析和執行的
它是用java語言編寫的,本質就是Java類
它是按照Servlet規範開發的(介面),Servlet本質就是一套介面規範
除了Tomcat可以去解析Servlet,weblogic也可以支援 Servlet,即只要按照規範去開發介面,就可以支援Servlet,類似於jdbc的介面規範
功能強大,幾乎完成所有的網站功能
例子
需求說明:
http://localhost:8080/web應用名/helloServlet
時,後臺輸出「hi HelloServlet」思路:
編寫類HelloServlet去實現Servlet介面
實現service方法,處理請求,並響應資料
在web.xml中去設定Servlet程式的存取地址
首先建立web工程,設定好Tomcat
新增servlet-api.jar(在你安裝的tomcat/lib下)到工程,因為servlet.jar不是jdk自帶的,要引入才可以使用
在idea專案的web/WEB-INF下建立一個lib目錄,將servlet-api.jar拷貝進去,然後右擊jar包,點選add as library,在彈出的視窗中點選ok即可
在src包下面建立HelloServlet.java,並實現Servlet介面
package com.li.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* 1.開發一個servlet,需要實現Servlet介面
* 2.實現Servlet介面的方法:一共有5個
*/
public class HelloServlet implements Servlet {
/**
* 1.初始化 Servlet
* 2.當建立HelloServlet範例時,會呼叫init方法
* 3.該方法只會被呼叫一次
*
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init() 被呼叫");
}
/**
* 返回ServletConfig物件 也就是返回Servlet的設定
*
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 1.service方法處理瀏覽器的請求(包括get/post)
* 2.當瀏覽器每次請求Servlet時,就會呼叫一次server方法
* 3.當Tomcat呼叫該方法時,會把http請求的資料封裝成 實現了ServletRequest介面 的request物件
* 4.通過servletRequest物件,就可以得到使用者提交的資料
* 5.servletResponse物件可以用於返回資料給Tomcat-->瀏覽器
*
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hi HelloServlet~");
}
/**
* 返回servlet的資訊,使用較少
*
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 1.該方法是在servlet被銷燬時,被tomcat呼叫
* 2.只會呼叫一次
*/
@Override
public void destroy() {
}
}
實現了介面之後,在web.xml設定HelloServlet,即給HelloServlet提供對外的存取地址
目的是為了告訴Tomcat伺服器,HelloServlet在哪裡
<?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">
<!--web.xml檔案主要用來設定該web應用使用到的Servlet-->
<!--設定HelloServlet-->
<!--解讀:
1.servlet-name:給Servlet取名(任意),該名字唯一
2.servlet-class:Servlet的類的全路徑,Tomcat在反射生成該Servlet類範例時需要使用
3.servlet-mapping裡的servlet-name要和上面的servlet-name保持一致
4.url-pattern:這個就是該Servlet存取的url的設定(路徑)
5.這時我們應該這樣存取Servlet:http://localhost:8080/web應用名/helloServlet
5.url-pattern的取名也是隨意的(注意加上斜槓)
-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.li.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
</web-app>
設定 快捷鍵ctrl+/ 可以在當前位置註釋,而不是在行
存取HelloServlet(記得要reploy或者restart)
可以自己設定快捷鍵啟動
瀏覽器存取:
後臺輸出:可以看到init方法只呼叫了一次,而每次存取都會呼叫server方法