最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入了解tomcat中servlet的創(chuàng)建方式實現(xiàn)

 更新時間:2020年10月13日 09:07:09   作者:張敬軒小迷弟  
這篇文章主要介紹了深入了解tomcat中servlet的創(chuàng)建方式實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、 什么是servlet

1.1、用官方的話解釋:

Servlet是oracle公司提供的一門用于開發(fā)動態(tài)web資源的技術(shù),屬于javaEE體系中的一種核心規(guī)范。
通俗解釋一下:就是我們開發(fā)人員所編寫的一個類,必須直接或者間接實現(xiàn)這個javaEE的核心規(guī)范,也就是實現(xiàn)Servlet接口,因為這種類產(chǎn)生的對象可以被瀏覽器訪問到,因此稱之為Servlet,并且javaEE中規(guī)定了只有Servlet的實現(xiàn)類產(chǎn)生的對象才可以被瀏覽器訪問,就是Servlet.(也就是說這個類要直接或者間接實現(xiàn)了Servlet接口)

二、開始進(jìn)入servlet的創(chuàng)建

2.1、通過前面介紹,我們知道了一個什么樣的類創(chuàng)建的對象可以被瀏覽器訪問,首先我們直接上代碼:

package com.briup.web;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FirstWay implements Servlet {
	public FirstWay() {
		System.out.println("對象創(chuàng)建了");
	}
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("我是init:我被調(diào)用了");
	}
	@Override
	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("我是service,我被調(diào)用了");	
	}
	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("我是destory:我被調(diào)用了");
	}

}

那么,一個滿足servlet的類已經(jīng)創(chuàng)建好了,接下來拋出疑問

servet對象由誰創(chuàng)建?

里面實現(xiàn)的接口方法,哪些會調(diào)用,什么時候調(diào)用,調(diào)用幾次?
第一個疑問: 既然是servlet類,由我們開發(fā)人員自己手動創(chuàng)建對象,顯然是不合理,所以這個對象的創(chuàng)建,是交給tomcat創(chuàng)建的,我們開發(fā)人員只需要告訴 tomcat,讓他創(chuàng)建,讓他什么時候創(chuàng)建就行了;
如何告訴?

1、方法一:通過配置webxml的方式。(極其不推薦使用)

對于整個動態(tài)web項目而言,web.xml是最先加載的配置文件,所以在web.xml的方式配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
 <display-name>firstWay</display-name>
 <servlet>
 		<servlet-name>FirstWay</servlet-name>
 		<servlet-class>com.briup.web.FirstWay</servlet-class>
 		<!-- <load-on-startup>1</load-on-startup> -->
 </servlet>
 <servlet-mapping>
 	<servlet-name>FirstWay</servlet-name>
 	<url-pattern>/FirstWay</url-pattern>
 </servlet-mapping>
</web-app>

解釋:
1、servlet-name:見名知意:servlet的名字,注意要與下面你設(shè)置映射的名字對應(yīng)
2、serlvet-class:serlvet的全限定名
3、load-on-startup:是否在tomcat啟動的時候就創(chuàng)建servlet對象,傳入一個大于0的整數(shù)‘'(默認(rèn)是瀏覽器第一次請求的時候創(chuàng)建servlet對象
4、servlet-mapping:見名知意,設(shè)置瀏覽器的訪問映射
5、servlet-name:于上面的對應(yīng)
6、url-pattern:瀏覽器的訪問映射(假設(shè)默認(rèn)是本機(jī)的話,且tomcat的端口號為8080,那么瀏覽器訪問這個servlet的路徑為:localhost:8080/項目名/FirstWay
有了這些基礎(chǔ),讓我們訪問看看;

第一步:啟動tomcat

在這里插入圖片描述

tomcat正常啟動

第二步:通過瀏覽器訪問(我們這里手動訪問3次)

在這里插入圖片描述

瀏覽器訪問正常

第三步:觀察控制臺

在這里插入圖片描述 

通過運(yùn)行結(jié)果分析:

第一次啟動服務(wù)器,對象并沒有被創(chuàng)建

瀏覽器請求三遍,但是對象只創(chuàng)建一次,init()方法也只調(diào)用一次

每訪問一次,對象便會調(diào)用一次service()方法

其他方法沒被調(diào)用

解釋為嘛沒被調(diào)用:getServletConfig():得到ServletConfig對象
: getServletInfo():得到Servlet的信心,比如作者
:destroy():servlet銷毀的時候才會調(diào)用這個方法,(比如:tomcati正常關(guān)閉 這里我就不去測試,想測試的小伙伴,可以右鍵service,點擊stop)然后再觀察控制臺便可知了。

 2、方法二:注解的方式告訴tomcat(與前者相比,推薦使用)

@WebServlet(value ="映射路徑")
public Fristservlet implement Servelt {
}

通過這個注解也可以設(shè)置,是否在啟動服務(wù)器的時候就創(chuàng)建對象,這里就不演示了,
注意:(一旦使用了注解的方式告訴tomcat如果創(chuàng)建某個對象,就不能在web.xml里面再對這個servlet進(jìn)行訪問設(shè)置了

三、回歸主題,servlet的第二種創(chuàng)建方式

有了前面的解釋,直接上代碼然后再分析

package com.briup.web;

import java.io.IOException;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet(value = "/secondWay")
public class SecondWayCreate extends GenericServlet {

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("調(diào)用了service方法");
	}

}

1、比第一種方法簡潔,實現(xiàn)的是GenericServlet這個類

2、我們看一下GenericServlet源碼,然后進(jìn)行分析;

public abstract class GenericServlet implements Servlet, ServletConfig,

可知,這是個抽線類,是servlet接口的實現(xiàn)類,那么GenericServlet間接 實現(xiàn)了servlet接口,
與第一種方式相比:開發(fā)者不是必須將一些接口中不必要的方法實現(xiàn),可以具有選擇性,減少了代碼量。然而并沒有上面ruan用,就是裝b而已

三、重點第三種方式(與前兩者相比,我更推薦第三種方式)

直接上代碼

package com.briup.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(value = "/ThreeWayCreate")
public class ThreeWayCreate extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}
}

通過以上代碼,可能就有小伙伴要問了
不是說servlet要直接或者間接實現(xiàn)servlet接口嗎,不是說瀏覽器每請求一次就要調(diào)用一次service方法嗎?方法在哪呢?這不是與前面理論沖突了嗎?
我們繼續(xù)看源碼,源碼才是道理
我在下面值列舉源碼里面比較核心的部分,需要理解更加深入了解的小伙伴,直接去看源碼,tomcat是開源的

package com.briup.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(value = "/ThreeWayCreate")
public class ThreeWayCreate extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}
}

分析:

第一步分析

在這里插入圖片描述

可知這個抽象類繼承了GennericeServlet這個抽象類 也就是逐層往下推,實現(xiàn)了Servle接口,那么這個抽線類必然也繼承了serice方法。

第二步分析

在這里插入圖片描述

這個是繼承servlet接口的service方法,當(dāng)瀏覽器每請求一次時,都會調(diào)用這個方法,由圖可知,這個方法已經(jīng)被HttpServlet實現(xiàn)了,由實現(xiàn)類可以得出,請求對象req,和響應(yīng)對象res,被強(qiáng)轉(zhuǎn)成了HttpServletRequest,和HttpServletResponse(向下轉(zhuǎn)型),然后將強(qiáng)轉(zhuǎn)的對象,傳入HttpServlet重載的Service方法中,調(diào)用,第三步,分析重載后的Service(HttpRequest req,HttpRespone res);

第三步分析

protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

    String method = req.getMethod();

    if (method.equals(METHOD_GET)) {
      long lastModified = getLastModified(req);
      if (lastModified == -1) {
        // servlet doesn't support if-modified-since, no reason
        // to go through further expensive logic
        doGet(req, resp);
      } else {
        long ifModifiedSince;
        try {
          ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
        } catch (IllegalArgumentException iae) {
          // Invalid date header - proceed as if none was set
          ifModifiedSince = -1;
        }
        if (ifModifiedSince < (lastModified / 1000 * 1000)) {
          // If the servlet mod time is later, call doGet()
          // Round down to the nearest second for a proper compare
          // A ifModifiedSince of -1 will always be less
          maybeSetLastModified(resp, lastModified);
          doGet(req, resp);
        } else {
          resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
        }
      }

    } else if (method.equals(METHOD_HEAD)) {
      long lastModified = getLastModified(req);
      maybeSetLastModified(resp, lastModified);
      doHead(req, resp);

    } else if (method.equals(METHOD_POST)) {
      doPost(req, resp);

    } else if (method.equals(METHOD_PUT)) {
      doPut(req, resp);

    } else if (method.equals(METHOD_DELETE)) {
      doDelete(req, resp);

    } else if (method.equals(METHOD_OPTIONS)) {
      doOptions(req,resp);

    } else if (method.equals(METHOD_TRACE)) {
      doTrace(req,resp);

    } else {
      //
      // Note that this means NO servlet supports whatever
      // method was requested, anywhere on this server.
      //

      String errMsg = lStrings.getString("http.method_not_implemented");
      Object[] errArgs = new Object[1];
      errArgs[0] = method;
      errMsg = MessageFormat.format(errMsg, errArgs);

      resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    }
  }

通過傳過來的HttpRequest對象,判斷請求方式,通過請求方式,決定調(diào)用哪個方法(如果請求方式是post方式,那么就會調(diào)用doPost(HttpRequest req,HttpRestpone Res)方法

第四步分析
綜上分析,總結(jié):tomcat創(chuàng)建對象,當(dāng)瀏覽器請求的時候,調(diào)用Servlet的Service(ServeltRequest req,ServletRespone res )方法,然后這個方法再調(diào)用,HttpServlet里面重載的Servlet(HttpServletReqeust req ,HttpServletRespone res)方法,然后這個方法會通過請求方式是什么,選擇性的調(diào)用doPost(),還是doGet()方法(當(dāng)然還有很多其他的方式這里就不列舉了), 因此第三種方式,的本質(zhì)還是當(dāng)瀏覽器發(fā)起一次請求的時候調(diào)用了Servlet接口里面的Service(ServeltRequest req,ServletRespone res )方法,然后通過實現(xiàn)類的里面的邏輯,間接的調(diào)用了doPost()等方法。

優(yōu)點:

1、通過請求方式可以處理相應(yīng)的請求,使得邏輯更加清晰

2,減少代碼量,是程序更加簡潔

3,使得請求或者響應(yīng)的操作性更加豐富

4…

四、 總結(jié):

注意點:瀏覽器發(fā)起請求調(diào)用的一定是servlet種的service方法;

到此這篇關(guān)于深入了解tomcat中servlet的創(chuàng)建方式實現(xiàn)的文章就介紹到這了,更多相關(guān)tomcat servlet創(chuàng)建方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Eclipse創(chuàng)建tomcat實現(xiàn)過程原理詳解

    Eclipse創(chuàng)建tomcat實現(xiàn)過程原理詳解

    這篇文章主要介紹了Eclipse創(chuàng)建tomcat實現(xiàn)過程原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • Idea部署tomcat服務(wù)實現(xiàn)過程圖解

    Idea部署tomcat服務(wù)實現(xiàn)過程圖解

    這篇文章主要介紹了Idea部署tomcat服務(wù)實現(xiàn)過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 對一個tomcat實現(xiàn)多端口、多域名訪問的方法

    對一個tomcat實現(xiàn)多端口、多域名訪問的方法

    這篇文章主要是介紹如何在tomcat中進(jìn)行配置,使同一個應(yīng)用可以通過不同的端口號進(jìn)行訪問。大家可能都遇到過,在某些需要進(jìn)行安全控制的場景中會應(yīng)用到,例如:不同地址段只能通過某個端口訪問。下面通過這篇文章來詳細(xì)學(xué)習(xí)下吧,有需要的可以參考借鑒。
    2016-11-11
  • 教你在IDEA中使用Tomcat部署并啟動Web項目

    教你在IDEA中使用Tomcat部署并啟動Web項目

    這篇文章主要介紹了教你在IDEA中使用Tomcat部署并啟動Web項目,IDEA作為一款主流的開發(fā)工具其實已經(jīng)集成了Tomcat的部分功能,需要的朋友可以參考下
    2023-03-03
  • Tomcat 啟動閃退常見問題18種解決方法及示例

    Tomcat 啟動閃退常見問題18種解決方法及示例

    Tomcat啟動閃退可能由多種原因引起,包括配置錯誤、資源限制、兼容性問題等,本文主要介紹了Tomcat 啟動閃退常見問題18種解決方法及示例,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Unable?to?start?embedded?Tomcat?Nacos啟動報錯的解決方案

    Unable?to?start?embedded?Tomcat?Nacos啟動報錯的解決方案

    Windows?本地啟動?Nacos(2.2.0)?服務(wù),控制臺報錯?Unable?to?start?embedded?Tomcat,報錯信息:Unable?to?start?embedded?Tomcat,無法加載內(nèi)置的tomcat,本文介紹了Unable?to?start?embedded?Tomcat?Nacos啟動報錯解決方案,需要的朋友可以參考下
    2024-08-08
  • Tomcat部署war包并成功訪問網(wǎng)頁詳細(xì)圖文教程

    Tomcat部署war包并成功訪問網(wǎng)頁詳細(xì)圖文教程

    Tomcat是目前web開發(fā)中非常流行的Web服務(wù)器,這篇文章主要給大家介紹了關(guān)于Tomcat部署war包并成功訪問網(wǎng)頁的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 如何在IntelliJ IDEA 2018上配置Tomcat并運(yùn)行第一個JavaWeb項目

    如何在IntelliJ IDEA 2018上配置Tomcat并運(yùn)行第一個JavaWeb項目

    這篇文章主要介紹了在IntelliJ IDEA 2018上配置Tomcat并運(yùn)行第一個JavaWeb項目,需要的朋友可以參考下
    2020-09-09
  • 詳解Tomcat雙擊startup.bat閃退的解決方法

    詳解Tomcat雙擊startup.bat閃退的解決方法

    這篇文章主要介紹了詳解Tomcat雙擊startup.bat閃退的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • IDEA中Smart?Tomcat插件使用教程

    IDEA中Smart?Tomcat插件使用教程

    本文主要介紹了IDEA中Smart?Tomcat插件使用教程,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06

最新評論

沁源县| 田林县| 潼南县| 上思县| 客服| 沈丘县| 凤冈县| 琼海市| 彩票| 武强县| 扶沟县| 白玉县| 遵义县| 兖州市| 晋州市| 莫力| 舞钢市| 长泰县| 竹山县| 红河县| 南澳县| 滨州市| 手机| 奈曼旗| 容城县| 商南县| 太仆寺旗| 囊谦县| 彭阳县| 遵化市| 抚宁县| 婺源县| 蒲城县| 梅河口市| 白城市| 罗定市| 贵德县| 古蔺县| 寿阳县| 雷波县| 崇明县|