Tomcat概述
什麼是服務器?
- 服務器:通俗來說就是安裝了服務器軟件的計算機
服務器軟件的作用?
- 接收用戶的請求,處理請求,做出響應
web服務器軟件的特點:
- 在web服務器軟件中,可以部署web項目,讓用戶通過瀏覽器來訪問這些項目
- web服務器軟件有時候也被稱爲web容器
- 接收用戶的請求,處理請求,做出響應。
常見的java相關的web服務器軟件:
- webLogic:oracle公司,大型的JavaEE服務器,支持所有的JavaEE規範,收費的。
- webSphere:IBM公司,大型的JavaEE服務器,支持所有的JavaEE規範,收費的。
- JBOSS:JBOSS公司的,大型的JavaEE服務器,支持所有的JavaEE規範,收費的。
- Tomcat:Apache基金組織,中小型的JavaEE服務器,僅僅支持少量的JavaEE規範servlet/jsp。開源的,免費的。
JavaEE:Java語言在企業級開發中使用的技術規範的總和,一共規定了13項大的規範
Tomcat的使用
下載:進入官網http://tomcat.apache.org/ 下載我們需要的版本
安裝:解壓壓縮包即可。 注意:安裝目錄建議不要有中文和空格。安裝完成之後如下圖所示:
啓動:進入bin/startup.bat ,雙擊運行該文件即可
訪問:瀏覽器輸入:http://localhost:8080 回車訪問自己丶http://別人的ip:8080 訪問別人
可能遇到的問題:
問題一:雙擊啓動黑窗口一閃而過:
- 原因: 沒有正確配置JAVA_HOME環境變量。解決方案:正確配置JAVA_HOME環境變量
問題二:啓動報錯
- 原因:端口號被佔用
- 解決方式一:使用 netstat -ano命令找到佔用的端口號,並且找到對應的進程,殺死該進程
- 解決方式二:修改自身的端口號,找到conf目錄下的server.xml,修改端口號。一般會將tomcat的默認端口號修改爲80。80端口號是http協議的默認端口號。好處:在訪問時,就不用輸入端口號
關閉Tomcat:
- 正常關閉:使用bin/shutdown.bat 命令 或者使用快捷鍵 ctrl+c
- 強制關閉: 點擊啓動窗口的
部署項目
方式一:直接將項目放到webapps目錄下即可。
項目訪問:http://localhost:8080/myProject 項目的訪問路徑-->一般我們成爲項目的訪問路徑爲虛擬目錄 myProject是項目的名稱, 後面加上要具體訪問的文件。簡化部署:將項目打成一個war包,再將war包放置到webapps目錄下。war包會自動解壓縮
方式二:配置conf/server.xml文件。告訴Tomcat服務器項目所在的地方
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!--部署項目-->
<Context docBase="D:\hello" path="/hehe" />
</Host>
- docBase:項目存放的路徑
- path:虛擬目錄
方式三(推薦):在conf\Catalina\localhost裏創建任意名稱的xml文件。在文件中編寫<Context docBase="D:\hello" />
- docBase:項目存放的路徑
- 虛擬目錄:xml文件的名稱
項目分類
- 分類:靜態項目和動態項目:
java動態項目的目錄結構:
Tomcat集成到IDEA中
- 打開IDEA,點擊菜單欄中的Run->Edit Configurations->Templates->Tomcat Server->Local;
- 點擊Local右邊界面第一行Application Server:後面的Configure...按鈕,會自動跳出新窗口並選中tomcat的安裝路徑,點擊OK,導入tomcat;
- 再次點擊Application Server:中的tomcat並點擊後面的Configure..按鈕,可確認tomcat以及classes文件以及成功導入;
- File->new->module->Java Enterprise,選擇合適的選項並創建Java EE項目;
- 打開index.jsp,更改title和body標籤的內容,並點擊執行按鈕,會打開瀏覽器的對應界面,配置成功!
Servlet入門
概念:Servlet就是運行在服務器端的小程序。
當不同的用戶服務同一個服務器的時候,服務器會有不同的應答。如何分辨不同的用戶,那就必須要有邏輯判斷。在服務器我們使用Java類執行邏輯判斷。這個Java類依賴於服務器才能運行,Tomcat去執行它。前提是:需要遵守一定的規則(接口)才能被Tomcat所識別
總結:
- Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。
- 將來我們自定義一個類,實現Servlet接口,複寫方法。
快速入門
- 創建JavaEE項目
- 定義一個類,實現Servlet接口
- 實現接口中的抽象方法
- 進入web.xml配置Servlet的映射關係
爲什麼要配置Servlet,因爲我們通過瀏覽器訪問,最後輸入的是資源名稱。必須使資源名稱和通過服務的Servlet產生映射關係,我們才能訪問到Servlet類,因此我們必須在web.xml裏去配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Servlet-->
<servlet>
<!-- Servlet的名字,任意-->
<servlet-name>demo01</servlet-name>
<!-- 通過服務的Servlet的全類名-->
<servlet-class>com.wrg.web.Demo01Servlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 資源文件要映射的Servlet名字-->
<servlet-name>demo01</servlet-name>
<!-- url-pattern 配置資源文件的名稱,將來我們通過這個配置的數據訪問-->
<url-pattern>/MyDemo01</url-pattern>
</servlet-mapping>
</web-app>
執行原理:
- 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
- 查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
- 如果有,則在找到對應的<servlet-class>全類名
- omcat會將字節碼文件加載進內存,並且創建其對象
- 調用其方法
Servlet中的生命週期方法:
1. 被創建:
- 執行init方法,只執行一次
Servlet什麼時候被創建?
- 默認情況下,第一次被訪問時,Servlet被創建
- 可以配置執行Servlet的創建時機。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--配置Servlet -->
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>cn.web.servlet.ServletDemo2</servlet-class>
<!--指定Servlet的創建時機
1.第一次被訪問時,創建
* <load-on-startup>的值爲負數
2.在服務器啓動時,創建
* <load-on-startup>的值爲0或正整數
-->
<load-on-startup>-5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
</web-app>
Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的。多個用戶同時訪問時,可能存在線程安全問題。解決:儘量不要在Servlet中定義成員變量。即使定義了成員變量,也不要對修改值
提供服務:
- 執行service方法,執行多次。每次訪問Servlet時,Service方法都會被調用一次。
被銷燬:
- 執行destroy方法,只執行一次
- Servlet被銷燬時執行。服務器關閉時,Servlet被銷燬
- 只有服務器正常關閉時,纔會執行destroy方法。
- destroy方法在Servlet被銷燬之前執行,一般用於釋放資源
package cn.itcast.web.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* Servlet的方法
*/
public class ServletDemo2 implements Servlet {
private int age = 3;
/**
* 初始化方法
* 在Servlet被創建時,執行。只會執行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
}
/**
* 獲取ServletConfig對象
* ServletConfig:Servlet的配置對象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服務方法
* 每一次Servlet被訪問時,執行。執行多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service.....");
int number = 3;
}
/**
* 獲取Servlet的一些信息,版本,作者等等。。
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 銷燬方法
* 在服務器正常關閉時,執行,執行一次。
*/
@Override
public void destroy() {
System.out.println("destroy.....");
}
}
Servlet3.0註解配置
好處:支持註解配置。可以不需要web.xml了。
步驟:
- 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml
- 定義一個類,實現Servlet接口
- 複寫方法
- 在類上使用@WebServlet註解,進行配置。@WebServlet("資源路徑")
我們通過瀏覽器訪問http://localhost:8080/day13/demo 就可以訪問到配置的Servlet了。
注意:
- tomcat真正訪問的是“tomcat部署的web項目”,"tomcat部署的web項目"對應着"工作空間項目" 的web目錄下的所有資源
- WEB-INF目錄下的資源不能被瀏覽器直接訪問。
- 斷點調試:使用"小蟲子"啓動 dubug 啓動
Servlet的體系結構
創建一個Servlet程序,必須要實現(直接實現或間接實現)Servlet接口,比如繼承HttpServlet,HttpServlet繼承GenericServlet,GenericServlet實現了Servlet接口,繼承結構如下:
總結
- GenericServlet:將Servlet接口中其他的方法做了默認空實現,只將service()方法作爲抽象
- HttpServlet:對http協議的一種封裝,簡化操作
結論:
- 因此以後在開發中,如果需要創建Servlet程序,我們只需要寫一個類,去繼承HttpServlet類,並覆蓋其中的doGet方法和doPost方法,分別來處理GET提交和POST提交!!
Servlet 相關配置
- Web.xml 中urlpartten 的屬性配置的是Servlet訪問路徑。而我們可以使用@WebServlet 代替配置文件。
- 一個Servlet可以定義多個訪問路徑 ,例如:@WebServlet({"/d4","/dd4","/ddd4"})
路徑定義規則有下面幾種方式:
- /xxx:路徑匹配
- /xxx/xxx:多層路徑
- *.do:擴展名匹配