文章目錄
1、jetty服務器安裝
-
下載地址:http://www.eclipse.org/jetty/previousversions.html
下載解壓到自己的安裝路徑下就可以使用
-
更改端口號
使用記事本打開jetty安裝目錄下的
start.ini
文件,找到下面代碼位置,設置端口,默認的是8080(Tomcat服務器也是,兩個都安裝的話,爲了避免衝突,建議修改端口號)##Connector port to listen on jetty.http.port=8888
-
啓動
打開jetty的安裝路徑,有一個
start.jar
文件,使用cmd命令行,先進入start.jar
文件的目錄,使用命令java -jar start.jar
運行
2、jsp在IDEA中創建、部署、運行
參考鏈接:https://www.simoniu.com/blog/113
3、Servlet處理請求、生命週期
兩個註解
@WebFilter:過濾器
@WebServlet:Servlet
3.1、第一次加載
構造方法-->初始化init()方法-->service()方法(調用doGet()方法或doPost()方法)-->銷燬destroy()方法
3.2、非第一次加載(Servlet已經駐留內存了)
service()方法(調用doGet()方法或doPost()方法)-->銷燬destroy()方法
3.3、預加載
將Servlet首次加載到內存中(默認是懶加載,也就是用的時候再加載)
設置爲預加載(提前加載):在webServlet註解上添加屬性值loadOnStartup=1,數字越小,級別越高
@WebServlet(name = "ServletTest01", value = "/ServletTest01*", loadOnStartup = 1)
3.4、一個Servlet設置多個請求地址
在註解上使用urlPatterns屬性
//注意:Servlet的URL寫法必須以/開頭
@WebServlet(urlPatterns = {"/HelloWorldServlet", "/haha", "/hehe"})
3.5、Servlet路徑匹配規則
路徑匹配與擴展名匹配不能混用
-
精確匹配(最精準的),默認的,優先級別最高
-
路徑匹配(在同一路徑下)
value = "/abc/*"
@WebServlet(name = "ServletTest01", value = "/abc/*")
-
擴展名匹配(後綴一致)
value ="*.html"
@WebServlet(name = "ServletTest02",value ="*.html" )
-
默認匹配(以上三個都匹配不成功,找默認匹配)
value = "/"
,一般用來做錯誤頁面//默認匹配,如果精確匹配、路徑匹配、後綴名匹配都沒有匹配上,就會訪問到這個頁面 @WebServlet(name = "ServletTest03", value = "/")
-
過濾器匹配(一般不用),過濾所有的請求,一般使用在Filter上
-
優先級:精確匹配>路徑匹配>擴展名匹配>默認匹配
3.6、Servlet響應返回客戶端的文件類型
瀏覽器會根據文件的類型進行解析
text/html;charest=utf-8:網頁
text/plain;charest=utf-8:純文本
text/xml;charest=utf-8:xml文本
text/json;charest=utf-8:json
3.7、關於瀏覽器首頁是默認的index.jsp,還是自定義的默認匹配規則頁面
不寫默認匹配規則會跳轉到默認首頁index.jsp
(在welcome-file-list屬性,默認找項目中的index.jsp文件,作爲默認首頁)
寫了默認匹配規則服務器就會加載自定義的默認匹配規則的頁面,瀏覽器默認會在URL地址後面加一個/
4、Servlet處理用戶請求模式及單例模式
4.1、Servlet處理用戶請求模式
單例多線程處理,每一個Servlet只有一份存在,因爲是多線程處理,所以會有線程安全問題,在設計程序的時候要考慮進去。
單例類MySun的設計
package org.westos.test;
//設計一個單例類太陽類,單例就是隻有一份
/*
設計原則
1. 構造方法私有
2. 靜態方法返回單例對象
*/
public class MySun {
private static MySun sun;
//私有構造
private MySun() {
}
//得到MySun對象的方法
public static MySun getSun() {
if (sun == null) {
sun = new MySun();
}
return sun;
}
}
4.2、單例及單例的六種設計模式
- 單例:最多隻有一份,不會有多餘的。單例模式的目的是使得類的一個對象成爲系統中的唯一實例,“阻止”所有想要生成對象的訪問
- 單例設計模式
- 懶漢式—線程不安全:最基礎的實現方式,線程上下文單例,不需要共享給所有線程,也不需要加synchronize之類的鎖,以提高性能
- 懶漢式—線程安全:加上synchronize之類保證線程安全的基礎上的懶漢模式,相對性能很低,大部分時間並不需要同步
- 餓漢方式。指全局的單例實例在類裝載時構建。
- 雙檢鎖式。在懶漢式基礎上利用synchronize關鍵字和volatile關鍵字確保第一次創建時沒有線程間競爭而產生多個實例,僅第一次創建時同步,性能相對較高
- 登記式。作爲創建類的全局屬性存在,創建類被裝載時創建
- 枚舉。java中枚舉類本身也是一種單例模式
- 實現要點
- 某個類只能有一個實例(單例模式的類只提供私有的構造函數)
- 該類必須自行創建這個實例(類定義中含有一個該類的靜態私有對象)
- 該類必須自行向整個系統提供這個實例(提供了一個靜態的公有的函數用於創建或獲取它本身的靜態私有對象)
- 優缺點
- 實例控制,確保所有對象都訪問唯一實例
- 類可以靈活更改實例化過程
- 每次對象請求引用時都要檢查是否存在類的實例,需要一些開銷(通過使用靜態初始化解決)
- 不能解決刪除單個對象的問題,在提供內存管理的語言中,只有該單例類能夠導致實例被刪除;而在一些語言中,其他類可以刪除對象實例,會導致單例類中出現懸浮引用。
5、相對路徑與絕對路徑
- 舉例:對於西安人來說,你給一個西安人說去大雁塔玩,他就知道是哪兒。但是對於一個外國遊客,你就要說中國陝西西安大雁塔,這就是相對地址與絕對地址
- 相對地址是根據一個基準點去找的(比如從當前項目下找),而絕對路徑是從磁盤根目錄開始找的
- 相對路徑在拷貝文件時比較好用,拷過去的文件在原來的項目底下,相對路徑不變,拷貝過去直接使用,而絕對路徑因爲每個人磁盤存儲路徑不一致,很可能報錯
- 絕對地址:從根目錄開始,有完整的路徑,誰拿着都可以找到,永遠都不會錯
jsp表達式:<%= %>
EL表達式:${}
6、請求重定向與請求轉發
導入別人的代碼到自己的工作空間下
-
複製到自己的工作空間
-
創建新的工作空間
-
file----new----moudle from……
-
設置一下
-
請求重定向:本質上是兩次請求,兩個Servlet對象,所以地址欄的url會變化,Servlet屬性不保存
客戶端—>服務器—>重定向—>客戶端請求其他地址
多使用在需要身份權限驗證的使用,在權限不明確的時候要求重新登錄
-
請求轉發:本質是一次請求,一個Servlet,所以地址欄的url不變,Servlet屬性保存
客戶端—>服務器—>服務器內部請求其他的地址
7、獲取Servlet內置對象
-
九大內置對象
out、page、request、response、session、application、 exception、pageContext、config -
常用(掌握)
request、response、session、application -
在Servlet中獲取
參數自帶的:request、response
session獲取:request.getSession()
application獲取:request.getServletContext()
-
範圍大小
application>session>request>page