<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於jdk中沒有servlet對應的jar包,所以需要咱們手動引入,有兩種方式:
1.可以採取向lib目錄匯入servlet-api的jar包的方式
2.在maven專案中設定如下座標,並新增相關依賴到依賴庫中即可(推薦使用這種,在maven裡選擇webapp的骨架建立專案會自動給你設定好web.xml檔案)
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
版本號可以自己定,依賴範圍要設定成provided,否則會和其他jar包衝突
原生的Servlet專案都是實現Servlet介面,功能都是通過實現這個介面或者繼承HttpServlet來完成的,其實在IDEA裡重寫方法的過程中所對應的順序就是他的生命週期,以下面為例:
按照每一個方法翻譯而來的字面意思,流程是:
初始化——得到服務設定——服務——獲取服務資訊——銷燬,簡言之,就是一個從初始化到服務再到消亡的過程。
初始化階段:
public void init(ServletConfig servletConfig)
當伺服器啟動,讀取web.xml檔案的過程中,Tomcat載入 Servlet,載入完成後,Servlet 容器會建立一個 Servlet 範例 並呼叫 init()方法,init()方法只會呼叫一次,這個沒什麼好解析的,就是物件導向中類特性的體現
服務階段:
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
這個方法的形參裡有兩個ServletRequest和ServletResponse型別的介面,翻譯過來就是服務請求、服務響應,Tomcat啟動時自動裝載某些 servlet,並在 Servlet 容器啟動後,瀏覽器首次向 Servlet 傳送請求,傳送的請求和響應作為引數就傳到了service方法對應的形參裡進行處理。看了一下jdk的原始碼,發現兩個介面下面都有很多的抽象方法,至於請求和響應在底層是怎樣執行的原始碼裡啥都沒寫,目前還不知道(推測是個底層驅動)
消亡階段:
public void destroy()
從圖中規定的順序不難看出,執行到最後的方法也就預示著Servlet的生命即將結束
在JDK的原始碼中,Servlet介面下的destory()沒有方法體,應該也是和啟動執行緒的start0()方法類似被開發者封裝簡化了
完整流程演示:
@WebServlet("/demo1") public class SevDemo1 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException {System.out.println("我在初始化~~~");} @Override public ServletConfig getServletConfig() {return null;} @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hello world!!!!");} @Override public String getServletInfo() {return null;} @Override public void destroy() {System.out.println("我走了,拜拜~~~");} }
控制檯列印的資訊很好地反映了執行情況:
至於public ServletConfig getServletConfig()
和public String getServletInfo()
在實現介面後重寫的方法中預設返回的是null,應該是兩個起補充作用的方法
在實際開發中採用繼承HttpServlet類的方式開發Servlet程式更加方便,因為實現介面重寫那麼多方法是真的麻煩,而通過繼承的方式就可以根據需要選擇性的重寫doGe()或doPost()方法就簡單很多,比如
public class HttpDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("執行 doGet()..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("執行 doPost()..."); } }
至於方法體裡寫什麼內容就要看對應的業務場景了
氣氛烘托到這裡了就不得不說一下GET和POST的區別了
以前老師是教我這樣理解的——我把一封信放在信封裡郵寄出去,我可以選擇密封或者不密封,而這就會導致信的內容會不會被別人看到,若是前者則對應POST,後者就對應GET
當然,這只是抽象層面,而從具體方面來看:
1.從功能上來講,get是從伺服器上獲取資料,post是向伺服器傳送資料
2.從報文上來講,在不帶引數時區別就單純是第一行方法名不同,而在帶引數時GET方法的引數放在請求頭URL中,POST方法的引數放在請求體BODY中 注:GET方法的引數寫在?後,用&分割
3.從安全性來講,其實他們都不安全,因為http是明文傳輸(在網頁按F12進入開發者模式發現兩種方式都能看到資料資訊)。但是這張圖應該很生動形象也能反映一些問題,相比較之下POST還是比GET安全,因為資料在位址列不可見,哈哈哈
1.Servlet 是一個供其他 Java 程式(Servlet 引擎)呼叫的 Java 類,不能獨立執行
2.對於每次存取請求,Servlet 引擎都會建立一個新的 HttpServletRequest 請求物件和一個 新的 HttpServletResponse 響應物件,然後將這兩個物件作為引數傳遞給它呼叫的 Servlet 的 service()方法,service 方法再根據請求方式分別呼叫 doXXX 方法
3.針對瀏覽器的多次 Servlet 請求,通常情況下,伺服器只會建立一個 Servlet 範例物件, 也就是說 Servlet 範例物件一旦建立,它就會駐留在記憶體中,為後續的其它請求服務,直至 web 容器退出/或者 redeploy 該 web 應用,servlet 範例物件才會銷燬
4.如果在<servlet>元素中設定了一個<load-on-startup>元素,那麼 WEB 應用程式在啟動時, 就會裝載並建立 Servlet 的範例物件、以及呼叫 Servlet 範例物件的 init()方法
5.在 Servlet 的整個生命週期內,init 方法只被呼叫一次。而對每次請求都導致 Servlet 引 擎呼叫一次 servlet 的 service 方法
——ps:刷dy整理出來的
對於這些內部方法來說我覺得會用API就行
HttpServletRequest 表示請求過來的資訊:
公共介面類HttpServletRequest繼承自ServletRequest。使用者端瀏覽器發出的請求被封裝成為一個HttpServletRequest物件。物件包含了使用者端請求資訊包括請求的地址,請求的引數,提交的資料,上傳的檔案使用者端的ip甚至使用者端作業系統都包含在其內。
還是物件導向那一套,封裝成類後呼叫裡面的方法,部分常用方法如下:
public String getAuthType() | 返回這個請求的身份驗證模式 |
---|---|
public Cookie[ ] getCookies() | 返回一個陣列,該陣列包含這個請求中當前的所有cookie |
public long getDateHeader(String name) | 返回指定的請求頭域的值,這個值被轉換成一個精確到毫秒的長整數 |
public String getHeader(String name) | 返回一個請求頭域的值。(譯者注:與上一個方法不同的是,該方法返回一個字串) |
HttpServletResponse 表示所有響應的資訊,需要設定返回給使用者端的資訊,通過 HttpServletResponse 物件來進行設定即可,會用幾個核心API就夠了
addHeader(String name,String value) | 將指定的名字和值加入到響應的頭資訊中 |
---|---|
encodeURL(String url) | 編碼指定的URL |
setStatus(int sc) | 給當前響應設定狀態碼 |
setHeader(String name,String value) | 將給出的名字和值設定響應的頭部 |
先前在網頁中輸出hello java!只是一次請求對應一個Servlet,瀏覽器——Tomcat——Servlet沒有實現請求的轉發,而在真實環境中網站不可能只進行一次互動,往往需要在一次請求中使用到多個servlet完成
1.一個 web 資源收到使用者端請求後,通知伺服器去呼叫另外 一個 web 資源進行處理
2. HttpServletRequest 物件(也叫 Request 物件)提供了一個 getRequestDispatcher 方法,該 方法返回一個 RequestDispatcher 物件,呼叫這個物件的 forward 方法可以實現請求轉發
3. request 物件同時也是一個域物件,開發人員通過 request 物件在實現轉發時,把資料 通過 request 物件帶給其它 web 資源處理
在實際場景中,使用者輸入資訊提交後得到反饋這一過程就是典型的請求轉發,就像這樣:
第一個Servlet裡的情況
@WebServlet("/demo2") public class Sevdemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("這裡是demo2~~"); //儲存資料 req.setAttribute("懶羊羊","你好!"); //請求轉發 req.getRequestDispatcher("/demo3").forward(req,resp); } }
第二個Servlet裡的情況
@WebServlet("/demo3") public class Sevdemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("這裡是demo3~~"); Object msg= req.getAttribute("懶羊羊"); System.out.println(msg); } }
當我啟動Tomcat來存取demo2時:
實現了請求的轉發!
既然是一個Servlet轉發給另一個Servlet,且是部署在同一個Tomcat中,那就說明不能存取當前web工程外的資源、同一次 HTTP 請求中,進行多次轉發,仍然是一次 HTTP 請求
和請求轉發比較類似,請求重定向指:一個 web 資源收到使用者端請求後,通知使用者端去存取另外一個 web 資源,這稱之為請求重定向,還是通過API調方法來實現,基本流程如下:
首先通過setStatus()設定響應狀態碼,然後setHeader(“location”,“http://www.taobao.com”)設定新地址
就實現了請求重定向
@WebServlet("/demo2") public class Sevdemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("這裡是demo2~~"); //設定響應狀態碼 resp.setStatus(302); //設定新地址 resp.setHeader("location","http://www.taobao.com") } }
還有第二種方法,其實和這也大同小異
到這裡動態web的核心Servlet就介紹完了
內容以及配圖都是作者原創,若是覺得不錯的話可以三連一下,懶羊羊蟹蟹你~
到此這篇關於Javaweb動態開發最重要的Servlet詳解的文章就介紹到這了,更多相關Javaweb Servlet內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45