程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Servlet簡介

Servlet簡介

編輯:關於JAVA

Servlet是Java技術在CGI編程方面的一個解決之道。Servlet是在服務器端運行的程序,可產生動態的內容輸出,相對於使用傳統的CGI編程,Servlets有不少的優點:

效率:使用傳統的CGI編程,對於每個HTTP請求都會打開一個新的進程,這樣將會帶來性能和擴展性的問題。使用Servlets,由於Java VM(Java虛擬機)是一直運行的,因此開始一個Servlet只會創建一個新的Java線程而不是一個系統進程

功能強大--相對於傳統的CGI,由於有著廣泛的Java API支持,Servlets可做到傳統CGI很困難甚至不能做的事。Servlets可輕松做到共享數據、維護信息、跟蹤session等。

安全--Servlets通過Servlet引擎在一個受到限制的環境下運行,與Web浏覽器對applet的限制相似。這可以避免惡意Servlets的破壞。

花費--對於個人或者流量不大的站點來說,有不少“免費”或者低價的web服務器可供選擇。如果你已經有一個web服務器,你可以很容易加入Servlet技術的支持,而且價格很便宜。

可移值性--Sevlet API得益於Java平台,這是一個相當簡單的API,幾乎被所有的Web浏覽器支持,因此Servlets可以輕松地在平台間移植,而且通常都無需作任何的修改。

簡單說來,Servlet是一個Java類,需要被稱為Servlet引擎的Java虛擬機執行。Servlets被調用時,就會被引擎裝載,並且一直運行直到Servlet被顯式卸下或者引擎被關閉。

建立一個Servlet

Servlet技術發展很快,是服務器端編程的一個非常好的選擇,而且有著以上種種好處,相信你也有點心動了吧,以下就讓我們來看一下一個簡單的servlet;

import javax.servlet.*;
   import javax.servlet.http.*;
   public class HelloWorld extends HttpServlet {
   public void doGet (HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException
     {
       res.setContentType("text/html");
       ServletOutputStream out = res.getOutputStream();
       out.println("");
       out.println("");
       out.println("");
       out.println(" <h1>Hello World!</h1>");
       out.println("");
       }
      }

要點:

1、HelloWorld類繼承了HttpServlet

2、我們覆蓋了doGet方法

3、該Servlet的輸出是一段靜態的文本

4、doGet接收HttpServletRequest和HttpServletResponse作為參數,它們是在一個客戶提交一個請求時,由服務器創建的。

接收用戶輸入的數據

上面的例子很有趣,不過我們還不滿意,我們還希望可以接收用戶輸入的數據,並且對該數據做一些處理。Servlet技術很容易做到。

import javax.servlet.*;
   import javax.servlet.http.*;
   public class HelloUser extends HttpServlet {
   public void doGet (HttpServletRequest req, HttpServletResponse res)
   throws ServletException, IOException
    {
      res.setContentType("text/html");
      ServletOutputStream out = res.getOutputStream();
      out.println("");
      out.println("");
      out.println("");
      out.println(" <h1>Hello " + "req.getParameter("User")" + "!</h1>");
      out.println("");
    }

相對於首個例子來說,只有一個明顯的變化。我們將為用戶提供一些動態的數據。我們先假設數據是通過GET方法發送的,這樣我們的變量將會被放在Querystring中。如果使用傳統CGI編程的話,這要費一些周章,不過使用Servlets時,不少操作是自動的。為了從querysting中得到我們的數據,我們調用了HttpServletRequest對象的getParameter方法,即是:

req.getParameter("")

是你希望得到值的變量名。getParameter返回的值是一個字符串。如果該參數存在但是沒有值,getParameter將會返回一個空的字符串。如果這個參數根本不存在,getParameter將會返回NULL。最後,如果你的參數可能有多個值,使用getParameterValues將會返回一個字符串數組。

如果你想通過POST方法發送你的數據呢?實現它與實現get是同樣簡單的。你只要在該類中加入以下代碼:

public void doPost (HttpServletRequest req, HttpServletResponse res)
   throws ServletException, IOException
    {
     doGet(req, res);
    }

現在你的Servlet可以同時處理POST和GET數據了。

使用Cookies

Cookies是web開發者最不可以缺少的工具之一。要記錄客戶端的狀態,無需使用非常復雜的處理,一個簡單的cookie就可以了,它改變了“無狀態的Internet”這種狀況。使用它,我們的Servlet可記住每個用戶,在他們再次光臨時,將會看到一個歡迎他再次來臨的個性化頁面。

首先,讓我們看一下cookie其中一些很有用的get/set函數:

1、getName/setName -毫無疑問,這是一個最重要的set函數,而且你還要經常查找你的cookie名字;

2、getValue/setValue - 另一個重要的函數用來得到和設置cookie的值;

3、getMaxAge/setMaxAge - 讓你設置/讀取cookie的生存時間;

4、getComment/setComment - 讀取/關聯cookies的注釋;

5、getSecure/setSecure - 一個布爾值,用來設定你的cookie是否經由SSL發送

為了在我們的cookie中存儲數據,我們必須:

1、初始化一個cookie對象

2、設置它的屬性

3、發送cookie

為了從我們的cookie中接收數據,我們必須:

1、由用戶的請求中接收所有的cookies

2、從中查找出你要用到的cookie

3、得到你cookie的值;

好,讓我們看看如何在我們的Servlet中加入cookie創建的功能:

import java.io.*;
   import javax.servlet.*;
   import javax.servlet.http.*;
   public class HelloUser extends HttpServlet {
   public void doGet (HttpServletRequest req, HttpServletResponse res)
   throws ServletException, IOException
   {
    String User = req.getParameter("User");
    int OneYear = 60*60*24*365;
    file:// Let抯 instantiate our cookie
    Cookie UserNameCookie = new Cookie("Username", User);
    // We also want to set our cookie to live for a year
    UserNameCookie.setMaxAge(OneYear);
    // Finally, let抯 send the cookie off
    response.addCookie(UserNameCookie);
    res.setContentType("text/html");
    ServletOutputStream out = res.getOutputStream();
    out.println("");
    out.println("");
    out.println("");
    out.println(" <h1>Hello " + User + "!</h1>");
    out.println("");
   }
   public void doPost (HttpServletRequest req, HttpServletResponse res)
   throws ServletException, IOException
   {
     doGet(req, res);
    }

很簡單吧。不過,我們還要注意一些問題。

首先,cookies的名字是一個字符串,不能包含有以下的字符:

( ) | [ ] { } < > @ , . : ; \ " ? =

而且cookies名字不能用$開頭,最後,如果你希望你的cookie兼容Netscape以前的cookie規范,不能帶有任何的空格。

由於所有的cookie信息都是作為一個header(HTML的頭部)發送給客戶端的,因此你必須在使用writer前創建你的cookie(所有的headers都必須在使用writer前寫入)

就這麼多,現在你可以產生自己的首個cookie了。

請修改我們前面的例子(由querysting提取username那個),並且在cookie讀取它的值。

import javax.servlet.*;
   import javax.servlet.http.*;
   public class HelloUser extends HttpServlet {
   public void doGet (HttpServletRequest req, HttpServletResponse res)
   throws ServletException, IOException
   {
   // This returns an array of cookies
   Cookie[] cookies = req.getCookies();
   file:// We now need to traverse our array to find our cookie
   file:// since our cookie may be one of many.
   for(i=0; i < cookies.length; i++) {
    Cookie thisCookie = cookie[i];
    if (thisCookie.getName().equals("Username")
     {
      String User = thisCookie.getValue();
     }
   }
   res.setContentType("text/html");
   ServletOutputStream out = res.getOutputStream();
   out.println("");
   out.println("");
   out.println("");
   out.println(" <h1>Hello " + User + "!");
   out.println("");
   }
  }

很明顯,接收cookie數據並不是一件很困難的事情。我們只要使用getCookies()就可得到一個cookes數組。一旦得到這個數組,我們就可以使用一個簡單的for循環遍歷它。在找到需要的cookie後,我們使用getValue()來存儲信息,並且使用HTML顯示數據,就這麼簡單。

結論

Java Servlets使編程者可以使用Java作為替代傳統CGI編程的一個選擇。從這篇文章中,你學習到如何接收和處理GET、POST和cookie數據,還了解了如何使用cookies存儲客戶的狀態。對於使用Servlets來說,這些都是很有用的技術。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved