JavaEE(四) Servlet基礎

目錄

 

1. Servlet介紹

2. Servlet功能

3. Servlet容器

4. Servlet編寫、部署運行

5. Servlet的生命週期

6. servlet的其他方法


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功能

  1. 讀取客戶程序發送來的顯式數據(表單數據)
  2. 讀取客戶程序發送來的隱式數據(請求報頭)
  3. 生成相應的結果
  4. 發送顯式的數據給客戶程序(HTML
  5. 發送隱式的數據給客戶程序(狀態代碼和響應報頭)

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容器負責管理

三個階段涉及的方法

  1. Init()
  2. service()   doPost()和doGet()
  3. 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、信息安全等相關知識哦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章