Day91.Servlet基本內容① -Servlet、jsp和表示式

轉行一點成功發表於2020-11-03

Servlet基本內容①

1. Servlet 技術

a.什麼是Servlet

1. Servlet是JavaEE規範之一。		規範就是 介面
2. Servlet是JavaWeb三大元件之一。	三大元件分別是:Servlet程式、Filter過濾器、Listener監聽器。
3. Servlet是執行在伺服器上的一個Java小程式,他可以接收客服端送過來的請求,並響應資料給客戶端。

.

b.手動實現Servlet程式

1. 編寫一個類去實現Servlet介面
2. 實現service方法,處理請求,並響應資料
3. 到web.xml中配置servlet程式的訪問地址

.

c.Servlet 程式的示例程式碼:

  • 常見錯誤1:url-pattern 中配置的路徑沒有以斜槓打頭。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2Hs87Hav-1604418485617)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221016965.png)]

.

  • 常見錯誤2:servlet-name 配置的值不存在:
<servlet>標籤和<servlet-mapping>標籤的<servlet-name>標籤的內容不一致

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-m8TTvLxF-1604418485620)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221314394.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-0g2mXE1a-1604418485623)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221250803.png)]
在這裡插入圖片描述

.

  • 常見錯誤3:servlet-class 標籤的全類名配置錯誤:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-skZp8cQy-1604418485626)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221653477.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-CLQQH7bV-1604418485629)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221710805.png)]

.

d.url地址到Servlet程式的訪問原理

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-MV41z6x8-1604418485631)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102222856667.png)]

.

e.Servlet 的生命週期

1. 執行Servlet構造器方法
2. 執行init()初始化方法
3. 執行service()方法
4. 執行destroy()銷燬方法

說明:
	第一、第二步,是在第一次訪問時,建立Servlet程式會呼叫
	第三步,都會呼叫service方法
	第四步,在web工程停止的時候呼叫
public class HelloServlet implements Servlet {

    public HelloServlet() {
        System.out.println("1 構造器方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 init初始化方法");

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /*
    service()方法是專門用來處理請求和響應的
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service == Hello Servlet 被訪問了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("4 destroy銷燬方法");
    }
    
}

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-9dT5Bm0D-1604418485633)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102223831273.png)]

f.GET 和 POST 請求的分發處理

public class HelloServlet implements Servlet {
    /*
    service()方法是專門用來處理請求和響應的
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service == Hello Servlet 被訪問了");
        //型別轉換
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //獲取請求方式
        String method = httpServletRequest.getMethod();

        if ("GET".equals(method)){
            getmethod();

        }else if ("POST".equals(method)){
            getmethod();
        }
    }

    public void getmethod(){
        System.out.println("get請求");
        System.out.println("get請求");
        System.out.println("get請求");
    }
    public void postmethod(){
        System.out.println("post請求");
        System.out.println("post請求");
        System.out.println("post請求");
    }
    
    
    
    //省略getServletInfo、destroy、getServletConfig、init、HelloServlet方法
}

.

g.通過繼承 HttpServlet 實現 Servlet 程式

一般在實際開發專案中,都是使用繼承HttpServlet類的方式去實現Servlet程式。

  1. 編寫一個類去繼承HttpServlet類
  2. 根據業務需要重寫doGet或doPost方法
  3. 到web.xml中配置Servlet程式的訪問地址
Servlet 類的程式碼:


public class HelloServlet2 extends HttpServlet {

    //doGET()方法 在GET請求的時候呼叫
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2的doGet()方法");
    }

    
    //doPost()方法 在Post請求的時候呼叫
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2的doPOST()方法");
    }
}
web.xml 中的配置

<servlet>
    <servlet-name>HelloServlet2</servlet-name>
    <servlet-class>com.achang.servlet.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet2</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>

.

h.使用 IDEA 建立 Servlet 程式

  • 選單:new->Servlet 程式

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-u03Bj2v3-1604418485634)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103195718573.png)]

  • 配置 Servlet 的資訊:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-JklfQxgF-1604418485635)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103195957707.png)]

自動在資料夾下生成HelloServlet3類與doPost()、doPost
    
public class HelloServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("helloservlet3的doPost方法");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("helloservlet3的doGET方法");
    }
}
自動在web.xml檔案下生成<servlet>標籤,
然後自己建立servlet-mapping指定url-pattern和url-pattern即可
    
<servlet>
    <servlet-name>HelloServlet3</servlet-name>
    <servlet-class>com.achang.servlet.HelloServlet3</servlet-class>
</servlet>
<servlet-mapping>
    <url-pattern>HelloServlet3</servlet-name>
    <url-pattern>/hello3</url-pattern>
</servlet-mapping>

.

i.Servlet類的繼承體系

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-SNPjF0cg-1604418485637)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103215106696.png)]

.

2. ServletConfig類

ServletConfig類從類名上來看,就知道是Servlet程式的配置資訊類

Servlet程式和ServletConfig物件都是由Tomcat伺服器負責建立,我們負責使用

Servlet程式預設是第一次訪問的時候建立,ServletConfig是每個Servlet程式建立時就建立一個對應的ServletConfIg物件

.

a.ServletConfig類的三大作用

  1. 可以獲取Servlet程式的別名servlet-name的值
  2. 獲取初始化引數init-param
  3. 獲取ServletConfig物件
  • web.xml 中的配置:
    <!-- servlet標籤給Tomcat伺服器配置Servlet程式 -->
    <servlet>
        <!-- servlet-name標籤 是給Servlet程式起一個別名 (一般是類名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-class標籤 是Servlet程式的全類名 -->
        <servlet-class>com.achang.servlet.HelloServlet</servlet-class>

        
        
        
        
        <!--init-param 是初始化引數-->
        <init-param>
            <!--引數名-->
            <param-name>username</param-name>
            <!--引數值-->
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <!--引數名-->
            <param-name>url</param-name>
            <!--引數值-->
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
        
        
        
        
        
        
    </servlet>
  • Servlet 中的程式碼:
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 init初始化方法");


//        1. 可以獲取Servlet程式的別名servlet-name的值
        System.out.println("HelloServlet程式的別名是: "+ servletConfig.getServletName());
//        2. 獲取初始化引數init-param
        System.out.println("初始化引數username的值是: "+servletConfig.getInitParameter("username"));
        System.out.println("初始化引數username的值是: "+servletConfig.getInitParameter("url"));
//        3. 獲取ServletContext物件
        System.out.println(servletConfig.getServletContext());

    }

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-6RyO7BH8-1604418485638)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103221838028.png)]

.

3. ServletContext類

a.什麼是ServletContext?

1.ServletContext是一個介面,它表示Servlet上下文物件

2.一個web工程,只有一個ServletContext物件例項

3.ServletContext物件是一個域物件。

4.ServletContext是在web工程部署啟動的時候建立。在web工程停止的時候銷燬。

  • 什麼是域物件?

域物件,是可以像Map一樣存取資料的物件。叫域物件

這裡的域指的是,存取資料的操作範圍,整個web工程。

			存資料					取資料				刪資料
Map			put()				  get()				remove()	
域物件		  setAttribute()		getAttribute()	  removeAttribute()

.

b.ServletContext類的四個作用

1.獲取web.xml中配置的上下文引數context-param

2.獲取當前的工程路徑, 格式:/工程路徑

3.獲取工程部署後在伺服器磁碟上的絕對路徑

4.像Map一樣存取資料

ContextServlet演示程式碼:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        1.獲取web.xml中配置的上下文引數context-param
        ServletContext servletContext = getServletConfig().getServletContext();
        String username = servletContext.getInitParameter("username");
        System.out.println("context-param引數username的值是: "+username);
        System.out.println("context-param引數password的值是: "+servletContext.getInitParameter("password"));
//        2.獲取當前的工程路徑, 格式:/工程路徑
        System.out.println("當前工程路徑: "+servletContext.getContextPath());
//        3.獲取工程部署後在伺服器磁碟上的絕對路徑
        /*
            / 斜杆被伺服器解析地址為:http://ip:port/工程名/     對映到IDEA程式碼的webapp目錄
         */
        System.out.println("工程部署的路徑是: "+servletContext.getRealPath("/"));
    }
web.xml 中的配置:

    <!--context-param是上下文引數(它屬於整個web工程)-->
    <context-param>
        <param-name>username</param-name>
        <param-value>context</param-value>
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>root</param-value>
    </context-param>
  • ServletContext 像 Map 一樣存取資料:
Context1Servlet程式碼:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //獲取ServletContext物件
    ServletContext context = getServletContext();
    System.out.println(context);//org.apache.catalina.core.ApplicationContextFacade@77aaf677
    System.out.println("儲存之前: context中獲取資料key1的value值是: "+context.getAttribute("key1"));//null

    context.setAttribute("key1","value1");

    System.out.println("Context1Servlet中獲取資料key1的value值是: "+context.getAttribute("key1"));//key1
}
Context2Servlet程式碼:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //獲取ServletContext物件
    ServletContext context = getServletContext();
    System.out.println(context);//org.apache.catalina.core.ApplicationContextFacade@11f32f19

    System.out.println("Context2Servlet中獲取資料key1的value值是: "+context.getAttribute("key1"));//key1
}

不管是Context1Servlet還是Context2Servlet的context地址值為: org.apache.catalina.core.ApplicationContextFacade@11f32f19

表示它是在web工程銷燬前都是一個物件,一個web工程就一個。

後續繼續學習更新!!!

相關文章