欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 深入了解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的創建方式實現的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产一区二区在线观看视频| 911亚洲精选| 一区二区不卡免费视频| 色欧美日韩亚洲| 久久久国产精品麻豆| 日韩精品乱码免费| 日本少妇一区二区三区| 波多野结衣家庭教师| 26uuu色噜噜精品一区| 亚洲国产欧美日韩另类综合 | 欧美吻胸吃奶大尺度电影 | 久久久久久亚洲中文字幕无码| 在线观看成人小视频| 欧美激情一区二区三区四区| 久久精品国产精品亚洲综合| 熟女人妻在线视频| 欧美卡1卡2卡| 亚洲自拍偷拍综合| 亚洲精品无码久久久久久久| 午夜写真片福利电影网| 国产精品久久久久久久久快鸭 | www.欧美com| 欧洲激情一区二区| 国产传媒视频在线| 欧美大片在线观看| 亚洲三级在线免费观看| a级高清视频欧美日韩| 国产老头老太做爰视频| 欧美国产综合一区二区| 国产毛片精品国产一区二区三区| 精品人妻无码一区| 精品盗摄一区二区三区| 久久电影网电视剧免费观看| 9.1在线观看免费| 91精品国产色综合久久| 天天综合天天做天天综合| 中文字幕在线播放视频| 日韩欧美一区在线观看| 蜜桃av一区二区在线观看| 亚洲天堂网一区二区| 日韩精品最新网址| 日韩黄色一级片| 少妇丰满尤物大尺度写真| 欧美偷拍一区二区| 亚洲国产一二三| 成人在线电影网站| 日韩欧美亚洲另类制服综合在线| 日韩电影在线一区| 亚洲成人黄色av| 精品国产伦一区二区三区观看方式 | 99热在这里有精品免费| 在线观看日韩av先锋影音电影院| 亚洲天堂av一区| 国产精品99精品无码视亚| 678五月天丁香亚洲综合网| 日韩精品1区2区3区| 少妇无套高潮一二三区| 国产精品你懂的在线欣赏| 不卡的电视剧免费网站有什么| 91福利在线播放| 午夜久久久久久久久久一区二区| 免费成人深夜夜行p站| 久久久久久久久一| 成人美女在线观看| 欧美三区在线视频| 免播放器亚洲一区| 日本一卡二卡在线播放| 亚洲欧洲日产国产综合网| 无码人妻一区二区三区在线视频| 69堂国产成人免费视频| 精品一区二区三区免费播放 | 精品91自产拍在线观看一区| 国产·精品毛片| 99精品国产一区二区三区不卡| 色94色欧美sute亚洲线路一久| 性做久久久久久久免费看| 老头老太做爰xxx视频| 亚洲欧美精品午睡沙发| 国精产品一区一区三区免费视频| 日韩亚洲欧美高清| 福利一区在线观看| 欧美日韩国产高清一区| 捆绑紧缚一区二区三区视频| 一本大道久久a久久综合| 日韩精品电影在线观看| 青花影视在线观看免费高清| 一区二区三区不卡视频| 人妻视频一区二区| 亚洲一区二区在线免费观看视频| 免费在线观看a视频| 一区二区视频免费在线观看| 精品国产av无码| 一区二区三区国产豹纹内裤在线| a毛片毛片av永久免费| 中文字幕永久在线不卡| 国产精品久久AV无码| 最新日韩在线视频| 37p粉嫩大胆色噜噜噜| 成人免费在线视频| www.黄色在线| 一区二区三区四区视频精品免费| japanese中文字幕| 亚洲永久免费视频| 国产精品免费在线视频| 日韩电影在线看| 欧美在线不卡一区| 国产成人午夜精品影院观看视频| 91精品在线免费| www.欧美精品一二区| 久久综合999| 中文字幕a在线观看| 亚洲视频精选在线| 黄色一级片一级片| 青青草97国产精品免费观看 | 亚洲欧美另类久久久精品| 色欲AV无码精品一区二区久久 | 成人免费毛片a| 日韩精品一区二区三区三区免费| 99re这里只有精品6| 国产欧美一区二区精品久导航 | 99久久久久久| 国产日韩av一区| mm131美女视频| ㊣最新国产の精品bt伙计久久| 国产成人综合在线| 91黄色在线观看| 国产老女人精品毛片久久| 精品剧情在线观看| 自拍偷拍中文字幕| 久久不见久久见中文字幕免费| 日韩三级.com| 一级黄色片大全| 九色|91porny| 久久久av毛片精品| 91麻豆精品久久毛片一级| 国产精品亚洲人在线观看| 国产午夜精品一区二区三区视频| 纪美影视在线观看电视版使用方法| 久久av老司机精品网站导航| 日韩欧美高清一区| 无码 人妻 在线 视频| 激情综合色播激情啊| 久久久精品欧美丰满| 小向美奈子av| av在线一区二区| 夜夜精品浪潮av一区二区三区| 欧美日韩精品电影| 一本色道综合久久欧美日韩精品 | 丰满人妻一区二区三区53视频| 一区二区三区不卡在线观看 | 亚洲天堂av网站| 日韩福利视频导航| 久久青草欧美一区二区三区| 国产日韩精品中文字无码| 成人国产亚洲欧美成人综合网| 久久久久久久久久久国产精品| 日本女优在线视频一区二区| 欧美大片顶级少妇| 91香蕉视频网| 99精品一区二区| 午夜视频一区在线观看| 欧美电影免费观看高清完整版 | 日韩电影在线免费看| 久久久天堂av| 一本色道久久综合亚洲精品按摩| 中文字幕亚洲日本| 蜜桃av一区二区三区| 国产欧美一区二区精品仙草咪| 色屁屁一区二区| 国产又黄又粗又猛又爽的视频| 精品一区二区三区香蕉蜜桃| 国产精品女同一区二区三区| 欧美日韩激情在线| 一级肉体全黄裸片| 91亚洲男人天堂| 日本美女一区二区| 中文字幕在线不卡一区| 在线91免费看| 国产精品久久国产精麻豆96堂| 中文字幕第一区二区| 色屁屁一区二区| 特大黑人巨人吊xxxx| 国产馆精品极品| 亚洲一区二区三区中文字幕在线| 日韩精品中文字幕一区 | 欧美激情一区三区| 欧美三级视频在线| 欧美亚洲色综久久精品国产| 日本r级电影在线观看| 精品一区二区三区在线视频| 亚洲欧美日韩一区| 2023国产精品自拍| 欧美主播一区二区三区美女| 亚洲综合网在线观看| 99这里只有精品| 久久精品国产网站| 一区二区三区欧美久久| 国产校园另类小说区| 欧美精品视频www在线观看 | www在线观看免费视频|