1. 程式人生 > >Servlet介紹以及簡單實例

Servlet介紹以及簡單實例

註意 project 網絡 webp println ping protocol rip .org

一、背景介紹:

  HTTP:超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。設計HTTP最初的目的是為了提供一種發布和接收 HTML頁面的方法。所有的www文件都需要遵循這個標準,也就註定我們的Web的相應模式。 其中我們關註:

“HTTP是一個客戶端和服務器端請求和應答的標準(TCP)”

  Web響應模式:Web的響應模式核心是:請求/響應,對應著HTTP中的請求和應答。

“瀏覽器在地址欄輸入響應的URL敲擊回車後,瀏覽器便發送一個Http請求,進而服務器接受到Http請求,服務器接受請求後進行處理,將回應的內容返回給客戶端(瀏覽器)顯示。客戶端瀏覽器發送的請求稱為request, 服務器端返回的稱為response,這種交互都是利用HTTP協議完成度的。”

  在學習的時候,我簡單的將客戶端和服務器當作簡單的兩臺連接網絡的計算機(PC),實際上在我們開發Web項目時,在本地調試時自己的計算機是客戶端也是服務器。我們通過一個簡單的比喻來描述,Web響應模式。
  做個比喻:
  這裏我們拿Kenny做個比喻,kenny是客戶端,kenny’mom 是服務器,這個時候kenny很餓,說“Mom,get me an apple!”然後他媽就給他了一個蘋果。這個時候,他還沒吃飽,又說“Mom,getme some Ice cream”,這個時候他媽就去冰箱了一點冰淇淋給他了。如下圖所示:

技術分享

  實際上的是這樣:

技術分享

  以上便是一個簡單的對Web響應模式的理解。

二、Servlet工作流程

  瀏覽器提交的請求是滿足Http協議的文本,該文本是由服務器容器,例如Tomcat接受並解析封裝成了HttpServletRequest類型的request,所有的HTTP頭數據都是可以通過request的對應方法查詢到(get),當需要輸出給客戶端瀏覽器時,Tomcat將輸出流文本封裝成HttpServletResponse的response對象,通過設置response的屬性,來控制輸出的內容。其中,Tomcat利用request和response做為參數,調用Servlet中的方法,例如doget(request,response);

技術分享

  上述Servlet1的直接把內容反饋給了用戶瀏覽器,客戶端接收到服務器的響應的內容。(類比kenny第一次餓了)

技術分享

  上述Servlet2的查詢了數據庫或其他的操作,把內容反饋給了客戶。(類比kenny吃冰欺淩)

三、Servlet接口&訪問方式介紹

  Servlet是實現了javax.servlet.Servlet接口的類,這個接口規定了特定的方法來處理特定的請求,我們只需要實現Servlet相關的方法,Servlet規範是建立在HTTP協議上的,http1.1規範支持OPTIONS/GET/POST/HEAD/PUT/DELETE/TRACE等7種訪問方式。下面我們重點介紹Get/Post。

1、GET:表示查詢信息,URL中附帶少量參數信息,URL總長度不超過255個字符,參數還會在瀏覽器的地址欄中顯示

2、POST:表示提交信息,一般用於提交大數據信息或者文件,提交的內容不收長度限制,也不會在地址欄中顯示。

4、OPTIONS /PUT /DELETE /TRACE:是被聲明了但還沒有被使用web訪問方式,幾乎不用。

四、Servlet配置部署

  為了能讓Servlet正常運行,需要如下配置

  1. 實現對應的Servlet 例如,FirstServlet.java
  2. 在項目/WebRoot/WEB-INF/web.xml文件中配置Servlet,其中為必填屬性,為配置默認參數,Key,Value的形式。取值0或1,配置為1,則Tomcat啟動便會加載這個Servlet,如果為0,則有第一次請求這個Servlet時才加載。(這一步將一個編寫好的Servlet類配置進了Web.xml,我們知道web.xml中的myFirstServlet對應的就是FirstServlet.java這個Java類)
  3. 當把一個servlet配置進了web.xml後,我們該配置如何通過URL方式來訪問進這個Servlet類,也就是調用這個類。這裏就要配置,Web.xml中的,指當前web.xml文件中上例配置的Servlet名字,指訪問路徑,其中通配符*指任意長度的任意字符,?指任意字符。

下面貼出代碼

1.實現對應的Servlet 例如,FirstServlet.java

可以在Myeclipse**快捷**的新建出Servlet,單擊下圖所示

技術分享

下圖需要註意的有三點:

  1. A點是這個Servlet的名字
  2. B點這個是Servlet繼承了HttpServlet
  3. C點是這個Servlet生成的相關函數,後文在詳細講解,這裏如果不理解可以先忽略。

技術分享

2.在web.xml文件中配置<\Servlet>

  web.xml的所在的目錄是WebRoot/WEB-INF/web.xml

<!-->Web.xml中<-->
<servlet>
     <servlet-name>myFirstServlet</servlet-name>
     <servlet-class>com.demos.servlet.FirstServlet/FirstServlet.java</servlet-class>
     <init-pararm>
          <param-name>WelcomeInfo</param-name>
          <param-value>Welcome to Servlet world</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
</servlet>

  其中<servlet></servlet> 是一對標簽,來配置Servlet

  <Servlert-name>配置的是Web.xml中使用這個Servlet的名稱。

  <servlert-class>來配置這個Web.xml中<Servlet>的所對應的Servlet的實現類。

  (說白了這一步我的理解就是,告訴服務器我這有個Servlet,這Servlet 叫什麽,到時候有人要用,要用你就調用那個個類)

3.在web.xml文件中配置<\Servlet-mapping>

<!-->上述Web.xml後文<-->
<servlet-mapping>
     <servlet-name>myFirstServlet</servlet-name>
     <url-patern>Web應用程序的路徑/FirstServlet</url-patern>
</servlet-mapping>

  其中<servlet-mapping>是配置Servlet的訪問模式,<servlet-name> 使用上述’myFirstServlet‘的這個名字,這個名字就是標識著在Web.xml的一個Servlet類型的量(第二步聲明出來的)。
  <url-patern>來說明了要訪問這個Servlet的URL模式,

技術分享

  可以配置多個url-patern如下:

<servlet-mapping>
     <servlet-name>myFirstServlet</servlet-name>
     <url-patern>Web應用程序的路徑/FirstServlet.jsp</url-patern>
     <url-patern>Web應用程序的路徑/FirstServlet.php</url-patern>
     <url-patern>Web應用程序的路徑/FirstServlet.GG</url-patern>
</servlet-mapping>

  這裏的配置可一看到後面有.jsp 有 .php 這樣的操作可以實現隱藏編程語言的目的,而有些頁面也可以用特定的後綴來標識來聲明版權(如公司縮寫,上文.GG為巧合虛構)

  註意:一個完整的Servlet配置方案需要,Servlet.java類,<servlet>配置,<servlet-mapping>配置。其中<servlet>和<servlet-mapping>配置都是在Web.xml中進行配置。

五、Servlet代碼實例

  這裏是完整的Servlet代碼以及web.xml和對應的實驗截圖。

  項目結構:<新建Webproject-建包-建Servlet-自動mapping>:

技術分享

  FirstServlet 代碼:

package com.demos.servlet;
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 FirstServlet extends HttpServlet {
     private static final long serialVersionUID = 304496806747823900L;
     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();
     }
     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();
     }
     public void init() throws ServletException {
          // Put your code here
     }
}

  這裏我們不要在意文件中的細節,只需要註意上述文件中的這裏:

public class FirstServlet extends HttpServlet //FirstServlet 繼承了HttpServlet 
...
PrintWriter out = response.getWriter();//這裏就是響應的輸出對象 out

  Web.xml的文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     id="WebApp_ID" version="3.0">
     <display-name>Demos</display-name>
     <welcome-file-list>
           <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
     <servlet>
           <description>This is the description of my J2EE component</description>
           <display-name>This is the display name of my J2EE component</display-name>
           <servlet-name>FirstServlet</servlet-name>
          <servlet-class>com.demos.servlet.FirstServlet</servlet-class>
     </servlet>
     <servlet-mapping>
           <servlet-name>FirstServlet</servlet-name>
           <url-pattern>/servlet/FirstServlet</url-pattern>
     </servlet-mapping>
</web-app>

  結果:F12查看輸出源碼

  這裏我們在瀏覽器中輸入URL後敲擊回車會在內容中顯示出,“This is class com.demos.servlet.FirstServlet,using the GET method”,這裏便是我們輸出給用戶(用戶User指人,客戶Clint不一定要是人)的信息,我們按F12可以看出服務器的Servlet返回的所有的信息,在下圖的下方顯示。
  其原因是Servlet輸出的信息是HTML信息,當瀏覽器得到這一串信息後,變解析成了一個頁面,而頁面內容便是中的那串字符。

技術分享

Servlet介紹以及簡單實例