Servlet基礎 及詳細介紹(附帶程式碼)
阿新 • • 發佈:2019-01-02
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; 4import 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