1. 程式人生 > >Servlet基礎 及詳細介紹(附帶程式碼)

Servlet基礎 及詳細介紹(附帶程式碼)

javaweb學習筆記 Servlet基礎   

完整程式碼下載地址

http://download.csdn.net/download/qq_26676207/9477503


1.Servlet概述

    JSP的前身就是Servlet。Servlet就是在伺服器端執行的一段小程式。一個Servlet就是一個Java類,並且可以通過“請求-響應”程式設計模型來訪問的這個駐留在伺服器記憶體的Servlet程式。
2.Tomcat容器等級
    Tomcat的容器分為4個等級,Servlet的容器管理Context容器,一個Context對應一個Web工程。


  3.手工編寫第一個Servlet

    編寫一個Servlet程式大體上需要3個步驟:繼承HttpServlet-->重寫doGet()或者doPost()方法-->在web.xml中註冊Servlet。
    HttpServlet的繼承關係如圖:




    重寫doGet還是doPost方法需要根據請求方式而定。
  一、編寫一個類繼承自HttpRequest並重寫doGet(或者doPost方法)在專案的src目錄下新建一個servlet.MyServlet.java

 1 package servlet;
 2 
 3 import java.io.IOException;
 4
import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 /** 繼承自HttpServlet */ 12 public class HelloServlet extends HttpServlet { 13 14 /**
重寫doGet方法 */ 15 @Override 16 protected void doGet(HttpServletRequest request, HttpServletResponse response) 17 throws ServletException, IOException { 18 System.out.println("處理get請求。。。"); 19 PrintWriter out = response.getWriter(); 20 out.println("<b>HelloServlet</b>"); 21 } 22 23 /** 重寫doPost方法 */ 24 @Override 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 System.out.println("處理post請求。。。"); 28 PrintWriter out = response.getWriter(); 29 out.println("<b>HelloServlet</b>"); 30 } 31 32 }

  二、在WEB-INF/web.xml中註冊剛剛新建的Servlet:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <display-name></display-name>    
 8   <welcome-file-list>
 9     <welcome-file>index.jsp</welcome-file>
10   </welcome-file-list>
11   
12   <!-- 註冊Servlet開始 -->
13   <servlet>
14       <servlet-name>HelloServlet</servlet-name>
15       <servlet-class>servlet.HelloServlet</servlet-class>
16   </servlet>
17   <servlet-mapping>
18       <servlet-name>HelloServlet</servlet-name>
19       <url-pattern>/servlet/HelloServlet</url-pattern>
20   </servlet-mapping>
21   <!-- 註冊Servlet結束 -->
22   
23 </web-app>

  其中servlet-name表示Servlet的名字,servlet-class要寫完成的類的定義(包名.類名),url-pattern表示Servlet的路徑。
  在index.jsp中使用自定義的Servlet處理get和post請求。

 1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 3 <html>
 4   <head>
 5     <title>手工編寫的第一個Servlet</title>
 6   </head>
 7   
 8   <body>
 9     <h1>第一個Servlet小例子</h1><hr>
10     <a href="servlet/HelloServlet">get方式請求HelloServlet</a><br /><br />
11     <form action="servlet/HelloServlet" method="post">
12         <input type="submit" value="post方式請求HelloServlet" /> 
13     </form>
14   </body>
15 </html>

 釋出專案,執行結果:


  4.使用MyEclipse編寫Servlet
      1.src-->new Servlet。
      2.重寫doGet()或者doPost()方法。  
      3.部署執行。
   通過MyEclipse建立Servlet的時候它預設繼承自HttpServlet。預設勾選覆寫init()、destory()、doGet()和doPost()方法,並且自動向web.xml中註冊該Servlet。
   可以發現使用MyEclipse建立的Servlet它已經自動為我們生成了輸出的html模板,我們只需要做很少的改動即可。   
  5.Servlet的執行流程和生命週期


    使用者點選超連結向Servlet傳送請求-->伺服器在web.xml中的servlet-mapping尋找與該Servlet相對應的URL地址-->找到對應的Servlet名字-->根據Servlet的名字找到和該Servlet相關的處理類-->根據請求的方式不同確定是呼叫doGet還是doPost方法。
    一個Servlet的生命週期大致分為3個階段:



    1.客戶端傳送請求給伺服器。
    2.伺服器開始接受,先判斷該請求的servlet例項是否存在,如果不存在先裝載一個servlet類並建立例項。
        如果存在則直接呼叫該servlet的service方法,之後進行判斷是呼叫  doGet方法還是doPost方法。
    3.servlet建立例項後,呼叫init方法進行初始化。之後呼叫servce方法,判斷是呼叫doGet方法還是doPost方法。
      4.最後判斷伺服器是否關閉,如果關閉則呼叫destroy方法。
  下面這個例子展示了Servlet的生命週期:
首先是一個Servlet:TestServlet1

 1 package servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class TestServlet1 extends HttpServlet {
12 
13     public TestServlet1() {
14         System.out.println("TestServlet1構造方法被執行!");
15     }
16 
17     public void destroy() {
18         System.out.println("TestServlet1銷燬方法被執行!");
19     }
20 
21     public void doGet(HttpServletRequest request, HttpServletResponse response)
22             throws ServletException, IOException {
23 
24         System.out.println("TestServlet1的doGet方法被執行!");
25         response.setContentType("text/html;charset=utf-8");
26         PrintWriter out = response.getWriter();
27         out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
28         out.println("<HTML>");
29         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
30         out.println("  <BODY>");
31         out.println("<h1>你好我是TestServlet1</h1>");
32         out.println("  </BODY>");
33         out.println("</HTML>");
34         out.flush();
35         out.close();
36     }
37 
38     public void doPost(HttpServletRequest request, HttpServletResponse response)
39             throws ServletException, IOException {
40         System.out.println("TestServlet1的doPost方法被執行!");
41         doGet(request, response);// 讓doPost與doGet執行相同的操作
42     }
43 
44     public void init() throws ServletException {
45         System.out.println("TestServlet1的初始化方法被執行!");
46     }
47 
48 }

    主頁index.jsp

 1 <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     <title>Servlet的生命週期</title>
12   </head>
13   
14   <body>
15       <h1>Servlet的生命週期</h1><hr />
16       <a href = "servlet/TestServlet1">以get方式請求TestServlet1</a>
17   </body>
18 </html>

  當伺服器啟動之後我們第一次訪問index.jsp的時候,構造方法,初始化方法和doGet()方法執行


    當我們再次請求該頁面的時候,只有doGet()方法被執行:


    伺服器關閉的時候銷燬方法執行。
 6.Tomcat裝載Servlet的3種情況
    在下列時刻Servlet容器會載入Servlet:
    1.Servlet容器啟動時自動裝載某些Servlet,實現它只需要在web.xml檔案中的<servlet></servlet>之間新增以下程式碼:

<load-on-startup>1</load-on-startup>

  其中,數字越小表示優先順序越高。
    例如:我們在web.xml中設定TestServlet2的優先順序為1,而TestServlet1的優先順序為2,啟動和關閉Tomcat:


  優先順序高的先啟動也先關閉。
    2.客戶端首次向某個Servlet傳送請求。【例子詳見Servlet生命週期的那個例子】
    3.Servlet類被修改後,Tomcat容器會重新裝載Servlet。
    Servlet被裝載後,Servlet容器會建立一個Servlet例項,並且呼叫Servlet的init()方法進行初始化,在Servlet的真個生命週期內init()方法只被呼叫一次。
  7.Servlet與JSP內建物件的對應關係


  8.Servlet獲取表單資料
    使用者在reg.jsp中填寫登錄檔單,使用post方式將資料傳送到一個名稱為servlet.RegServlet的Servlet處理【Servlet的doPost()方法】,Servlet將使用者資訊封裝成一個Users物件儲存在session中,講請求轉發到userinfo.jsp。在userinfo.jsp中通過<jsp:useBean>指令從session中取出儲存的使用者物件,通過<jsp:getPerproty>指令顯示使用者物件的各個欄位。




 1 package entity;
 2 
 3 import java.util.Date;
 4 
 5 /** 使用者實體類 */
 6 public class Users {
 7     private String username;
 8     private String password;
 9     private String email;
10     private String sex;
11     private Date birthday;
12     private String[] favorites;
13     private String introduce; // 自我介紹
14     private boolean flag; // 是否接受協議
15 
16     public Users() {
17     }
18 
19     public String getUsername() {
20         return username;
21     }
22 
23     public void setUsername(String username) {
24         this.username = username;
25     }
26 
27     public String getPassword() {
28         return password;
29     }
30 
31     public void setPassword(String password) {
32         this.password = password;
33     }
34 
35     public String getEmail() {
36         return email;
37     }
38 
39     public void setEmail(String email) {
40         this.email = email;
41     }
42 
43     public String getSex() {
44         return sex;
45     }
46 
47     public void setSex(String sex) {
48         this.sex = sex;
49     }
50 
51     public Date getBirthday() {
52         return birthday;
53     }
54 
55     public void setBirthday(Date birthday) {
56         this.birthday = birthday;
57     }
58 
59     public String[] getFavorites() {
60         return favorites;
61     }
62 
63     public void setFavorites(String[] favorites) {
64         this.favorites = favorites;
65     }
66 
67     public String getIntroduce() {
68         return introduce;
69     }
70 
71     public void setIntroduce(String introduce) {
72         this.introduce = introduce;
73     }
74 
75     public boolean isFlag() {
76         return flag;
77     }
78 
79     public void setFlag(boolean flag) {
80         this.flag = flag;
81     }
82 
83 }

使用者實體entity.Users.java




 1 <%@ page language="java" import="java.util.*" contentType="text/html;charset=utf-8"%>
 2 
 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 4 <html>
 5   <head>
 6     <title>使用者註冊</title>
 7      <style type="text/css">
 8      .label{
 9           width: 20%    
10      }
11      .controler{
12           width: 80%    
13      }
14      </style>  
15      <script type="text/javascript" src="js/Calendar3.js"></script>
16   </head>
17   
18   <body>
19        <h1>使用者註冊</h1>
20     <hr>
21     <form name="regForm" action="servlet/RegServlet" method="post" >
22               <table border="0" width="800" cellspacing="0" cellpadding="0">
23                 <tr>
24                     <td class="lalel">使用者名稱:</td>
25                     <td class="controler"><input type="text" name="username" /></td>
26                 </tr>
27                 <tr>
28                     <td class="label">密碼:</td>
29                     <td class="controler"><input type="password" name="password" ></td>
30                     
31                 </tr>
32                 <tr>
33                     <td class="label">確認密碼:</td>
34                     <td class="controler"><input type="password" name="confirmpass" ></td>
35                     
36                 </tr>
37                 <tr>
38                     <td class="label">電子郵箱:</td>
39                     <td class="controler"><input type="text" name="email" ></td