1. Servlet
1.1 Servlet簡介
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程式或服務連接器,用Java撰寫的服務器端程式,具有獨立于平臺和協議的特性,主要功能在于互動式地瀏覽和生成資料,生成動態Web內容,
- 把實作了Sun公司開發的Servlet介面的java程式叫做Servlet
1.2 第一個Servlet程式
-
構建一個普通的Maven專案(可以洗掉src目錄,方便都會創建子專案)(具體如何構建看我上一篇文章)
-
Maven添加jsp,servlet依賴--
-
去官網 Maven Repository: Search/Browse/Explore (mvnrepository.com)搜索Java Servlet API找到對應版本復制Maven依賴代碼如:
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>-
復制到maven專案中pom.xml的依賴模塊中如:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>重繪專案匯入依賴
-
-
同理到官網找到jsp的依賴JavaServer Pages(TM) API匯入
-
-
創建一個子模塊(Maven的web專案)
-
父專案中(pom.xml):
<modules> <module>SonMaven</module> </modules>-
子專案中(pom.xml):
<parent> <artifactId>javaweb</artifactId> <groupId>org.example</groupId> <version>1.0-SNAPSHOT</version> </parent>- 子專案可以直接使用父專案的jar包,就是java的exntend
-
-
-
給子專案中的webapp/WEN-INF/web.xml換成最新的,否則以后可能某些東西無法創建
? 可以參考如:
```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">
</web-app>
```
- 最好在main中創建一個java 一個resources檔案夾符合maven規范以后有用

-
java檔案夾中創建servlet檔案
-
創建一個普通java類
-
實作servlet介面,我們一般直接通過繼承HttpServlet實作
-
servlet介面的另外一個實作類是GenericServlet,實際上是GenericServlet實作了Servlet,而HttpServlet繼承GenericServlet
-
servlet介面有一些方法,GenericServlet相對幾乎沒變,而HttpServle則多了許多方法其中doGet和doPost方法比較重要
void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy(); -
重寫HttpServlet的doGet和doPost方法(當然其他方法也可以但是目前用不到)
public class MyFirstServlet extends HttpServlet { // 由于get和post這是請求實作的不同方式,可以相互呼叫邏輯都一樣 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 自己寫的 PrintWriter writer = resp.getWriter();//回應流 writer.print("Hello,Serlvlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
-
-
撰寫Servlet的映射
為什么需要映射:我們寫的是Java程式但是需要通過瀏覽器訪問,而瀏覽器需要連接web服務器,使用需要再web服務中注冊我們寫的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"> <!--注冊servlet--> <servlet> <servlet-name>hello</servlet-name> <!-- 剛才寫的serverlet位置相對于java檔案夾--> <servlet-class>MyFirstServlet</servlet-class> </servlet> <!-- servlet的請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <!-- 瀏覽器查看的url--> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> -
配置Tomcat
之前寫過,不再贅述,只是強調一個出現的問題:tomcat部署時沒有自己需要部署的專案:
中deployment點擊加號沒有出現artifact
Tomcat是一個開源的Java Servlet容器,用于運行JavaWeb應用程式,在部署應用程式之前,需要在Tomcat中進行相關的配置, 部署應用程式的最常見方式是將應用程式打成.war包,
? 通過這篇文章解決大概之后重繪maven后,成功出現

-
運行測驗:
這個頁面出自index.jsp是主專案默認頁面,如果沒有servlet覆寫主路徑,默認主路徑顯示這個,我們后面細說

? 這是我們在web.xml 中配置的瀏覽器訪問路徑

1.3 Servlet原理
-
Servlet是由web服務器呼叫,當Web服務器接收到一個瀏覽器的請求時,它會先判斷請求內容——如果是靜態網頁資料,Web服務器將會自行處理,然后產生回應資訊;如果牽涉到動態資料,Web服務器會將請求轉交給Servlet容器,此時Servlet容器會找到對應的處理該請求的Servlet實體來處理,結果會送回Web服務器,再由Web服務器傳回用戶端,
針對同一個Servlet,Servlet容器會在第一次收到http請求時建立一個Servlet實體,然后啟動一個執行緒,第二次收到http請求時,Servlet容器無須建立相同的Servlet實體,而是啟動第二個執行緒來服務客戶端請求,所以多執行緒方式不但可以提高Web應用程式的執行效率,也可以降低Web服務器的系統負擔,
參考時序圖:

-
Web Client 向Servlet容器(Tomcat)發出Http請求;
-
Servlet容器接收Web Client的請求;
-
Servlet容器創建一個HttpRequest物件,將Web Client請求的資訊封裝到這個物件中;
-
Servlet容器創建一個HttpResponse物件;
-
Servlet容器呼叫HttpServlet物件的service方法,
-
HttpRequest物件與HttpResponse物件作為引數傳給 HttpServlet物件;
-
HttpServlet呼叫HttpRequest物件的有關方法,獲取Http請求資訊;
-
HttpServlet呼叫HttpResponse物件的有關方法,生成回應資料;
-
Servlet容器把HttpServlet的回應結果傳給Web Client;
上述來自該文章
鏈接:https://www.jianshu.com/p/7dcd2c689729
1.4 Mapping問題
一個servlet可以指定一個、多個、通用的路徑:
<servlet-mapping>
<servlet-name>hello</servlet-name>
//這是一個路徑,多個就是多粘貼幾個<servlet-mapping>每個給的路徑不同
<url-pattern>/hello</url-pattern>
//通用: /hello/后面使用的所有路徑都到這個servlet
//<url-pattern>/hello/*</url-pattern>
//后面這個的意思是以.aaa結尾的都可以
//<url-pattern>*.aaa</url-pattern>
</servlet-mapping>
另外當出現兩個servlet路徑重疊的情況,路徑范圍小的優先級高
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555153.html
標籤:Java
上一篇:消失的死鎖:從 JSF 執行緒池滿到 JVM 初始化原理剖析
下一篇:返回列表
