1. 程式人生 > >[01] Servlet是什麽

[01] Servlet是什麽

url 自動調用 ons post content 技術 self pro println

1、Servlet是什麽

Servlet(Server Applet),全稱Java Servlet,是用Java編寫的服務器端程序。其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。

1.1 廣義上來講

從本質上來講,Servlet就是一個特殊的Java類,說它特殊是因為這個Java類必須直接或間接地實現Servlet接口(javax.servlet.Servlet),我們自定義的Servlet更多是采用繼承HttpServlet的方式,以達到間接實現Servlet接口的目的。
Servlet還有一個比較特殊的地方:必須運行在Web容器(服務器)中,不能像普通類使用main方法訪問,它的方法由服務器在相應情況下調用執行。一般來說自定義Servlet要覆蓋其doGet和doPost方法,根據請求是GET/POST方式會自動調用相應的doGet/doPost方法。

又要實現接口,又只能在Web容器中運行,那麽Servlet的任務就來了:
  • 獲取請求數據
  • 處理請求
  • 完成響應
技術分享

1.2 狹義上來講

首先要明白的是,JavaEE實際上是sun公司定義的一系列技術標準所組成的平臺,用來B/S結構的應用程序。所以它實質是一套體系或者說是一套標準(其中如我們所熟知的JSP、JSTL和Servlet都隸屬其中),所以有了以下Servlet的狹義說法。

所以,狹義的Servlet是指Java語言實現的一個接口,再白話一點,你可以理解為,Servlet就是一套規範,不過是以接口的形式展現。下面摘自J2EE的API:

Defines methods that all servlets must implement.

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.
To implement this interface, you can write a generic servlet that extends javax.servlet.GenericServlet or an HTTP servlet that extends javax.servlet.http.HttpServlet.

This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence:
  • The servlet is constructed, then initialized with the init method.
  • Any calls from clients to the service method are handled.
  • The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.

In addition to the life-cycle methods, this interface provides the getServletConfig method, which the servlet can use to get any startup information, and the getServletInfo method, which allows the servlet to return basic information about itself, such as author, version, and copyright.
可以看到,在J2EE這套大標準中,Servlet是作為服務器端用以交互請求和響應的一套標準。而符合J2EE這套標準(包括Servlet標準)的產品叫“實現”,不同服務器對待這套標準的方式不同,我們也可以說,“實現”是不同的,所以像JBoss、Tomcat、WebLogic都是J2EE標準的“實現”。

2、Servlet的配置

訪問Servlet之前,必須配置Servlet,否則不同的請求,如何對應不同的Servlet來進行處理呢?
在web.xml中配置Servlet的主要信息,示例如下:
  1. <servlet>
  2. <!-- 自定義的名字,在web.xml中不重復 --->
  3. <servlet-name>MyServlet</servlet-name>
  4. <!-- Servlet類的完整名字 -->
  5. <servlet-class>j2ee.servlet.MyServlet</servlet-class>
  6. </servlet>
  7. <servlet-mapping>
  8. <!-- 與之前自定義的名字相對應 -->
  9. <servlet-name>MyServlet</servlet-name>
  10. <!-- 自定義的邏輯地址,必須以/開頭 -->
  11. <url-pattern>/doServlet</url-pattern>
  12. </servlet-mapping>

這裏重點說明一下url-pattern,自定義的邏輯地址,也就是說如果訪問的url中,根路徑之後符合自定義的邏輯要求,則跳轉到對應的Servlet,如上 /doServlet,意味著如果我的url是諸如 http://localhost:8080/doServlet,那麽訪問會跳轉到 j2ee.servlet.MyServlet 類中去,根據GET或POST調用相應的doGet或doPost方法。
其中,自定義的邏輯地址,有以下幾種匹配方式:
  • 完全匹配
    • 如<url-pattern>/doServlet</url-pattern>
    • 即如 http://localhost:8080/doServlet 才能訪問, .../doServlet.do 或 .../doServlet/xxx 等都無法訪問到該Servlet
  • 路徑匹配
    • 如<url-pattern>/*</url-pattern>
    • 即根路徑下所有請求都會訪問到對應Servlet
  • 擴展名匹配
    • 如<url-pattern>*.do</url-pattern> 以 .do 結尾的請求
    • 如<url-pattern>*.html</url-pattern> 以 .html 結尾的請求

3、Servlet的作用

最基本的網頁是靜態的,也就是最普通的html形式,為了能編寫服務器動態網頁,Servlet接下了重任,用來輸出HTML標簽和內容:
  1. public class MyServlet extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. response.setContentType("text/html;charset=utf-8");
  5. PrintWriter out = response.getWriter();
  6. out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
  7. out.println("<HTML>");
  8. out.println(" <HEAD><TITLE>This is my Servlet</TITLE></HEAD>");
  9. out.println(" <BODY>");
  10. out.print(" This is ");
  11. out.print(this.getClass());
  12. out.println(", using the GET method");
  13. out.println(" </BODY>");
  14. for (int i = 0; i < 10; i++) {
  15. out.println("<font color=‘red‘>i=" + i + "</font><br>");
  16. }
  17. out.println("</HTML>");
  18. out.flush();
  19. out.close();
  20. }
  21. @Override
  22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. doGet(request, response);
  24. }
  25. }

如web.xml中配置Servlet如下:
  1. <servlet>
  2. <servlet-name>MyServlet</servlet-name>
  3. <servlet-class>j2ee.servlet.MyServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>MyServlet</servlet-name>
  7. <url-pattern>/doServlet</url-pattern>
  8. </servlet-mapping>

那麽我們訪問符合的路徑時,我們得到的是:技術分享 可以看到,我們通過Servlet中編寫網頁內容,最終得到了相應的網頁內容,而且該頁面的內容根據我們代碼中的邏輯不同會動態發生改變,也就是我們說的能編寫動態頁面。技術分享 但是真的太麻煩了,我們要寫大量諸如out.print的重復代碼,而且格式雜亂也不便於修改。
直到JSP的出現,需要輸出動態內容的功能,都在JSP中實現了(至於JSP是什麽,以後會提到),Servlet不用再去寫那些痛苦的out.print代碼了。所以,現在Servlet的作用是用來做控制器使用,用來接收請求,處理請求,跳轉到不同的頁面
技術分享

[01] Servlet是什麽