day46_Tomcat丶Servlet

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 &quot;%r&quot; %s %b" />
			   
		<!--部署項目-->
			<Context docBase="D:\hello" path="/hehe" />	
      </Host>
  •  docBase:項目存放的路徑
  •  path:虛擬目錄

方式三(推薦):在conf\Catalina\localhost裏創建任意名稱的xml文件。在文件中編寫<Context docBase="D:\hello" />

  • docBase:項目存放的路徑
  • 虛擬目錄:xml文件的名稱

項目分類

  • 分類:靜態項目和動態項目:

java動態項目的目錄結構:

Tomcat集成到IDEA中

  1. 打開IDEA,點擊菜單欄中的Run->Edit Configurations->Templates->Tomcat Server->Local;
  2. 點擊Local右邊界面第一行Application Server:後面的Configure...按鈕,會自動跳出新窗口並選中tomcat的安裝路徑,點擊OK,導入tomcat;
  3. 再次點擊Application Server:中的tomcat並點擊後面的Configure..按鈕,可確認tomcat以及classes文件以及成功導入;
  4. File->new->module->Java Enterprise,選擇合適的選項並創建Java EE項目;
  5. 打開index.jsp,更改title和body標籤的內容,並點擊執行按鈕,會打開瀏覽器的對應界面,配置成功!

Servlet入門

概念Servlet就是運行在服務器端的小程序。

當不同的用戶服務同一個服務器的時候,服務器會有不同的應答。如何分辨不同的用戶,那就必須要有邏輯判斷。在服務器我們使用Java類執行邏輯判斷。這個Java類依賴於服務器才能運行,Tomcat去執行它。前提是:需要遵守一定的規則(接口)才能被Tomcat所識別

                      

總結:

  • Servlet就是一個接口,定義了Java類被瀏覽器訪問到(tomcat識別)的規則。
  • 將來我們自定義一個類,實現Servlet接口,複寫方法。

快速入門

  1. 創建JavaEE項目
  2. 定義一個類,實現Servlet接口
  3. 實現接口中的抽象方法
  4. 進入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>

執行原理:

  1. 當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
  2. 查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
  3. 如果有,則在找到對應的<servlet-class>全類名
  4. omcat會將字節碼文件加載進內存,並且創建其對象
  5. 調用其方法

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了。

步驟:

  1. 創建JavaEE項目,選擇Servlet的版本3.0以上,可以不創建web.xml
  2. 定義一個類,實現Servlet接口
  3. 複寫方法
  4. 在類上使用@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:擴展名匹配

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章