目錄
1. Servlet介紹
Servlet是一種服務器端的Java應用程序,具有獨立於平臺和協議的特性,可以生成動態的Web頁面。 它擔當客戶請求(Web瀏覽器或其他HTTP客戶程序)與服務器響應(HTTP服務器上的數據庫或應用程序)的中間層。
Servlet是位於Web 服務器內部的服務器端的Java應用程序,與傳統的從命令行啓動的Java應用程序不同,Servlet由Web服務器進行加載,該Web服務器必須包含支持Servlet的Java虛擬機。
參考菜鳥教程,Servlet 有以下幾點優勢:
- 性能明顯更好。
- Servlet 在 Web 服務器的地址空間內執行。這樣它就沒有必要再創建一個單獨的進程來處理每個客戶端請求。
- Servlet 是獨立於平臺的,因爲它們是用 Java 編寫的。
- 服務器上的 Java 安全管理器執行了一系列限制,以保護服務器計算機上的資源。因此,Servlet 是可信的。
- Java 類庫的全部功能對 Servlet 來說都是可用的。它可以通過 sockets 和 RMI 機制與 applets、數據庫或其他軟件進行交互。
2. Servlet功能
- 讀取客戶程序發送來的顯式數據(表單數據)
- 讀取客戶程序發送來的隱式數據(請求報頭)
- 生成相應的結果
- 發送顯式的數據給客戶程序(HTML)
- 發送隱式的數據給客戶程序(狀態代碼和響應報頭)
3. Servlet容器
Java Servlet是一個基於Java技術的Web組件,運行在服務器端,由Servlet容器所管理,用於生成動態的內容。Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet容器是Web服務器或應用程序服務器的一部分,用於在發送的請求和響應之上提供網絡服務,解碼基於MIME的請求,格式化基於MIME的響應。Servlet不能獨立運行,它必須被部署到Servlet容器中,由容器來實例化和調用Servlet的方法,Servlet容器在Servlet的生命週期內包容和管理Servlet。
servlet工作機制如下:
4. Servlet編寫、部署運行
創建一個Java動態工程項目
創建完成後應該是這個文件目錄
爲了方便添加配置,我們在生成一個web.xml文件
然後就可以創建servlet了,我這裏創建一個IndexServlet。
接下來部署servlet,在web,xml中添加如下語句:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>java_servlet_test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.chtw.servlet.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/servlet01</url-pattern>
</servlet-mapping>
</web-app>
講該項目運行在服務器上,訪問http://localhost:8080/java_servlet_test/servlet01
5. Servlet的生命週期
Servlet的生命週期由Servlet 服務器也就是servlet容器負責管理
三個階段涉及的方法
- Init()
- service() doPost()和doGet()
- destroy()
init()方法
Servlet第一次被訪問的時候,服務器構造Servlet實例時調用構造方法
執行 Servlet 初始化 – 創建或加載 Servlet 在處理請求時使用的對象
可以覆蓋 init(config)方法,添加其他初始化內容
service()方法
service()方法用於分析用戶的請求,根據用戶的請求類型;調用不同的處理方法; 如:doPost(),doGet()等
通常重寫的是doPost()或doGet方法,每次收到新的請求都會執行service方法
destroy()方法
Web服務器停止服務的時候卸載每一個web應用
卸載 Servlet 時,調用 destroy ( ) 方法
下面舉個列子,在IndexServlet中添加如下代碼
package com.chtw.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
int i = 0;
public IndexServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet運行成功了....");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
public void init() throws ServletException {
System.out.println("servlet實列創建");
}
@Override
public void destroy() {
System.out.println("servlet銷燬");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
i ++;
super.service(arg0, arg1);
System.out.println("訪問當前servlet第"+i+"次");
}
}
重新啓動服務器,訪問:http://localhost:8080/java_servlet_test/servlet01
刷新幾次頁面:
6. servlet的其他方法
getServletConfig() 獲取Servlet配置對象
getServletContext() 獲取Servlet上下文
getServletInfo() 獲取Servlet描述信息
getServletName() 返回一個servlet實例的名稱,該名稱由服務器管理員提供。
getServletContext() 返回一個ServletContext對象的引用。
getInitParameter() 返回一個由參數String name決定的初始化變量的值,如果該變量不存在,返回null。
getInitParameterNames() 返回一個存儲所有初始化變量的枚舉函數。如果servlet沒有初始化變量,返回一個空枚舉函數。
舉個例子:
package com.chtw.servlet;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.xml.internal.ws.api.policy.PolicyResolver.ServerContext;
/**
* index
* @author CHTW
*
*/
@WebServlet("/IndexServlet")
public class IndexServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
int i = 0;
public IndexServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletConfig conf = this.getServletConfig();
ServletContext context = conf.getServletContext();
System.out.println(context.getContextPath());
System.out.println("Servlet運行成功了....");
System.out.println("當前Servlet名稱:"+getServletName());
System.out.println("servlet信息:"+getServletInfo());
String name = conf.getInitParameter("name");
System.out.println("姓名:"+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
public void init() throws ServletException {
System.out.println("servlet實列創建");
}
@Override
public void destroy() {
System.out.println("servlet銷燬");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
i ++;
super.service(arg0, arg1);
System.out.println("訪問當前servlet第"+i+"次");
}
}
web.xml中配置一個名爲name的參數
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>java_servlet_test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>IndexServlet</servlet-name>
<servlet-class>com.chtw.servlet.IndexServlet</servlet-class>
<init-param>
<param-name>name</param-name>
<param-value>張山</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>IndexServlet</servlet-name>
<url-pattern>/servlet01</url-pattern>
</servlet-mapping>
</web-app>
啓動服務器刷新頁面:
本節類容到此結束,下節類容繼續講Java Servlet的其他高級用法。
本人聯繫方式2329095893,歡迎各位進行學習討論
歡迎關注熊熊出沒ING公衆號,不定時跟新Java、python、信息安全等相關知識哦。