国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務(wù)器之家 - 編程語言 - JAVA教程 - javaweb Servlet開發(fā)總結(jié)(一)

javaweb Servlet開發(fā)總結(jié)(一)

2020-04-25 15:31孤傲蒼狼 JAVA教程

Servlet是sun公司提供的一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù)。這篇文章主要介紹了javaweb Servlet開發(fā)的第一篇,感興趣的小伙伴們可以參考一下

一、Servlet簡(jiǎn)介

  Servlet是sun公司提供的一門用于開發(fā)動(dòng)態(tài)web資源的技術(shù)。
  Sun公司在其API中提供了一個(gè)servlet接口,用戶若想用發(fā)一個(gè)動(dòng)態(tài)web資源(即開發(fā)一個(gè)Java程序向?yàn)g覽器輸出數(shù)據(jù)),需要完成以下2個(gè)步驟:
  1、編寫一個(gè)Java類,實(shí)現(xiàn)servlet接口。
  2、把開發(fā)好的Java類部署到web服務(wù)器中。
  按照一種約定俗成的稱呼習(xí)慣,通常我們也把實(shí)現(xiàn)了servlet接口的java程序,稱之為Servlet

二、Servlet的運(yùn)行過程

Servlet程序是由WEB服務(wù)器調(diào)用,web服務(wù)器收到客戶端的Servlet訪問請(qǐng)求后:
  ①Web服務(wù)器首先檢查是否已經(jīng)裝載并創(chuàng)建了該Servlet的實(shí)例對(duì)象。如果是,則直接執(zhí)行第④步,否則,執(zhí)行第②步。
  ②裝載并創(chuàng)建該Servlet的一個(gè)實(shí)例對(duì)象。
  ③調(diào)用Servlet實(shí)例對(duì)象的init()方法。
  ④創(chuàng)建一個(gè)用于封裝HTTP請(qǐng)求消息的HttpServletRequest對(duì)象和一個(gè)代表HTTP響應(yīng)消息的HttpServletResponse對(duì)象,然后調(diào)用Servlet的service()方法并將請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)傳遞進(jìn)去。
  ⑤WEB應(yīng)用程序被停止或重新啟動(dòng)之前,Servlet引擎將卸載Servlet,并在卸載之前調(diào)用Servlet的destroy()方法。

javaweb Servlet開發(fā)總結(jié)(一)

javaweb Servlet開發(fā)總結(jié)(一)

javaweb Servlet開發(fā)總結(jié)(一)

三、Servlet調(diào)用圖

javaweb Servlet開發(fā)總結(jié)(一)

四、在Eclipse中開發(fā)Servlet

  在eclipse中新建一個(gè)web project工程,eclipse會(huì)自動(dòng)創(chuàng)建下圖所示目錄結(jié)構(gòu):

javaweb Servlet開發(fā)總結(jié)(一)

4.1、Servlet接口實(shí)現(xiàn)類

  Servlet接口SUN公司定義了兩個(gè)默認(rèn)實(shí)現(xiàn)類,分別為:GenericServlet、HttpServlet。

  HttpServlet指能夠處理HTTP請(qǐng)求的servlet,它在原有Servlet接口上添加了一些與HTTP協(xié)議處理方法,它比Servlet接口的功能更為強(qiáng)大。因此開發(fā)人員在編寫Servlet時(shí),通常應(yīng)繼承這個(gè)類,而避免直接去實(shí)現(xiàn)Servlet接口。
  HttpServlet在實(shí)現(xiàn)Servlet接口時(shí),覆寫了service方法,該方法體內(nèi)的代碼會(huì)自動(dòng)判斷用戶的請(qǐng)求方式,如為GET請(qǐng)求,則調(diào)用HttpServlet的doGet方法,如為Post請(qǐng)求,則調(diào)用doPost方法。因此,開發(fā)人員在編寫Servlet時(shí),通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。

4.2、通過Eclipse創(chuàng)建和編寫Servlet

  選中g(shù)acl.servlet.study包,右鍵→New→Servlet,如下圖所示:

javaweb Servlet開發(fā)總結(jié)(一)

javaweb Servlet開發(fā)總結(jié)(一)

javaweb Servlet開發(fā)總結(jié)(一)

這樣,我們就通過Eclipse幫我們創(chuàng)建好一個(gè)名字為ServletDemo1的Servlet,創(chuàng)建好的ServletDemo01里面會(huì)有如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package gacl.servlet.study;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletDemo1 extends HttpServlet {
 
  /**
   * The doGet method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to get.
   *
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
 
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    out.println(" <BODY>");
    out.print("  This is ");
    out.print(this.getClass());
    out.println(", using the GET method");
    out.println(" </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
  }
 
  /**
   * The doPost method of the servlet. <br>
   *
   * This method is called when a form has its tag value method equals to post.
   *
   * @param request the request send by the client to the server
   * @param response the response send by the server to the client
   * @throws ServletException if an error occurred
   * @throws IOException if an error occurred
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
 
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
    out.println("<HTML>");
    out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
    out.println(" <BODY>");
    out.print("  This is ");
    out.print(this.getClass());
    out.println(", using the POST method");
    out.println(" </BODY>");
    out.println("</HTML>");
    out.flush();
    out.close();
  }
 
}

  這些代碼都是Eclipse自動(dòng)生成的,而web.xml文件中也多了<servlet></servlet>和<servlet-mapping></servlet-mapping>兩對(duì)標(biāo)簽,這兩對(duì)標(biāo)簽是配置ServletDemo1的,如下圖所示:

javaweb Servlet開發(fā)總結(jié)(一)

然后我們就可以通過瀏覽器訪問ServletDemo1這個(gè)Servlet,如下圖所示:

javaweb Servlet開發(fā)總結(jié)(一)

五、Servlet開發(fā)注意細(xì)節(jié)

5.1、Servlet訪問URL映射配置

  由于客戶端是通過URL地址訪問web服務(wù)器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個(gè)URL地址上,這個(gè)工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
  <servlet>元素用于注冊(cè)Servlet,它包含有兩個(gè)主要的子元素:<servlet-name>和<servlet-class>,分別用于設(shè)置Servlet的注冊(cè)名稱和Servlet的完整類名。
一個(gè)<servlet-mapping>元素用于映射一個(gè)已注冊(cè)的Servlet的一個(gè)對(duì)外訪問路徑,它包含有兩個(gè)子元素:<servlet-name>和<url-pattern>,分別用于指定Servlet的注冊(cè)名稱和Servlet的對(duì)外訪問路徑。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<servlet>
  <servlet-name>ServletDemo1</servlet-name>
  <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
  <url-pattern>/servlet/ServletDemo1</url-pattern>
 </servlet-mapping>
  同一個(gè)Servlet可以被映射到多個(gè)URL上,即多個(gè)<servlet-mapping>元素的<servlet-name>子元素的設(shè)置值可以是同一個(gè)Servlet的注冊(cè)名。 例如:
<servlet>
  <servlet-name>ServletDemo1</servlet-name>
  <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
  <url-pattern>/servlet/ServletDemo1</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
  <url-pattern>/1.htm</url-pattern>
 </servlet-mapping>
  <servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
  <url-pattern>/2.jsp</url-pattern>
 </servlet-mapping>
  <servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
  <url-pattern>/3.php</url-pattern>
 </servlet-mapping>
  <servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
  <url-pattern>/4.ASPX</url-pattern>
 </servlet-mapping>

  通過上面的配置,當(dāng)我們想訪問名稱是ServletDemo1的Servlet,可以使用如下的幾個(gè)地址去訪問:

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/servlet/ServletDemo1

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/1.htm

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/2.jsp

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/3.php

  http://localhost:8080/JavaWeb_Servlet_Study_20140531/4.ASPX

  ServletDemo1被映射到了多個(gè)URL上。

5.2、Servlet訪問URL使用*通配符映射  

在Servlet映射到的URL中也可以使用*通配符,但是只能有兩種固定的格式:一種格式是"*.擴(kuò)展名",另一種格式是以正斜杠(/)開頭并以"/*"結(jié)尾。例如:

javaweb Servlet開發(fā)總結(jié)(一)

?
1
2
3
4
5
6
7
8
<servlet>
  <servlet-name>ServletDemo1</servlet-name>
  <servlet-class>gacl.servlet.study.ServletDemo1</servlet-class>
 </servlet>
 
  <servlet-mapping>
  <servlet-name>ServletDemo1</servlet-name>
  <url-pattern>/*</url-pattern>

  *可以匹配任意的字符,所以此時(shí)可以用任意的URL去訪問ServletDemo1這個(gè)Servlet,如下圖所示:

javaweb Servlet開發(fā)總結(jié)(一)

對(duì)于如下的一些映射關(guān)系:
  Servlet1 映射到 /abc/*
  Servlet2 映射到 /*
  Servlet3 映射到 /abc
  Servlet4 映射到 *.do
問題:
  當(dāng)請(qǐng)求URL為“/abc/a.html”,“/abc/*”和“/*”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet1。
  當(dāng)請(qǐng)求URL為“/abc”時(shí),“/abc/*”和“/abc”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet3。
  當(dāng)請(qǐng)求URL為“/abc/a.do”時(shí),“/abc/*”和“*.do”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet1。
  當(dāng)請(qǐng)求URL為“/a.do”時(shí),“/*”和“*.do”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet2。
  當(dāng)請(qǐng)求URL為“/xxx/yyy/a.do”時(shí),“/*”和“*.do”都匹配,哪個(gè)servlet響應(yīng)
      Servlet引擎將調(diào)用Servlet2。
  匹配的原則就是"誰長(zhǎng)得更像就找誰"

5.3、Servlet與普通Java類的區(qū)別  

  Servlet是一個(gè)供其他Java程序(Servlet引擎)調(diào)用的Java類,它不能獨(dú)立運(yùn)行,它的運(yùn)行完全由Servlet引擎來控制和調(diào)度。
  針對(duì)客戶端的多次Servlet請(qǐng)求,通常情況下,服務(wù)器只會(huì)創(chuàng)建一個(gè)Servlet實(shí)例對(duì)象,也就是說Servlet實(shí)例對(duì)象一旦創(chuàng)建,它就會(huì)駐留在內(nèi)存中,為后續(xù)的其它請(qǐng)求服務(wù),直至web容器退出,servlet實(shí)例對(duì)象才會(huì)銷毀。
  在Servlet的整個(gè)生命周期內(nèi),Servlet的init方法只被調(diào)用一次。而對(duì)一個(gè)Servlet的每次訪問請(qǐng)求都導(dǎo)致Servlet引擎調(diào)用一次servlet的service方法。對(duì)于每次訪問請(qǐng)求,Servlet引擎都會(huì)創(chuàng)建一個(gè)新的HttpServletRequest請(qǐng)求對(duì)象和一個(gè)新的HttpServletResponse響應(yīng)對(duì)象,然后將這兩個(gè)對(duì)象作為參數(shù)傳遞給它調(diào)用的Servlet的service()方法,service方法再根據(jù)請(qǐng)求方式分別調(diào)用doXXX方法。

  如果在<servlet>元素中配置了一個(gè)<load-on-startup>元素,那么WEB應(yīng)用程序在啟動(dòng)時(shí),就會(huì)裝載并創(chuàng)建Servlet的實(shí)例對(duì)象、以及調(diào)用Servlet實(shí)例對(duì)象的init()方法。
    舉例:

?
1
2
3
4
5
6
7
<servlet>
    <servlet-name>invoker</servlet-name>
    <servlet-class>
      org.apache.catalina.servlets.InvokerServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  用途:為web應(yīng)用寫一個(gè)InitServlet,這個(gè)servlet配置為啟動(dòng)時(shí)裝載,為整個(gè)web應(yīng)用創(chuàng)建必要的數(shù)據(jù)庫(kù)表和數(shù)據(jù)。

5.4、缺省Servlet

  如果某個(gè)Servlet的映射路徑僅僅為一個(gè)正斜杠(/),那么這個(gè)Servlet就成為當(dāng)前Web應(yīng)用程序的缺省Servlet。
  凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請(qǐng)求都將交給缺省Servlet處理,也就是說,缺省Servlet用于處理所有其他Servlet都不處理的訪問請(qǐng)求。 例如:

?
1
2
3
4
5
6
7
8
9
10
11
<servlet>
  <servlet-name>ServletDemo2</servlet-name>
  <servlet-class>gacl.servlet.study.ServletDemo2</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <!-- 將ServletDemo2配置成缺省Servlet -->
 <servlet-mapping>
  <servlet-name>ServletDemo2</servlet-name>
  <url-pattern>/</url-pattern>
 </servlet-mapping>

  當(dāng)訪問不存在的Servlet時(shí),就使用配置的默認(rèn)Servlet進(jìn)行處理,如下圖所示:

javaweb Servlet開發(fā)總結(jié)(一)

  在<tomcat的安裝目錄>\conf\web.xml文件中,注冊(cè)了一個(gè)名稱為org.apache.catalina.servlets.DefaultServlet的Servlet,并將這個(gè)Servlet設(shè)置為了缺省Servlet。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>listings</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
 
 <!-- The mapping for the default servlet -->
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  當(dāng)訪問Tomcat服務(wù)器中的某個(gè)靜態(tài)HTML文件和圖片時(shí),實(shí)際上是在訪問這個(gè)缺省Servlet。

5.5、Servlet的線程安全問題

  當(dāng)多個(gè)客戶端并發(fā)訪問同一個(gè)Servlet時(shí),web服務(wù)器會(huì)為每一個(gè)客戶端的訪問請(qǐng)求創(chuàng)建一個(gè)線程,并在這個(gè)線程上調(diào)用Servlet的service方法,因此service方法內(nèi)如果訪問了同一個(gè)資源的話,就有可能引發(fā)線程安全問題。例如下面的代碼:

不存在線程安全問題的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package gacl.servlet.study;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletDemo3 extends HttpServlet {
 
  
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    
    /**
     * 當(dāng)多線程并發(fā)訪問這個(gè)方法里面的代碼時(shí),會(huì)存在線程安全問題嗎
     * i變量被多個(gè)線程并發(fā)訪問,但是沒有線程安全問題,因?yàn)閕是doGet方法里面的局部變量,
     * 當(dāng)有多個(gè)線程并發(fā)訪問doGet方法時(shí),每一個(gè)線程里面都有自己的i變量,
     * 各個(gè)線程操作的都是自己的i變量,所以不存在線程安全問題
     * 多線程并發(fā)訪問某一個(gè)方法的時(shí)候,如果在方法內(nèi)部定義了一些資源(變量,集合等)
     * 那么每一個(gè)線程都有這些東西,所以就不存在線程安全問題了
     */
    int i=1;
    i++;
    response.getWriter().write(i);
  }
 
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
 
}

存在線程安全問題的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package gacl.servlet.study;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletDemo3 extends HttpServlet {
 
  int i=1;
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    
    i++;
    try {
      Thread.sleep(1000*4);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    response.getWriter().write(i+"");
  }
 
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
 
}

  把i定義成全局變量,當(dāng)多個(gè)線程并發(fā)訪問變量i時(shí),就會(huì)存在線程安全問題了,如下圖所示:同時(shí)開啟兩個(gè)瀏覽器模擬并發(fā)訪問同一個(gè)Servlet,本來正常來說,第一個(gè)瀏覽器應(yīng)該看到2,而第二個(gè)瀏覽器應(yīng)該看到3的,結(jié)果兩個(gè)瀏覽器都看到了3,這就不正常。

javaweb Servlet開發(fā)總結(jié)(一)

  線程安全問題只存在多個(gè)線程并發(fā)操作同一個(gè)資源的情況下,所以在編寫Servlet的時(shí)候,如果并發(fā)訪問某一個(gè)資源(變量,集合等),就會(huì)存在線程安全問題,那么該如何解決這個(gè)問題呢?

先看看下面的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package gacl.servlet.study;
 
import java.io.IOException;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
public class ServletDemo3 extends HttpServlet {
 
  int i=1;
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    /**
     * 加了synchronized后,并發(fā)訪問i時(shí)就不存在線程安全問題了,
     * 為什么加了synchronized后就沒有線程安全問題了呢?
     * 假如現(xiàn)在有一個(gè)線程訪問Servlet對(duì)象,那么它就先拿到了Servlet對(duì)象的那把鎖
     * 等到它執(zhí)行完之后才會(huì)把鎖還給Servlet對(duì)象,由于是它先拿到了Servlet對(duì)象的那把鎖,
     * 所以當(dāng)有別的線程來訪問這個(gè)Servlet對(duì)象時(shí),由于鎖已經(jīng)被之前的線程拿走了,后面的線程只能排隊(duì)等候了
     *
     */
    synchronized (this) {//在java中,每一個(gè)對(duì)象都有一把鎖,這里的this指的就是Servlet對(duì)象
      i++;
      try {
        Thread.sleep(1000*4);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      response.getWriter().write(i+"");
    }
    
  }
 
  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
 
}

  現(xiàn)在這種做法是給Servlet對(duì)象加了一把鎖,保證任何時(shí)候都只有一個(gè)線程在訪問該Servlet對(duì)象里面的資源,這樣就不存在線程安全問題了,如下圖所示:

javaweb Servlet開發(fā)總結(jié)(一)

  這種做法雖然解決了線程安全問題,但是編寫Servlet卻萬萬不能用這種方式處理線程安全問題,假如有9999個(gè)人同時(shí)訪問這個(gè)Servlet,那么這9999個(gè)人必須按先后順序排隊(duì)輪流訪問。

  針對(duì)Servlet的線程安全問題,Sun公司是提供有解決方案的:讓Servlet去實(shí)現(xiàn)一個(gè)SingleThreadModel接口,如果某個(gè)Servlet實(shí)現(xiàn)了SingleThreadModel接口,那么Servlet引擎將以單線程模式來調(diào)用其service方法。
  查看Sevlet的API可以看到,SingleThreadModel接口中沒有定義任何方法和常量,在Java中,把沒有定義任何方法和常量的接口稱之為標(biāo)記接口,經(jīng)常看到的一個(gè)最典型的標(biāo)記接口就是"Serializable",這個(gè)接口也是沒有定義任何方法和常量的,標(biāo)記接口在Java中有什么用呢?主要作用就是給某個(gè)對(duì)象打上一個(gè)標(biāo)志,告訴JVM,這個(gè)對(duì)象可以做什么,比如實(shí)現(xiàn)了"Serializable"接口的類的對(duì)象就可以被序列化,還有一個(gè)"Cloneable"接口,這個(gè)也是一個(gè)標(biāo)記接口,在默認(rèn)情況下,Java中的對(duì)象是不允許被克隆的,就像現(xiàn)實(shí)生活中的人一樣,不允許克隆,但是只要實(shí)現(xiàn)了"Cloneable"接口,那么對(duì)象就可以被克隆了。

  讓Servlet實(shí)現(xiàn)了SingleThreadModel接口,只要在Servlet類的定義中增加實(shí)現(xiàn)SingleThreadModel接口的聲明即可。 
  對(duì)于實(shí)現(xiàn)了SingleThreadModel接口的Servlet,Servlet引擎仍然支持對(duì)該Servlet的多線程并發(fā)訪問,其采用的方式是產(chǎn)生多個(gè)Servlet實(shí)例對(duì)象,并發(fā)的每個(gè)線程分別調(diào)用一個(gè)獨(dú)立的Servlet實(shí)例對(duì)象。
  實(shí)現(xiàn)SingleThreadModel接口并不能真正解決Servlet的線程安全問題,因?yàn)镾ervlet引擎會(huì)創(chuàng)建多個(gè)Servlet實(shí)例對(duì)象,而真正意義上解決多線程安全問題是指一個(gè)Servlet實(shí)例對(duì)象被多個(gè)線程同時(shí)調(diào)用的問題。事實(shí)上,在Servlet API 2.4中,已經(jīng)將SingleThreadModel標(biāo)記為Deprecated(過時(shí)的)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。

延伸 · 閱讀

精彩推薦
  • JAVA教程詳解Mybatis動(dòng)態(tài)sql

    詳解Mybatis動(dòng)態(tài)sql

    MyBatis的動(dòng)態(tài)SQL是基于OGNL表達(dá)式的,它可以幫助我們方便的在SQL語句中實(shí)現(xiàn)某些邏輯。本文給大家介紹Mybatis動(dòng)態(tài)sql小結(jié),感興趣的朋友參考下 ...

    xiaoerduo123x3732020-04-18
  • JAVA教程Scala 操作Redis使用連接池工具類RedisUtil

    Scala 操作Redis使用連接池工具類RedisUtil

    這篇文章主要介紹了Scala 操作Redis使用連接池工具類RedisUtil,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的...

    Gavin-Feng7332019-06-29
  • JAVA教程Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法

    Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法

    這篇文章主要介紹了Java 其中翻轉(zhuǎn)字符串的實(shí)現(xiàn)方法,需要的朋友可以參考下 ...

    java技術(shù)網(wǎng)1732019-11-10
  • JAVA教程JAVA流控及超流控后的延遲處理實(shí)例

    JAVA流控及超流控后的延遲處理實(shí)例

    這篇文章主要介紹了JAVA流控及超流控后的延遲處理,以實(shí)例形式較為詳細(xì)的分析了Java進(jìn)行流量控制的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下 ...

    shichen20141622019-12-07
  • JAVA教程將內(nèi)容寫到txt文檔里面并讀取及刪除的方法

    將內(nèi)容寫到txt文檔里面并讀取及刪除的方法

    本文有個(gè)不錯(cuò)的示例,主要講解如何將內(nèi)容寫到txt文檔里面、讀取文件里面的內(nèi)容以及清除txt文件里面的內(nèi)容 ...

    java技術(shù)網(wǎng)3432019-10-29
  • JAVA教程JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解

    JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解

    在Web應(yīng)用程序開發(fā)中,文件上傳與下載功能是非常常用的功能,下面通過本文給大家介紹JavaWeb實(shí)現(xiàn)文件上傳與下載實(shí)例詳解,對(duì)javaweb文件上傳下載相關(guān)知...

    茶飲月3452020-03-31
  • JAVA教程JVM的垃圾回收算法工作原理詳解

    JVM的垃圾回收算法工作原理詳解

    這篇文章主要介紹了JVM的垃圾回收算如何判斷對(duì)象是否可以被回收,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,...

    clawhub2532019-06-30
  • JAVA教程java獲取Date時(shí)間的各種方式匯總

    java獲取Date時(shí)間的各種方式匯總

    這篇文章針對(duì)java獲取Date時(shí)間的各種方式匯總,有常用的時(shí)間獲取方式,還有一些其他特殊時(shí)間獲取方式,感興趣的小伙伴們可以參考一下 ...

    徐劉根3552020-03-10
700
主站蜘蛛池模板: 国产欧美日韩综合精品 | 伊人3 | 午夜999| 2018啪一啪 | 欧美国产精品一区 | 国产第一区在线观看 | 亚洲精品a | 精品国产免费人成在线观看 | 91精品国产色综合久久不卡蜜臀 | 国产剧情一区二区 | 日本激情网| 亚洲欧美一区二区三区四区 | 国产高清精品一区 | 国产一区二区三区免费观看 | 欧美怡红院视频一区二区三区 | 日韩一区电影 | 日日躁夜夜躁狠狠躁 | 亚洲资源在线 | 亚洲一区二区三区四区五区午夜 | 精品国精品国产自在久不卡 | 成人av网站在线观看 | 国内精品久久久 | 国产精品高清在线 | 国产欧美精品在线 | av高清在线看 | 国产精品极品美女在线观看免费 | 亚洲电影免费 | 精品国产91亚洲一区二区三区www | 日韩免费在线观看视频 | 国产的黄色片 | 国产一区二 | 日韩一区精品 | av网站免费线看 | 亚洲第一黄色 | 亚洲第一区在线 | 91看片淫黄大片一级在线观看 | 久久免费一区 | 午夜精品视频 | av在线天堂网 | 亚洲精品成人免费 | 久久国产亚洲精品 |