按钮不通过表单连接servlet_JavaWeb之Servlet(一)
1.Servlet概述
Servlet 為創(chuàng)建基于 web 的應(yīng)用程序提供了基于組件、獨(dú)立于平臺(tái)的方法,可以不受 CGI 程序的性能限制。Servlet 有權(quán)限訪問(wèn)所有的 Java API,包括訪問(wèn)企業(yè)級(jí)數(shù)據(jù)庫(kù)的 JDBC API。Servlet(Server Applet)是Java Servlet的簡(jiǎn)稱,稱為小服務(wù)程序或服務(wù)連接器,用Java編寫的服務(wù)器端程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容。狹義的Servlet是指Java語(yǔ)言實(shí)現(xiàn)的一個(gè)接口,廣義的Servlet是指任何實(shí)現(xiàn)了這個(gè)Servlet接口的類,一般情況下,人們將Servlet理解為后者。Servlet運(yùn)行于支持Java的應(yīng)用服務(wù)器中。從原理上講,Servlet可以響應(yīng)任何類型的請(qǐng)求,但絕大多數(shù)情況下Servlet只用來(lái)擴(kuò)展基于HTTP協(xié)議的Web服務(wù)器。
Java Servlet 是運(yùn)行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來(lái)自 Web 瀏覽器或其他 HTTP 客戶端的請(qǐng)求和 HTTP 服務(wù)器上的數(shù)據(jù)庫(kù)或應(yīng)用程序之間的中間層。使用 Servlet,您可以收集來(lái)自網(wǎng)頁(yè)表單的用戶輸入,呈現(xiàn)來(lái)自數(shù)據(jù)庫(kù)或者其他源的記錄,還可以動(dòng)態(tài)創(chuàng)建網(wǎng)頁(yè)。Java Servlet 通常情況下與使用 CGI(Common Gateway Interface,公共網(wǎng)關(guān)接口)實(shí)現(xiàn)的程序可以達(dá)到異曲同工的效果。但是相比于 CGI,Servlet 有以下幾點(diǎn)優(yōu)勢(shì):
性能明顯更好。
Servlet在Web服務(wù)器的地址空間內(nèi)執(zhí)行。這樣它就沒有必要再創(chuàng)建一個(gè)單獨(dú)的進(jìn)程來(lái)處理每個(gè)客戶端請(qǐng)求。
Servlet是獨(dú)立于平臺(tái)的,因?yàn)樗鼈兪怯肑ava編寫的
服務(wù)器上的Java安全管理器執(zhí)行了一些列限制,以保護(hù)服務(wù)器計(jì)算機(jī)上的資源。因此,Servlet是可信的。
Java類庫(kù)的全部功能對(duì)Servlet來(lái)說(shuō)都是可用的。它可以通過(guò)socket和RMI機(jī)制與applets、數(shù)據(jù)庫(kù)或其它軟件進(jìn)行交互。
2.Servlet架構(gòu)
3.Servlet任務(wù)
Servlet 執(zhí)行以下主要任務(wù):
讀取客戶端(瀏覽器)發(fā)送的顯式的數(shù)據(jù)。這包括網(wǎng)頁(yè)上的 HTML 表單,或者也可以是來(lái)自 applet 或自定義的 HTTP 客戶端程序的表單。
讀取客戶端(瀏覽器)發(fā)送的隱式的 HTTP 請(qǐng)求數(shù)據(jù)。這包括 cookies、媒體類型和瀏覽器能理解的壓縮格式等等。
處理數(shù)據(jù)并生成結(jié)果。這個(gè)過(guò)程可能需要訪問(wèn)數(shù)據(jù)庫(kù),執(zhí)行 RMI 或 CORBA 調(diào)用,調(diào)用 Web 服務(wù),或者直接計(jì)算得出對(duì)應(yīng)的響應(yīng)。
發(fā)送顯式的數(shù)據(jù)(即文檔)到客戶端(瀏覽器)。該文檔的格式可以是多種多樣的,包括文本文件(HTML 或 XML)、二進(jìn)制文件(GIF 圖像)、Excel 等。
發(fā)送隱式的 HTTP 響應(yīng)到客戶端(瀏覽器)。這包括告訴瀏覽器或其他客戶端被返回的文檔類型(例如 HTML),設(shè)置 cookies 和緩存參數(shù),以及其他類似的任務(wù)。
4.Servlet包
Java Servlet 是運(yùn)行在帶有支持 Java Servlet 規(guī)范的解釋器的 web 服務(wù)器上的 Java 類。Servlet 可以使用 javax.servlet 和 javax.servlet.http 包創(chuàng)建,它是 Java 企業(yè)版的標(biāo)準(zhǔn)組成部分,Java 企業(yè)版是支持大型開發(fā)項(xiàng)目的 Java 類庫(kù)的擴(kuò)展版本。這些類實(shí)現(xiàn) Java Servlet 和 JSP 規(guī)范。Java Servlet 就像任何其他的 Java 類一樣已經(jīng)被創(chuàng)建和編譯。在您安裝 Servlet 包并把它們添加到您的計(jì)算機(jī)上的 Classpath 類路徑中之后,您就可以通過(guò) JDK 的 Java 編譯器或任何其他編譯器來(lái)編譯 Servlet。
5.Servlet生命周期
Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個(gè)過(guò)程。以下是 Servlet 遵循的過(guò)程:
Servlet 初始化后調(diào)用 init () 方法。
Servlet 調(diào)用 service() 方法來(lái)處理客戶端的請(qǐng)求。
Servlet 銷毀前調(diào)用 destroy() 方法。
最后,Servlet 是由 JVM 的垃圾回收器進(jìn)行垃圾回收的。
現(xiàn)在讓我們?cè)敿?xì)討論生命周期的方法。
init 方法被設(shè)計(jì)成只調(diào)用一次。它在第一次創(chuàng)建 Servlet 時(shí)被調(diào)用,在后續(xù)每次用戶請(qǐng)求時(shí)不再調(diào)用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一樣。Servlet 創(chuàng)建于用戶第一次調(diào)用對(duì)應(yīng)于該 Servlet 的 URL 時(shí),但是您也可以指定 Servlet 在服務(wù)器第一次啟動(dòng)時(shí)被加載。當(dāng)用戶調(diào)用一個(gè) Servlet 時(shí),就會(huì)創(chuàng)建一個(gè) Servlet 實(shí)例,每一個(gè)用戶請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的線程,適當(dāng)?shù)臅r(shí)候移交給 doGet 或 doPost 方法。init() 方法簡(jiǎn)單地創(chuàng)建或加載一些數(shù)據(jù),這些數(shù)據(jù)將被用于 Servlet 的整個(gè)生命周期。
public void init() throws ServletException { ?// 初始化代碼...}service() 方法是執(zhí)行實(shí)際任務(wù)的主要方法。Servlet 容器(即 Web 服務(wù)器)調(diào)用 service() 方法來(lái)處理來(lái)自客戶端(瀏覽器)的請(qǐng)求,并把格式化的響應(yīng)寫回給客戶端。每次服務(wù)器接收到一個(gè) Servlet 請(qǐng)求時(shí),服務(wù)器會(huì)產(chǎn)生一個(gè)新的線程并調(diào)用服務(wù)。service() 方法檢查 HTTP 請(qǐng)求類型(GET、POST、PUT、DELETE 等),并在適當(dāng)?shù)臅r(shí)候調(diào)用 doGet、doPost、doPut,doDelete 等方法。
public void service(ServletRequest request, ? ? ? ? ? ? ? ? ? ?ServletResponse response) ? ? ?throws ServletException, IOException{}service() 方法由容器調(diào)用,service 方法在適當(dāng)?shù)臅r(shí)候調(diào)用 doGet、doPost、doPut、doDelete 等方法。所以,您不用對(duì) service() 方法做任何動(dòng)作,您只需要根據(jù)來(lái)自客戶端的請(qǐng)求類型來(lái)重寫 doGet() 或 doPost() 即可。doGet() 和 doPost() 方法是每次服務(wù)請(qǐng)求中最常用的方法。
GET 請(qǐng)求來(lái)自于一個(gè) URL 的正常請(qǐng)求,或者來(lái)自于一個(gè)未指定 METHOD 的 HTML 表單,它由 doGet() 方法處理。
public void doGet(HttpServletRequest request, ? ? ? ? ? ? ? ? ?HttpServletResponse response) ? ?throws ServletException, IOException { ? ?// Servlet 代碼}POST 請(qǐng)求來(lái)自于一個(gè)特別指定了 METHOD 為 POST 的 HTML 表單,它由 doPost() 方法處理。
public void doPost(HttpServletRequest request, ? ? ? ? ? ? ? ? ? HttpServletResponse response) ? ?throws ServletException, IOException { ? ?// Servlet 代碼}destroy() 方法只會(huì)被調(diào)用一次,在 Servlet 生命周期結(jié)束時(shí)被調(diào)用。destroy() 方法可以讓您的 Servlet 關(guān)閉數(shù)據(jù)庫(kù)連接、停止后臺(tái)線程、把 Cookie 列表或點(diǎn)擊計(jì)數(shù)器寫入到磁盤,并執(zhí)行其他類似的清理活動(dòng)。在調(diào)用 destroy() 方法之后,servlet 對(duì)象被標(biāo)記為垃圾回收。
public void destroy() { ? ?// 終止化代碼... }上圖顯示了一個(gè)典型的 Servlet 生命周期方案。
第一個(gè)到達(dá)服務(wù)器的 HTTP 請(qǐng)求被委派到 Servlet 容器。
Servlet 容器在調(diào)用 service() 方法之前加載 Servlet。
然后 Servlet 容器處理由多個(gè)線程產(chǎn)生的多個(gè)請(qǐng)求,每個(gè)線程執(zhí)行一個(gè)單一的 Servlet 實(shí)例的 service() 方法。
6.Servlet代碼演示
Servlet 是服務(wù) HTTP 請(qǐng)求并實(shí)現(xiàn) javax.servlet.Servlet 接口的 Java 類。Web 應(yīng)用程序開發(fā)人員通常編寫 Servlet 來(lái)擴(kuò)展 javax.servlet.http.HttpServlet,并實(shí)現(xiàn) Servlet 接口的抽象類專門用來(lái)處理 HTTP 請(qǐng)求。
package com.wyz.servlet.demo1;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class HelloServlet implements Servlet{ @Override public void destroy() {} @Override public ServletConfig getServletConfig() { return null;} @Override public String getServletInfo() { return null;} @Override public void init(ServletConfig arg0) throws ServletException {} //用來(lái)處理客戶的請(qǐng)求,并且對(duì)請(qǐng)求作出響應(yīng)的方法 @Override public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { //向頁(yè)面輸出一個(gè)HelloServlet字符串 resp.getWriter().println("HelloServlet");}}在web.xml中配置相關(guān)信息:
<servlet> ? ?<servlet-name>HelloServletservlet-name> ? ?<servlet-class>com.wyz.servlet.demo1.HelloServletservlet-class> ?servlet> ?<servlet-mapping> ? ?<servlet-name>HelloServletservlet-name> ? ?<url-pattern>/hellourl-pattern> ?servlet-mapping>在Tomcat中啟動(dòng)項(xiàng)目,運(yùn)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的按钮不通过表单连接servlet_JavaWeb之Servlet(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么用odbc连接mysql数据库连接_
- 下一篇: linux安装多个mysql数据库_li