婷婷综合国产,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一区一区三区| 欧美日韩美少妇| 国产欧美精品日韩区二区麻豆天美| 国产日韩欧美不卡在线| 亚洲一区在线视频| 国产精品国产自产拍高清av | 不卡的av在线| 奇米色一区二区三区四区| 97久久超碰国产精品| 国产日韩欧美高清| 精品制服美女久久| 91精品国产一区二区三区香蕉| 国产精品天天看| 成人a区在线观看| 欧美国产成人精品| 国产福利一区二区三区视频在线 | 黄色资源网久久资源365| 欧美日本一道本| 五月婷婷激情综合网| 成人国产精品免费观看视频| 欧美韩日一区二区三区四区| 国产精品一区二区久久精品爱涩| 欧美成人video| 国产精品乡下勾搭老头1| 日韩欧美亚洲国产另类| 久久精品国产99久久6| 久久女同精品一区二区| 国产日韩亚洲欧美综合| 日韩精品久久久久久| 26uuu精品一区二区| av男人天堂一区| 日韩av一级片| 亚洲欧美综合在线精品| 欧美三级午夜理伦三级中视频| 亚洲一级二级在线| 中文字幕第一区二区| 欧美日韩精品欧美日韩精品一 | 亚洲天天做日日做天天谢日日欢| 欧美日韩一区在线观看| 老司机精品视频导航| 国产精品美女久久福利网站| 欧美一区二区三区视频在线| 91在线视频免费观看| 国产精品一区二区三区网站| 久久99精品国产麻豆婷婷洗澡| 国产精品乱码一区二三区小蝌蚪| 日韩免费在线观看| 欧美二区三区91| 91蜜桃免费观看视频| 国产精品综合在线视频| 一区二区三区日韩欧美| 日韩毛片视频在线看| 欧美韩日一区二区三区四区| 日本一区二区三区国色天香 | 欧美一激情一区二区三区| 欧洲在线/亚洲| 成人美女在线视频| 99综合影院在线| 日本黄色一区二区| 欧美日韩精品一区二区三区蜜桃| 色婷婷综合久色| 日本韩国精品在线| 欧美人伦禁忌dvd放荡欲情| 91丝袜国产在线播放| 色哟哟一区二区在线观看| 91精品91久久久中77777| 欧美少妇性性性| 91精品国产91久久久久久最新毛片 | 日韩一级片在线观看| 久久久久久久久岛国免费| 亚洲精品大片www| 日韩av网站在线观看| 奇米色一区二区| 国产精品一品视频| 91麻豆国产在线观看| 欧美一区二区国产| 国产午夜精品福利| 日韩高清在线观看| 99久久夜色精品国产网站| 精品久久人人做人人爰| 亚洲另类色综合网站| 国产毛片精品视频| 91精品国产一区二区三区蜜臀| 欧美国产亚洲另类动漫| 久久精品国产一区二区三| 欧美日韩一区二区欧美激情 | 久久久久久久久蜜桃| 亚洲成人动漫精品| 色综合久久88色综合天天免费| 久久综合av免费| 日韩成人精品视频| 欧美日韩一区二区电影| 亚洲一区二区三区小说| 一本一道综合狠狠老| 成人短视频下载| 国产精品久久久久四虎| www.综合网.com| 亚洲精品乱码久久久久久| 色综合激情久久| 亚洲黄色免费网站| 在线一区二区三区| 三级精品在线观看| 日韩视频一区二区三区在线播放| 国产精品麻豆一区二区| 91久久国产最好的精华液| 亚洲午夜激情网页| 91精品国产黑色紧身裤美女| 久久99精品国产.久久久久久| 久久只精品国产| 色天使色偷偷av一区二区| 亚洲国产视频网站| 欧美精品一区男女天堂| 91污片在线观看| 美女网站在线免费欧美精品| 国产精品夫妻自拍| 制服丝袜亚洲色图| 成人app软件下载大全免费| 午夜精品久久久久久久久| 精品88久久久久88久久久| 欧美性猛交xxxxxx富婆| 国产福利不卡视频| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美久久久影院| 久久精品国产**网站演员| 色一情一乱一乱一91av| 美女在线一区二区| 亚洲男女毛片无遮挡| 久久久久久久综合狠狠综合| 欧美老女人第四色| 一本大道久久a久久精品综合| 国产一本一道久久香蕉| 久久精品国产久精国产| 久久精品免费观看| 美女视频一区在线观看| 日本不卡123| 麻豆国产欧美日韩综合精品二区 | 亚洲国产精品久久不卡毛片| 国产欧美一区二区精品忘忧草 | 亚洲视频1区2区| 亚洲三级电影全部在线观看高清| 亚洲国产精品黑人久久久| 久久精品欧美一区二区三区不卡| 精品免费日韩av| 中文字幕精品—区二区四季| 日韩伦理免费电影| 亚洲国产aⅴ天堂久久| 同产精品九九九| 精品亚洲porn| 国产成人精品综合在线观看 | 日韩专区中文字幕一区二区| 三级影片在线观看欧美日韩一区二区 | 一区二区久久久久久| 免费观看在线综合色| 精品一区二区三区在线观看| 99视频一区二区三区| 欧美一区二区日韩一区二区| 国产精品美女久久久久久| 久久国产欧美日韩精品| 欧美最新大片在线看| 日韩午夜三级在线| 亚洲激情中文1区| 99久久精品久久久久久清纯| 欧美一区二区三区在线观看| 制服丝袜av成人在线看| 综合欧美亚洲日本| 99国产精品99久久久久久| 精品国产乱码久久久久久浪潮| 亚洲一区二区三区在线| 亚洲国产日产av| 91成人在线观看喷潮| 一个色综合av| 在线观看不卡一区| 一区二区三区免费网站| 色婷婷av一区二区三区之一色屋| 国产精品久久久久久久裸模| 激情文学综合插| 欧美成人精品1314www| 日本欧洲一区二区| 9191精品国产综合久久久久久| 日韩av在线播放中文字幕| 欧美日韩国产美| 亚洲精品亚洲人成人网| 91亚洲精品乱码久久久久久蜜桃| 欧美α欧美αv大片| 偷拍一区二区三区四区| 欧美v国产在线一区二区三区| 亚洲精品成a人| 欧美精品一区二区三区久久久| 奇米777欧美一区二区| 一本色道亚洲精品aⅴ| 中文无字幕一区二区三区| 色婷婷综合久久久| 国产精品色一区二区三区| 国产成a人亚洲精| 亚洲成人av中文| 精品视频123区在线观看| 午夜精品一区二区三区免费视频 | 免费人成黄页网站在线一区二区|