1. 程式人生 > >javaWeb--Servlet----簡述,三種實現方式原理

javaWeb--Servlet----簡述,三種實現方式原理

一、servlet概述
1、每個servlet都像是10086的話務員,但是每個servlet都是唯一的,他們能處理的請求是不同的。servlet的作用:接收請求資料,處理請求,完成響應。
2、Servlet類由我們來寫,但物件由伺服器來建立,並且由伺服器來呼叫相應的方法。

二、如何讓瀏覽器訪問servlet?
在web.xml給servlet指定一個servlet路徑(讓servlet與一個路徑繫結在一起),瀏覽器通過路徑來訪問servlet

<servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class
>
cn.itcast.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping>

在web.xml中配置Servlet的目的其實只有一個,就是把訪問路徑與一個Servlet繫結到一起,上面配置是把訪問路徑:“/helloworld”與“cn.itcast.servlet.HelloServlet”繫結到一起。
<servlet>:

指定HelloServlet這個Servlet的名稱為hello;
<servlet-mapping>:指定/helloworld訪問路徑所以訪問的Servlet名為hello。
<servlet>和<servlet-mapping>通過<servlet-name>這個元素關聯在一起了!
接下來,我們編譯HelloServlet,注意,編譯HelloServlet時需要匯入servlet-api.jar,因為Servlet.class等類都在servlet-api.jar中。

三、實現Servlet的方式(由我們自己來寫!)
實現Servlet有三種方式:
 實現javax.servlet.Servlet介面;
 繼承javax.servlet.GenericServlet類;
 繼承javax.servlet.http.HttpServlet類;
實現Servlet介面時會要重寫其中的五個方法,其中有init()在servlet物件建立完成之後,馬上執行,且只執行一次,destroy()在servlet被銷燬之前呼叫,只調用一次service()每次處理請求時都會呼叫這個方法,會多次呼叫,以上三個為生命週期方法。這三個方法都是tomact來呼叫。

四、在Servlet介面中常見型別:
ServletRequest:service() 方法的引數,它表示請求物件,它封裝了所有與請求相關的資料,它是由伺服器建立的;
ServletResponse:service()方法的引數,它表示響應物件,在service()方法中完成對客戶端的響應需要使用這個物件;
ServletConfig:init()方法的引數,它表示Servlet配置物件,它對應Servlet的配置資訊,那對應web.xml檔案中的<servlet>元素。即是<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>cn.itcast.servlet.HelloServlet</servlet-class>
</servlet>
,可以通過ServletConfig物件來獲取這些資訊。

String getServletName():獲取Servlet在web.xml檔案中的配置名稱,即`<servlet-name>`指定的名稱;
ServletContext getServletContext():用來獲取ServletContext物件,ServletContext會在後面講解;
String getInitParameter(String name):用來獲取在web.xml中配置的初始化引數,通過引數名來獲取引數值;//最常用方法
Enumeration getInitParameterNames():用來獲取在web.xml中配置的所有初始化引數名稱;
 <servlet>
    <servlet-name>One</servlet-name>
    <servlet-class>cn.itcast.servlet.OneServlet</servlet-class>
    <init-param>
        <param-name>paramName1</param-name>
            <param-value>paramValue1</param-value>
    </init-param>
    <init-param>
            <param-name>paramName2</param-name>
            <param-value>paramValue2</param-value>
    </init-param>
   </servlet>

在OneServlet中,可以使用ServletConfig物件的getInitParameter()方法來獲取初始化引數,例如:
String value1 = servletConfig.getInitParameter(“paramName1”);//獲取到paramValue1

五、GenericServlet概述
GenericServlet是Servlet介面的實現類,我們可以通過繼承GenericServlet來編寫自己的Servlet。
GenericServlet的底層原理主要相關的是GenericServlet的init()方法
在GenericServlet中,定義了一個ServletConfig config例項變數,並在init(ServletConfig)方法中把引數ServletConfig賦給了例項變數。然後在該類的很多方法中使用了例項變數config。
如果子類覆蓋了GenericServlet的init(StringConfig)方法,那麼this.config=config這一條語句就會被覆蓋了,也就是說GenericServlet的例項變數config的值為null,那麼所有依賴config的方法都不能使用了。如果真的希望完成一些初始化操作,那麼去覆蓋GenericServlet提供的init()方法,它是沒有引數的init()方法,它會在init(ServletConfig)方法中被呼叫。

六、HttpServlet概述
HttpServlet類是GenericServlet的子類,它提供了對HTTP請求的特殊支援,所以通常我們都會通過繼承HttpServlet來完成自定義的Servlet。
HttpServlet類中提供了service(HttpServletRequest,HttpServletResponse)方法,這個方法是HttpServlet自己的方法,不是從Servlet繼承來的。在HttpServlet的service(ServletRequest,ServletResponse)方法中會把ServletRequest和ServletResponse強轉成HttpServletRequest和HttpServletResponse,然後呼叫service(HttpServletRequest,HttpServletResponse)方法,這說明子類可以去覆蓋service(HttpServletRequest,HttpServletResponse)方法即可,這就不用自己去強轉請求和響應物件了。
並且在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法會去判斷當前請求是GET還是POST,如果是GET請求,那麼會去呼叫本類的doGet()方法,如果是POST請求會去呼叫doPost()方法,這說明我們在子類中去覆蓋doGet()或doPost()方法即可。如果沒有覆蓋doGet()或者doPost(),並且他們被呼叫了,會出現405(客戶端錯誤)。

七、Servlet細節
因為一個型別的Servlet只有一個例項物件,那麼就有可能會現時出一個Servlet同時處理多個請求,那麼Servlet是否為執行緒安全的呢?答案是:“不是執行緒安全的”。這說明Servlet的工作效率很高,但也存線上程安全問題!
所以我們不應該在Servlet中隨意建立成員變數,因為可能會存在一個執行緒對這個成員變數進行寫操作,另一個執行緒對這個成員變數進行讀操作。
可以建立一個成員(物件),但是狀態時只讀的,即只提供get方法沒有set方法。

相關推薦

javaWeb--Servlet----簡述實現方式原理

一、servlet概述 1、每個servlet都像是10086的話務員,但是每個servlet都是唯一的,他們能處理的請求是不同的。servlet的作用:接收請求資料,處理請求,完成響應。 2、Servlet類由我們來寫,但物件由伺服器來建立,並且由伺服器來

javaWeb基礎之Servlet實現方式以及兩配置方式

一、Servlet的三種實現方式 Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程式或服務聯結器,用Java編寫的伺服器端程式,主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。 1、Servlet的第一種建立方式:繼承Ht

servlet的介紹 & xml中配置 以及 & 實現方式(補充設定瀏覽器不快取的方法)

開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:2小時 備註:幾乎每一句話都很有收穫,複習的時候務必要仔細一點 Servlet

servlet的介紹 & xml中配置 以及 & 實現方式(補充設定瀏覽器不快取的方法)

開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:3小時 動態資源: Servlet 簡單介紹:   Servlet

servlet實現方式

一般來說,寫一個servlet,有三種實現方式: 1、實現Servlet介面。 2、繼承GenericServlet。 3、繼承HttpServlet。 第三種方式是現在比較常用的。 第一種: package com.tsinghua; //這是我的第一個servlet,使

Servlet-實現方式

1 實現servlet介面 //first Servlet(使用介面) package com.xc; import javax.servlet.* import java.io.*; impor

前臺頁面與後臺servlet實現登入的實現方式

第一種:action獲取資料在servlet實現轉發處理實現登入 前臺頁面 <form action="Hasdf" method="get">賬號:<input type="tex

JAVA迴圈使每次迴圈出來的都是四位數例如00010002,0003 實現方式

問題描述:迴圈使每次迴圈出來的都是四位數例如0001,0002,0003 現在給出三種實現方式: 第一種實現方式: public class temp1 { public stati

Java 多線程 實現方式

() 例子 屬於 周期性 core www object 並且 check Java多線程實現方式主要有三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都

mysql讀寫分離的實現方式

不能 span bsp 缺點 解決方案 使用 隨機 mas 均衡   1 程序修改mysql操作類可以參考PHP實現的Mysql讀寫分離,阿權開始的本項目,以php程序解決此需求。優點:直接和數據庫通信,簡單快捷的讀寫分離和隨機的方式實現的負載均衡,權限獨立分配缺點:自己維

沈浸式狀態欄的實現方式

stemwin barh webp trac war nba schema 布局文件 adding 沈浸式算是目前Android行業比較流行的一種App設計風格,將菜單欄北京設置為導航欄的顏色,感覺頂部狀態欄像是被入侵了一樣,因此稱為沈浸式菜單欄。本文將介紹三種方式去實現沈

mybatis之接口方法多參數的實現方式

自動 spa commit col pri true keys use 數據 關鍵代碼舉例: DaoMapper.xml 1 <!-- 傳入多個參數時,自動轉換為map形式 --> 2 <insert id="insertByCol

生產者消費者模式的實現方式

ring product while ide bsp turn this trac exce synchronized版本public class Test { public static void main(String[] args) { Shared s =

單例的實現方式

In imp SQ span wrap 定制 bsp () import 一:類方法實現單例 class Mysql: __instance = None def __init__(self,host,port): self.ho

Python selenium —— 一定要會用selenium的等待等待方式解讀(轉)

我們 嚴重 -s ber 約定 fire locate ror nbsp 發現太多人不會用等待了,博主今天實在是忍不住要給大家講講等待的必要性。 很多人在群裏問,這個下拉框定位不到、那個彈出框定位不到…各種定位不到,其實大多數情況下就是兩種問題:1 有frame,2 沒有加

單例模式的實現方式

let ini dict 重新 文件中 rap acl return **kwargs 一、單例模式的三種實現方式 1. 什麽是單例模式 基於某種方法,實例化多次,得到同一個實例/對象 2. 為什麽用單例模式 實例化多次,得到的對象屬性內容都一樣時,應該將這些對

java筆試題:找出3~999的水仙花數的實現方式

style col 展示 ava num get 實現 sys pack 第一種方式: package test; public class Exsercise { public static void main(String[] args) {

分散式鎖解決併發的實現方式

分散式鎖解決併發的三種實現方式 在很多場景中,我們為了保證資料的最終一致性,需要很多的技術方案來支援,比如分散式事務、分散式鎖等。有的時候,我們需要保證一個方法在同 一時間內只能被同一個執行緒執行。在單機環境中,Java中其實提供了很多併發處理相關的API,但是這些API在分散式場景中就無能

hdu4841---圓桌問題解題報告(約瑟夫環問題---陣列,queue,vector實現方式)

                                          &

Spark SQL join的實現方式

引言 join是SQL中的常用操作,良好的表結構能夠將資料分散到不同的表中,使其符合某種規範(mysql三大正規化),可以最大程度的減少資料冗餘,更新容錯等,而建立表和表之間關係的最佳方式就是join操作。 對於Spark來說有3種Join的實現,每種Join對應的不同的應用場景(SparkSQL自動決策