婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 深入了解tomcat中servlet的創建方式實現

深入了解tomcat中servlet的創建方式實現

熱門標簽:江蘇自動外呼系統一般多少錢 比較穩定的外呼系統 400 電話 申請費用 ai電話機器人營銷 長沙回撥外呼系統 云南云電銷機器人招商 鸚鵡螺號航海地圖標注時間 山東電信外呼系統靠譜嗎 信貸電銷機器人系統

一、 什么是servlet

1.1、用官方的話解釋:

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

二、開始進入servlet的創建

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

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("對象創建了");
	}
	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("我是init:我被調用了");
	}
	@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,我被調用了");	
	}
	@Override
	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("我是destory:我被調用了");
	}

}

那么,一個滿足servlet的類已經創建好了,接下來拋出疑問

servet對象由誰創建?

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

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

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

第一步:啟動tomcat


tomcat正常啟動

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


瀏覽器訪問正常

第三步:觀察控制臺

 

通過運行結果分析:

第一次啟動服務器,對象并沒有被創建

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

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

其他方法沒被調用

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

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

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

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

三、回歸主題,servlet的第二種創建方式

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

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("調用了service方法");
	}

}

1、比第一種方法簡潔,實現的是GenericServlet這個類

2、我們看一下GenericServlet源碼,然后進行分析;

public abstract class GenericServlet implements Servlet, ServletConfig,

可知,這是個抽線類,是servlet接口的實現類,那么GenericServlet間接 實現了servlet接口,
與第一種方式相比:開發者不是必須將一些接口中不必要的方法實現,可以具有選擇性,減少了代碼量。然而并沒有上面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要直接或者間接實現servlet接口嗎,不是說瀏覽器每請求一次就要調用一次service方法嗎?方法在哪呢?這不是與前面理論沖突了嗎?
我們繼續看源碼,源碼才是道理
我在下面值列舉源碼里面比較核心的部分,需要理解更加深入了解的小伙伴,直接去看源碼,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這個抽象類 也就是逐層往下推,實現了Servle接口,那么這個抽線類必然也繼承了serice方法。

第二步分析


這個是繼承servlet接口的service方法,當瀏覽器每請求一次時,都會調用這個方法,由圖可知,這個方法已經被HttpServlet實現了,由實現類可以得出,請求對象req,和響應對象res,被強轉成了HttpServletRequest,和HttpServletResponse(向下轉型),然后將強轉的對象,傳入HttpServlet重載的Service方法中,調用,第三步,分析重載后的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對象,判斷請求方式,通過請求方式,決定調用哪個方法(如果請求方式是post方式,那么就會調用doPost(HttpRequest req,HttpRestpone Res)方法

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

優點:

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

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

3,使得請求或者響應的操作性更加豐富

4…

四、 總結:

注意點:瀏覽器發起請求調用的一定是servlet種的service方法;

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

標簽:澳門 運城 亳州 拉薩 烏海 嘉興 衡陽 齊齊哈爾

巨人網絡通訊聲明:本文標題《深入了解tomcat中servlet的創建方式實現》,本文關鍵詞  深入,了解,tomcat,中,servlet,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《深入了解tomcat中servlet的創建方式實現》相關的同類信息!
  • 本頁收集關于深入了解tomcat中servlet的創建方式實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91丨porny丨蝌蚪视频| 国产福利一区二区三区视频在线| 日本二三区不卡| 奇米影视7777精品一区二区| ...中文天堂在线一区| 精品动漫一区二区三区在线观看| 欧美日韩电影一区| 一本久道中文字幕精品亚洲嫩| 国产激情精品久久久第一区二区| 日本三级韩国三级欧美三级| 亚洲欧美日韩在线不卡| 国产午夜亚洲精品不卡| 久久综合久久综合久久综合| 日韩视频一区二区| 欧美一级片在线看| 欧美精品在欧美一区二区少妇| 91极品美女在线| 日本电影亚洲天堂一区| 欧美在线小视频| 欧美日韩中文国产| 欧美喷潮久久久xxxxx| 欧美麻豆精品久久久久久| 欧美日韩性生活| 91精品国产欧美一区二区18| 欧美一区二区三区性视频| 99视频精品免费视频| 97se亚洲国产综合自在线观| 9l国产精品久久久久麻豆| 成人激情免费视频| 色综合欧美在线| 9191国产精品| 久久网这里都是精品| 国产午夜久久久久| 亚洲欧洲美洲综合色网| 亚洲高清免费视频| 免费观看日韩av| 国产成人综合自拍| 成人av免费在线| 欧美影视一区在线| 欧美精品电影在线播放| 日韩亚洲欧美在线| 亚洲国产精品传媒在线观看| 亚洲免费在线视频一区 二区| 国产精品一区二区久久不卡| 国产精品一区二区在线观看不卡| 91免费版在线| 日韩一区二区影院| 国产精品久久久久aaaa樱花| 亚洲妇女屁股眼交7| 久久精品99国产精品| av中文一区二区三区| 91精品国产高清一区二区三区| 2023国产精华国产精品| 中文字幕乱码一区二区免费| 偷窥少妇高潮呻吟av久久免费| 国产又粗又猛又爽又黄91精品| 97se亚洲国产综合自在线不卡| av不卡免费电影| 日韩欧美视频在线| 亚洲丝袜另类动漫二区| 蓝色福利精品导航| 欧美中文字幕一区二区三区亚洲| 精品久久久影院| 亚洲一区二区三区三| 高清不卡在线观看av| 欧美男女性生活在线直播观看| 国产精品私人影院| 国产在线精品一区二区| 欧美三级一区二区| 亚洲精品欧美激情| 国产a精品视频| 欧美大胆一级视频| 午夜亚洲国产au精品一区二区| 国产a久久麻豆| 日韩欧美国产麻豆| 一区二区三区四区在线播放| 开心九九激情九九欧美日韩精美视频电影 | 成人免费视频一区| 9191国产精品| 一区二区三区四区不卡在线 | 亚洲成人先锋电影| 93久久精品日日躁夜夜躁欧美| 欧美mv和日韩mv国产网站| 亚洲第一精品在线| 日韩理论电影院| 成人性色生活片| 国产午夜亚洲精品羞羞网站| 蜜臀精品久久久久久蜜臀| 欧美视频在线一区二区三区| √…a在线天堂一区| 成人精品免费网站| 国产校园另类小说区| 久久精品久久99精品久久| 777久久久精品| 丰满亚洲少妇av| 久久综合九色综合欧美亚洲| 另类专区欧美蜜桃臀第一页| 91精品综合久久久久久| 亚洲国产美国国产综合一区二区| 91在线观看成人| 国产精品人人做人人爽人人添| 国产成人啪免费观看软件| 国产欧美一区二区精品秋霞影院| 狠狠狠色丁香婷婷综合激情| 日韩欧美另类在线| 国产毛片一区二区| 日本一区二区三区在线不卡| 国产成a人亚洲精品| 日本一区二区不卡视频| 91在线播放网址| 五月婷婷综合在线| 日韩欧美国产高清| 国产成人精品免费看| 亚洲欧美在线视频观看| 色哟哟国产精品免费观看| 亚洲曰韩产成在线| 欧美一区二区福利在线| 国产精品一区二区在线观看网站 | 国产99精品视频| 中文字幕亚洲一区二区va在线| 99久久er热在这里只有精品15| 亚洲精品午夜久久久| 6080日韩午夜伦伦午夜伦| 蜜臀av性久久久久蜜臀aⅴ流畅 | 欧美在线一区二区| 免费精品视频在线| 色婷婷狠狠综合| 日韩—二三区免费观看av| 国产亚洲欧美日韩日本| 91香蕉视频污在线| 免费在线看一区| 最新热久久免费视频| 日韩一区二区三区电影| 成人深夜视频在线观看| 亚洲成人午夜影院| 久久久久久久久久久久久夜| 色综合一区二区| 日本sm残虐另类| 久久久久久久综合| 在线一区二区三区四区五区 | 日韩久久久久久| 成人精品一区二区三区中文字幕 | 精品国产亚洲一区二区三区在线观看| 99在线精品观看| 精品亚洲国内自在自线福利| 亚洲精品写真福利| 久久久九九九九| 欧美日本在线播放| 成人免费视频视频| 另类成人小视频在线| 亚洲制服丝袜在线| 国产精品毛片大码女人| 日韩午夜精品电影| 欧美在线观看你懂的| 91在线码无精品| 国产成人aaa| 国产一区二区三区四区五区美女 | 国产成人综合在线| 视频在线在亚洲| 亚洲色大成网站www久久九九| 91麻豆精品国产综合久久久久久| 99国产精品国产精品久久| 久久成人久久爱| 爽爽淫人综合网网站| 精品理论电影在线观看| 欧美一级日韩一级| 欧美精品123区| 日本高清成人免费播放| 粉嫩13p一区二区三区| 国产一区二区福利视频| 激情偷乱视频一区二区三区| 石原莉奈在线亚洲二区| 亚洲国产一区二区三区 | 蜜臀av性久久久久av蜜臀妖精| 尤物视频一区二区| 1024成人网| 亚洲精品第一国产综合野| 欧美国产97人人爽人人喊| 日韩欧美国产一二三区| 日韩一区二区三区四区| 日韩小视频在线观看专区| 日韩欧美国产午夜精品| 日韩天堂在线观看| 欧美岛国在线观看| 久久久亚洲精品石原莉奈| 久久精品一区四区| 中文字幕精品一区二区三区精品| 国产色综合一区| 国产精品你懂的| 亚洲私人影院在线观看| 亚洲欧美电影院| 亚洲国产婷婷综合在线精品| 五月婷婷综合网| 韩国av一区二区三区在线观看| 韩国午夜理伦三级不卡影院| 国产精品一区二区在线播放| 懂色av中文一区二区三区| 成人av网址在线| www.一区二区| 91成人网在线|