1. 程式人生 > >java 中servlet的總結

java 中servlet的總結

1:servlet定義:

Servlet是一個Java應用程式,執行在伺服器端,用來處理客戶端請求並作出響應的程式。

Servlet多執行緒體系結構是建立在Java多執行緒機制之上的,它的生命週期是由Web容器負責的。 當客戶端第一次請求某個Servlet時,Servlet容器將會根據web.xml配置檔案例項化這個Servlet類,此時它貯存於記憶體中。當有新的客戶端請求該Servlet時,一般不會再例項化該Servlet類,也就是有多個執行緒在使用這個例項。 這樣,當兩個或多個執行緒同時訪問同一個Servlet時,可能會發生多個執行緒同時訪問同一資源的情況,資料可能會變得不一致。所以在用Servlet構建的Web應用時要注意執行緒安全的問題。每一個請求都是一個執行緒,而不是程序,因此,Servlet對請求的處理的效能非常高。
        對於Servlet,它被設計為多執行緒的
(如果它是單執行緒的,你就可以想象,當1000個人同時請求一個網頁時,在第一個人獲得請求結果之前,其它999個人都在鬱悶地等待),如果為每個使用者的每一次請求都建立 一個新的執行緒物件來執行的話,系統就會在建立執行緒和銷燬執行緒上耗費很大的開銷,大大降低系統的效率。

  解決servlet執行緒安全的方案:同步對共享資料的操作 Synchronized (this){...}、避免使用例項變數

public class ServletDemo extends HttpServlet {
 
     int i=1;
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
        /**
          * 加了synchronized後,併發訪問i時就不存線上程安全問題了,
          * 為什麼加了synchronized後就沒有執行緒安全問題了呢?
          * 假如現在有一個執行緒訪問Servlet物件,那麼它就先拿到了Servlet物件的那把鎖
          * 等到它執行完之後才會把鎖還給Servlet物件,由於是它先拿到了Servlet物件的那把鎖,
          * 所以當有別的執行緒來訪問這個Servlet物件時,由於鎖已經被之前的執行緒拿走了,後面的執行緒只能排隊等候了
          * 
         */
         synchronized (this) {//在java中,每一個物件都有一把鎖,這裡的this指的就是Servlet物件
             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);
     }
 
 }

2:簡單的servlet例項:

Servlet介面SUN公司定義了兩個預設實現類,分別為:GenericServlet、HttpServlet。HttpServlet在實現Servlet介面時,覆寫了service方法,該方法體內的程式碼會自動判斷使用者的請求方式,如為GET請求,則呼叫HttpServlet的doGet方法,如為Post請求,則呼叫doPost方法。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet或doPost方法,而不要去覆寫service方法。

public class FirstServlet extends HttpServlet {

//處理請求的方法

public void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, java.io.IOException {

//資料傳送給客戶端—>控制檯方式輸出

//System.out.println(“Hello Servlet”);

//資料傳送給客戶端—>HTML頁面輸出

resp.setContentType(“text/html”);

resp.getWriter().print(“<html>”);

resp.getWriter().print(“<head>”);

resp.getWriter().print(“</head>”);

resp.getWriter().print(“<body>”);

resp.getWriter().print(“Hello World”);

resp.getWriter().print(“</body>”);

resp.getWriter().print(“</html>”);

}

}

servlet配置到tomcat中去:

Tomcat是一個web容器,也叫web伺服器。編譯好的servlet類只能執行在tomcat容器中,客戶端瀏覽器不可以直接訪問Servlet,需要在web.xml中配置一下 

<servlet>
 
<servlet-name>FirstServlet</servlet-name>

<servlet-class>FirstServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>FirstServlet</servlet-name>

<url-pattern>/servlet/FirstServlet</url-pattern>

</servlet-mapping>

 Tomcat啟動成功後,在瀏覽器中輸入:http://localhost:8080/abingtest/servlet/FirstServlet

3:servlet執行原理
當我們在瀏覽器中輸入http://localhost:8080/abingtest/servlet/FirstServlet的時候,Tomcat是如何找到我們的servlet ,執行,並返回我們想看到的頁面的呢?


3.1.:WebApplication的標準目錄結構:
WEB-INF/classes
/lib
Web.xml

也就是一個完整的web應用程式目錄下,必須包含以上的目錄結構。

Classes 資料夾下是專案中用到的類檔案,均由JDK編譯成了.class檔案;Lib資料夾是我們專案中引用的jar包;Web.xml是整個web應用程式的配置文件。

3.2:Tomcat解析URL
a) 首先來看URL中包含的資訊:”協議” + “埠號” + “路徑(專案名稱+檔案路徑)”
Tomcat啟動後,監聽我們的8080埠,當有Url請求發過來之後,解析出專案名稱 abingtest,然後到webapps目錄下搜尋到該專案資料夾。
b) 專案檔案找到後,開始尋找類檔案。
這個時候Tomcat去Web.xml檔案中尋找<servlet-mapping> 配置節中包含”servlet/FirstServlet”字串,進而找到該類檔案所在的位置。 


3. Servelt中的doGet() 和 doPost() 方法
我們寫的FirstServlet 繼承了HttpServlet ,重寫了HttpServlet中的doGet() 方法,HttpServlet中還有一個doPost()方法。這兩個方法都是用來處理Http請求的。Servlet會根據我們提交表單的方法(method=post/get)呼叫service方法來自動選擇。

4. Servlet如何接收資料

public class FirstServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, java.io.IOException {

//獲取表單資料

String userName = request.getParameter(“userName”);

}

}

 Http協議會將網頁中的所有內容包裝成為一個request物件傳遞給servlet ,Servlet通過這個物件拿到表單中的所有資料,處理完成之後,通過Response物件返回給客戶端瀏覽器。

Servlet訪問URL使用*萬用字元對映

<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>
   </servlet-mapping>
http://localhost:8080/abingtest/任意字元都可以

相關推薦

java servlet總結

1:servlet定義:Servlet是一個Java應用程式,執行在伺服器端,用來處理客戶端請求並作出響應的程式。Servlet多執行緒體系結構是建立在Java多執行緒機制之上的,它的生命週期是由Web容器負責的。 當客戶端第一次請求某個Servlet時,Servlet容器將

java方法總結(每周更新)

實例 參數 創建 方法 get ack bject 子類 generate 1、URLEncoder.encode(username,"utf-8")將“utf-8”編碼的username先解碼,然後再采用URL編碼 2、URLDecoder.decode(autoLogi

javasuper總結

調用 sta 列表 java stat 參數 數列 構造方法 子類 1:super 可以在子類調用父類中的成員變量(包括static修飾的變量)和方法(包括static修飾的方法) 2:super 可以調用父類的構造方法 super(參數列表),在沒有定義時,並且沒有調用自

java路徑總結&servletpost和get亂碼解決

路徑: 一般包括:   超連結:   form表單:   重定向:   轉發:   包含:  ServletContext物件獲得資源:   url-pat

Java事務總結詳解(精華)

1.什麼是JAVA事務? 通常的觀念認為,事務僅與資料庫相關。 事務必須服從ISO/IEC所制定的ACID原則。ACID是原子性(atomicity)、一致性(consistency)、隔離性 (isolation)和永續性(durability)的縮寫。 事務的原子性:表示事務執行過程中的任何失敗都將

java servlet和jsp的概念及區別

目錄 一、瞭解Servlet的概念         Servlet定義:Servlet是基於Java技術的Web元件,由容器管理併產生動態的內容。Servlet引擎作為WEB伺服器 的擴充套件提供支援Servlet的功能。Servlet與客戶端通過Servlet

javaServlet之域物件

在Servlet裡面,有三個非常常用而且重要的物件,它們是:1. Request (Request域)2. Session (Session域)3. ServletContext (ServletContext域)這三個物件與別的物件有什麼特殊之處呢?答:這三個物件可以存放

JavaServlet

servlet-api.jar servlet-api.jar檔案為Servlet API的類庫檔案。Servlet API主要由兩個java包組成:javax.sevlet和javax.servlet.http。在javax.servlet包中定義了Serv

JAVA IO總結 之前篇阻塞、非阻塞

空會叫北美廠律備具意六算高七樣任平還五元更界五程果路造海車總資條許各半變中路省小裝京地因明適據物元取她行內正示驗思以車細改壓傳命解先沒特聯算曆平量都較片種張打該那它能水基回切解專聯養路議求人交空求五觀京華青總用年品業爭快非選經處例酸滿調律技力高叫法半問設方設養示廣你每更置非即

關於高淇JAVASORM總結學習筆記詳細個人解釋

                          

java的數據類型和運算符的總結歸類。

等等 宋體 表示 參數 強制轉換 賦值運算 對象 強制 特點 首先學習java肯定先要了解java的發展史,以及java的特點,常見的dos命令,jdk的安裝,如何開發java程序等等一下概念行的東西,這裏面我都不一一說了。 今天這一章主要想總結一下java中的數據類型和運

Java獲取資源文件的方法總結

tco doget 技術 resource images 磁盤 response linux exception 這裏總結3中方法獲取資源文件的 ServletContext Class ClassLoader 文件的位置 1. ServletC

Javaenum的學習總結

順序 nac ans mil 封裝 com size 一周 mod 一、通常的定義常量的方法 public class Sex{ public final static int MALE = 1; public final static int FEMALE

Javastatic關鍵字用法總結

副本 大括號 跟著 rac clas main 靜態成員變量 abstract 全局變量 1. 靜態方法 通常,在一個類中定義一個方法為static,那就是說,無需本類的對象即可調用此方法 聲明為static的方法有以下幾條限制: · 它們僅能調用其他的sta

C#、Java的一些小功能點總結(持續更新......)

grid datagrid item 其他 cnblogs hid roc oid sha 前言:在項目中,有時候一些小的功能點,總是容易讓人忽略,但是這些功能加在項目中往往十分的有用,因此筆者在這裏總結項目中遇到的一些實用的小功能點,以備用,並持續更新...... 1.禁

Java的內存處理機制和final、static、final static總結

stat 入口 引用類型 堆棧 class a 如果 虛擬 不同 bsp Java中的內存處理機制和final、static、final static總結 裝載自:http://blog.csdn.net/wqthaha/article/details/209235

Javainstanceof關鍵字的用法總結

animal copy false 運算 erl 一個 strong 以及 繼承 instanceof是Java的一個二元操作符,和==,>,<是同一類東東。由於它是由字母組成的,所以也是Java的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,

關於Java鎖的總結

信號 原子操作 turn 內存堆 int() ext return 總結 多個 多個進程或線程同時(或著說在同一段時間內)訪問同一資源會產生並發(線程安全)問題。解決並發問題可以用鎖。 java的內置鎖: 每個java對象都可以用做一個實現同步的鎖,這些鎖稱為內置鎖。線程進

Java的常用集合類型總結

tar tro arr style spa htable blog html hset 1.可重復列表(List) LinkedList和ArrayList的區別:http://www.importnew.com/6629.html ArrayList vs. Linked

JAVA正則表達式學習總結

等價 regex 5.1 表示 最好 方法 system lin 劃線 一、JAVA中正則表達式相關的類 1. java.util.regex.Pattern   該類用於編譯模式,模式可以理解為一個正則表達式,比如:a*b。   用法如下:   // 創