文章目錄
- 1. jetty服務器的下載與安裝
- 1.1 jetty簡介
- 1.2 jetty的下載與安裝
- 2. idea創建jsp項目
- 3. idea給jsp項目導入jar包
- 4. 編寫第一個servlet
- 5. Servlet的生命周期
- 6. Servlet的URL匹配規則
- 7. 字符集概念
1. jetty服務器的下載與安裝
1.1 jetty簡介
Jetty是當下非常流行的一款輕量級Java Web服務器和Servlet容器實現,類似于Tomcat,它由Eclipse基金會托管,完全免費而且開放源代碼,因此所有人均可以從其官網下載最新源代碼進行研究。由于其輕量、靈活的特性,Jetty被廣泛用于一系列知名產品,例如ActiveMQ、Maven、Spark、Google App Engine、Eclipse、Hadoop等等。
1.2 jetty的下載與安裝
-
從http://www.eclipse.org/jetty/previousversions.html網址可以下載不同版本的jetty,不同版本要求的jdk版本是不同的,根據自己jdk版本進行下載。
-
下載完成之后,直接解壓就可以使用,博主解壓之后的路徑是:D:\Environment\jetty。下面是這個路徑下解壓后目錄和文件的解釋。
-
下面是這個路徑下解壓后目錄和文件的解釋
-
jetty的啟動
為了防止與Tomcat的端口號:8080 沖突,編輯start.ini文件,將jetty的端口號改為:8888
一般情況下都可以通過安裝目錄下的start.jar包來啟動jetty,除此之外,還可以通過dos命令,先進入jetty的安裝文件夾,再輸入命令來進行啟動。
啟動命令為:java -jar start.jar
2. idea創建jsp項目
-
先創建一個工作空間
打開IDEA軟件
至此,工作空間創建完畢!
-
創建項目
File->New->Module
設置jetty服務器
-
測試訪問結果:
由于支持熱部署,修改index.jsp里的代碼后,直接刷新就可以更新顯示
3. idea給jsp項目導入jar包
- 一般放在 WEB-INF/lib 目錄里面
- 配置項目依賴
- 編寫測試類測試
package com
.zz
.test
;
import java
.sql
.Connection
;
import java
.sql
.DriverManager
;
public class Test {public static void main(String
[] args
) {String url
= "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=UTF-8";try{Class
.forName("com.mysql.jdbc.Driver"); Connection conn
= DriverManager
.getConnection(url
,"root","123456");if(conn
!=null
){System
.out
.println("連接MySQL成功!");}else{System
.out
.println("連接MySQL失敗!");}}catch(Exception ex
){ex
.printStackTrace();}}
}
- 分析:雖然可以這樣手工導入 jar包,但是顯然不利于大型項目開發,也不易于依賴維護管理,很容易出現依賴的版本沖突和依賴缺失的現象。因此,團隊開發時必須使用具有依賴管理的建構工具比如:maven,gradle等等。
4. 編寫第一個servlet
package com
.zz
.servlet
;import javax
.servlet
.ServletException
;
import javax
.servlet
.annotation
.WebServlet
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;
@WebServlet(value
= "/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{System
.out
.println("執行了HelloWorldServlet的doGet()...");}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{System
.out
.println("執行了HelloWorldServlet的doPost()...");}@Overridepublic void destroy() {super.destroy();}@Overridepublic void init() throws ServletException
{super.init();}
}
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html><head><title></title
></head
><body><h1>我的jsp頁面
</h1
><%--使用表單實現發送一個post請求,請求的動作地址HelloWorldServlet
--%><form action
="HelloWorldServlet" method
="post"><input type
="submit" value
="執行了HelloWorldServlet"></form
></body
>
</html
>
- 測試訪問結果:
輸入地址HelloWorldServlet,發送get請求
執行表單,發送post請求
5. Servlet的生命周期
(1)加載和實例化
當Servlet容器啟動或客戶端發送一個請求時,Servlet容器會查找內存中是否存在該Servlet實例,若存在,則直接讀取該實例響應請求,直接進入步驟(3);如果不存在,就通過構造方法創建一個Servlet實例。
(2) 初始化
實例化后,Servlet容器將調用Servlet的 init() 方法進行初始化(一些準備工作或資源預加載工作)。
(3)服務
初始化后,Servlet處于能響應請求的就緒狀態。當接收到客戶端請求時,調用service() 的方法處理客戶端請求,HttpServlet的service()方法會根據不同的請求 轉調不同的doXxx()方法:doGet()和doPost()。
(4)銷毀
重新發布項目,正常關閉tomcat時,會執行destroy() 方法,如果非正常關閉,相當于程序中斷,不會執行方法。
package com
.zz
.servlet
;import javax
.servlet
.ServletConfig
;
import javax
.servlet
.ServletException
;
import javax
.servlet
.annotation
.WebServlet
;
import javax
.servlet
.http
.HttpServlet
;
import javax
.servlet
.http
.HttpServletRequest
;
import javax
.servlet
.http
.HttpServletResponse
;
import java
.io
.IOException
;
@WebServlet(value
= "HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {public HelloWorldServlet() {System
.out
.println("HelloWorldServlet的構造方法()...");}@Overrideprotected void service(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{System
.out
.println("執行了HelloWorldServlet的service()...");super.service(req
, resp
);}@Overrideprotected void doGet(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{System
.out
.println("執行了HelloWorldServlet的doGet()...");}@Overrideprotected void doPost(HttpServletRequest req
, HttpServletResponse resp
) throws ServletException
, IOException
{System
.out
.println("執行了HelloWorldServlet的doPost()...");}@Overridepublic void destroy() {System
.out
.println("HelloWorldServlet的destroy()...");}@Overridepublic void init(ServletConfig config
) throws ServletException
{System
.out
.println("HelloWorldServlet的init()...");}
}
第一次點擊表單按鈕:
第二次點擊表單的按鈕:
總結:
1.如果是第一次請求。
--->doGet構造方法
-->init
-->service
--->destroy
--->doPost
2.如果不是第一次請求說明這個servlet已經駐留內存了。
--->doGetservice
-- ---->destroy
--->doPost
注意:此測試是使用jetty服務器,沒有試驗出destroy的效果。如果使用tomcat服務器,重新發布項目,正常關閉tomcat時,會執行destroy()方法,如果非正常關閉,相當于程序中斷,不會執行方法。
- 如何實現預加載
servlet必須是你第一次請求的時候,才加載到內存中,默認是一種懶加載。
如何使用積極加載?即不管是否用到,都先加載到內存中。
方法:添加一個loadOnStartup屬性,數字越小優先級別越高,來實現預加載。
如下圖在注釋后面,添加此屬性,點擊運行,沒有點擊請求,就運行了構造方法和初始化方法。
- 一個servlet可以對應多個請求地址
方法: 在注釋處使用urlPatterns屬性代替value屬性
比如如下,servlet的url寫法,必須以 / 開頭
@WebServlet(urlPatterns
={"/HelloWorldServlet","/Haha","/Hehe"} ,loadOnStartup
= 1)
6. Servlet的URL匹配規則
- 精確匹配: /servlet/HelloWorldServlet ,找最準確的地址。(優先級最高)
- 路徑匹配: /abc/*
- 擴展名匹配: * .action,注意:路徑匹配和擴展名匹配不能混用。如 /abc/* .action 這樣的寫法都不對。
- 默認匹配:/
- 過濾器 : /* 過濾所有的請求,一般servlet不會這樣配,一般使用在Filter過濾器上。
7. 字符集概念
-
英文字符:
占一個字節,ASCII,ISO_8859_1,Unicode,utf-8三者編碼都是一樣的,所以不存在亂碼問題。
-
中文字符:
gbkgb2312 1個字節unicode 4個字節utf-8 3個字節 同時字符的編碼值都不相同
-
結論:
(1)軟件開發中一律使用utf-8,utf-8本身就是unicode字符編碼的一種存儲編碼方案。
(2)程序世界是一個英文的世界,能不用中文千萬不要用中文。
在程序中,中文只能出現在兩個地方:①注釋 ②字符串變量中
總結
以上是生活随笔為你收集整理的JavaWeb(十)——jetty服务器、创建jsp项目、servlet生命周期及url的匹配规则的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。