Tomcat&&Selvlet
1.web相關概念
1.1軟件架構
1. C/S:客戶端/服務器端
2. B/S:瀏覽器/服務器端
1.2資源分類
2.1. 靜態資源:所有用戶訪問後,得到的結果都是一樣的,稱爲靜態資源.靜態資源可以直接被瀏覽器解析
如: html,css,JavaScript
2.2. 動態資源:每個用戶訪問相同資源後,得到的結果可能不一樣。稱爲動態資源。動態資源被訪問後,需要先轉換爲靜態資源,在返回給瀏覽器
如:servlet/jsp,php,asp....
*
1.3 網絡通信三要素
1. IP:電子設備(計算機)在網絡中的唯一標識。
2. 端口:應用程序在計算機中的唯一標識。 0~65536
3. 傳輸協議:規定了數據傳輸的規則
1. 基礎協議:
1. tcp:安全協議,三次握手。 速度稍慢
2. udp:不安全協議。 速度快
2.web服務器軟件:Tomcat
Tomcat:web服務器軟件
1. 下載:http://tomcat.apache.org/
2. 安裝:解壓壓縮包即可。
注意:安裝目錄建議不要有中文和空格
3. 卸載:刪除目錄就行了
4. 啓動:
bin/startup.bat ,雙擊運行該文件即可
訪問:瀏覽器輸入:http://localhost:8080 回車訪問自己
http://別人的ip:8080 訪問別人
* 可能遇到的問題:
1. 黑窗口一閃而過:
原因: 沒有正確配置JAVA_HOME環境變量
解決方案:正確配置JAVA_HOME環境變量
2. 啓動報錯:
1. 暴力:找到佔用的端口號,並且找到對應的進程,殺死該進程
netstat -ano
2. 溫柔:修改自身的端口號
conf/server.xml
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8445" />
一般會將tomcat的默認端口號修改爲80。80端口號是http協議的默認端口號。
好處:在訪問時,就不用輸入端口號
5. 關閉:
1. 正常關閉:
bin/shutdown.bat
ctrl+c
2. 強制關閉:
點擊啓動窗口的×
6. 配置:
部署項目的方式:
1. 直接將項目放到webapps目錄下即可。
/hello:項目的訪問路徑-->虛擬目錄
簡化部署:將項目打成一個war包,再將war包放置到webapps目錄下。
* war包會自動解壓縮
2. 配置conf/server.xml文件
在<Host>標籤體中配置
<Context docBase="D:\hello" path="/hehe" />
docBase:項目存放的路徑
path:虛擬目錄
3. 在conf\Catalina\localhost創建任意名稱的xml文件。在文件中編寫
<Context docBase="D:\hello" />
虛擬目錄:xml文件的名稱
靜態項目和動態項目:
目錄結構
java動態項目的目錄結構:
-- 項目的根目錄
-- WEB-INF目錄:
-- web.xml:web項目的核心配置文件
-- classes目錄:放置字節碼文件的目錄
-- lib目錄:放置依賴的jar包
* 將Tomcat集成到IDEA中,並且創建JavaEE的項目,部署項目。
- tomcat目錄結構如下:
注意: WEB-INF下的lib目錄一定不要寫成libs不然運行項目時會報錯,自己踩過的坑。
3.Servlet入門學習
3.1概念:運行在服務器端的小程序
Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。
將來我們自定義一個類,實現Servlet接口,複寫方法。
3.2快速入門
1. 創建JavaEE項目
2. 定義一個類,實現Servlet接口
* public class ServletDemo1 implements Servlet
3. 實現接口中的抽象方法
4. 配置Servlet
在web.xml中配置:
<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
3.3執行原理
1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
2. 查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
3. 如果有,則在找到對應的<servlet-class>全類名
4. tomcat會將字節碼文件加載進內存,並且創建其對象
5. 調用其方法
3.4Servlet中的生命週期
1. 被創建:執行init方法,只執行一次
Servlet什麼時候被創建?
默認情況下,第一次被訪問時,Servlet被創建
可以配置執行Servlet的創建時機。
在<servlet>標籤下配置
1. 第一次被訪問時,創建
<load-on-startup>的值爲負數
2. 在服務器啓動時,創建
<load-on-startup>的值爲0或正整數
Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
多個用戶同時訪問時,可能存在線程安全問題。
解決:儘量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對修改值
2. 提供服務:執行service方法,執行多次
每次訪問Servlet時,Service方法都會被調用一次。
3. 被銷燬:執行destroy方法,只執行一次
* Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
* 只有服務器正常關閉時,纔會執行destroy方法。
* destroy方法在Servlet被銷燬之前執行,一般用於釋放資源
3.5Servlet3.0
優點: 支持註解配置。可以不需要web.xml了
相關的配置:
- 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml
2. 定義一個類,實現Servlet接口
3. 複寫方法
4. 在類上使用@WebServlet註解,進行配置
* @WebServlet(“資源路徑”)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";//相當於<Servlet-name>
String[] value() default {};//代表urlPatterns()屬性配置
String[] urlPatterns() default {};//相當於<url-pattern>
int loadOnStartup() default -1;//相當於<load-on-startup>
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
3.6IDEA與tomcat的相關配置
-
IDEA會爲每一個tomcat部署的項目單獨建立一份配置文件
- 查看控制檯的log:Using CATALINA_BASE: “C:\Users\Belief.IntelliJIdea2019.1\system\tomcat\Tomcat_8_5_31_JSPDemo001”
-
工作空間項目 和 tomcat部署的web項目
- tomcat真正訪問的是“tomcat部署的web項目”,“tomcat部署的web項目"對應着"工作空間項目” 的web目錄下的所有資源
- WEB-INF目錄下的資源不能被瀏覽器直接訪問。
-
斷點調試:使用"小蟲子"啓動 dubug 啓動
3.7ervlet的體系結構
Servlet -- 接口
|
GenericServlet -- 抽象類
|
HttpServlet -- 抽象類
GenericServlet:將Servlet接口中其他的方法做了默認空實現,只將service()方法作爲抽象
將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可
HttpServlet:對http協議的一種封裝,簡化操作
1. 定義類繼承HttpServlet
2. 複寫doGet/doPost方法
3.8. Servlet相關配置
1. urlpartten:Servlet訪問路徑
1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})
2. 路徑定義規則:
1. /xxx:路徑匹配
2. /xxx/xxx:多層路徑,目錄結構
3. *.do:擴展名匹配