国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

谷哥的小弟學后臺(09)——Servlet(1)

2019-11-09 18:58:12
字體:
來源:轉載
供稿:網友

探索Android軟鍵盤的疑難雜癥 深入探討Android異步精髓Handler 詳解Android主流框架不可或缺的基石 站在源碼的肩膀上全解Scroller工作機制


Android多分辨率適配框架(1)— 核心基礎 Android多分辨率適配框架(2)— 原理剖析 Android多分辨率適配框架(3)— 使用指南


自定義View系列教程00–推翻自己和過往,重學自定義View 自定義View系列教程01–常用工具介紹 自定義View系列教程02–onMeasure源碼詳盡分析 自定義View系列教程03–onLayout源碼詳盡分析 自定義View系列教程04–Draw源碼分析及其實踐 自定義View系列教程05–示例分析 自定義View系列教程06–詳解View的Touch事件處理 自定義View系列教程07–詳解ViewGroup分發Touch事件 自定義View系列教程08–滑動沖突的產生及其處理


版權聲明

本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl

Servlet簡介

Servlet由Sun公司研發,它是一種運行在Web服務器中的小型java程序。 Servlet通常通過HTTP接收和響應來自Web客戶端的請求。簡單地說:Servlet是服務器端的小應用程序。其實,關于Servlet的作用,我們只看它的名字也能知曉一些端倪—let后綴表示”小”的含義;比如:booklet表示小冊子,townlet表示小鎮,lakelet表示小湖……server表示服務器;所以把-let后綴與server融合在一起就是Servlet表示服務端的小程序。嗯哼,這么說是不是就更形象和便于理解呢?


Servlet之Hello World

開發一個Servlet非常的簡單,只需三個步驟:

編寫一個Java類實現servlet接口修改web.xml配置文件將開發好的Java類部署至web服務器

嗯哼,我們就按照這個步驟來寫個簡單的示例。

package cn.com;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */public class TestServlet implements Servlet { @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.在此,定義一個類實現了Servlet接口并重寫其service( )方法。

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>testServlet</servlet-name> <servlet-class>cn.com.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>testServlet</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.
jsp</welcome-file> </welcome-file-list></web-app>

在WEB-INF目錄下建立配置文件web.xml,內容如上所示。

由于客戶端是通過URL地址訪問服務器中的資源,若Servlet程序想被外界訪問則必須把servlet程序映射到一個URL地址上,這個工作在正是在web.xml文件中配置完成的,詳解如下所示:

<servlet>用于注冊Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,它們分別用于配置Servlet的注冊名稱和Servlet的完整類名;請參見代碼第9-12行

<servlet-mapping>用于映射已注冊Servlet的對外訪問路徑,它包含兩個子元素:<servlet-name>和<url-pattern>,它們分別用于指定Servlet的注冊名稱和Servlet的對外訪問路徑;請參見代碼第15-18行

在完成這些工作,我們就可以將應用部署到Tomcat了。待程序啟動,在瀏覽器中輸入:

http://localhost:8081/TestServlet01/helloServlet

此時,控制臺輸出Hello Servlet。嗯哼,部署Servlet到服務端并可被外界訪問的小示例就完成了。


Servlet的生命周期

Servlet不能獨立運行,它的運行完全由Servlet引擎來控制和調度。

通常情況下,針對客戶端的多次Servlet請求,服務器只會創建一個Servlet實例對象且將其駐留在內存中為后續的其它請求服務,直至web容器退出Servlet實例對象才會被銷毀。

所以,可將Servlet的生命周期概括為這么幾個階段:實例化,初始化,服務,銷毀這幾個階段。

請看如下代碼:

package cn.com;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */public class TestServlet implements Servlet { public TestServlet( ) { System.out.println("TestServlet( )"); } @Override public void init(ServletConfig arg0) throws ServletException { System.out.println("init( )"); } @Override public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("service( )"); } @Override public void destroy() { System.out.println("destroy( )"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { return null; }}

現在,結合這個示例一起分析Servlet的生命周期: 所以,可將Servlet的生命周期概括為這么幾個階段:實例化,初始化,服務,銷毀這幾個階段。 代碼解析如下:

Servlet的實例化,請參照代碼第15-17行 在該過程中調用Servlet的構造方法Servlet的初始化,請參照代碼第19-22行 在該過程中會調用Servlet的init( )方法Servlet的服務,請參照代碼第25-28行 在該過程中會調用Servlet的service( )方法Servlet的銷毀,請參照代碼第30-33行 在該過程中會調用Servlet的destroy( )方法

在Servlet的整個生命周期內,Servlet的構造方法和init()方法只會被調用一次;同理Servlet的destroy()也只執行一次。但對于客戶端的每次訪問都會導致Servlet引擎調用一次servlet的service()方法。


Servlet的實現方式

常見的Servlet實現方式有三種:實現Servlet接口、繼承GenericServlet、繼承HttpServlet。現在分別介紹如下所示:

Servlet的第一種實現方式:實現Servlet接口

在該方式下,需要根據業務實現Servlet接口提供的方法,尤其是service( )方法。詳情請參照剛才的示例,不再贅述。

Servlet的第二種實現方式:繼承GenericServlet

GenericServlet實現了Servlet接口和ServletConfig接口。GenericServlet提供了生命周期方法init()和destroy()以及ServletConfig接口中的方法的簡單版本,所以它使編寫 Servlet變得更容易。故,若繼承GenericServlet一般情況下我們只需重寫service()方法即可。

Servlet的第三種實現方式:繼承HttpServlet

HttpServlet繼承自GenericServlet且實現了Servlet接口和ServletConfig接口。HttpServlet在實現Servlet接口時,覆寫了service()方法,該方法會自動判斷用戶的請求方式,若為GET請求則調用HttpServlet的doGet()方法,若為Post請求則調用doPost()方法,諸如此類。因此,開發人員在編寫Servlet時,通常只需要覆寫doGet()或doPost()方法而不用覆寫service方法()。故,在實際開發中編寫Servlet時,通常情況下,應繼承HttpServlet而避免直接去實現Servlet接口。

請看如下示例:

package cn.com;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */public class TestHttpServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("---> doGet()"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("---> doPost()"); }}

在該示例中TestHttpServlet繼承自HttpServlet,且覆寫了doGet()和doPost()方法。當有Get或者Post的請求到達時就會調用doGet()或者doPost()。

當然,這三種方式都需要都需要我們在web.xml里面配置Servlet。在之前我們已經介紹了Servlet簡單的配置,在此再補充一些細節。

同一個Servlet可以被映射到多個路徑上,即多個<servlet-mapping>元素的<servlet-name>的設置值可以是同一個Servlet的注冊名。可用*.擴展名的形式配置url-pattern,其中*表示任意字符串;比如配置<url-pattern>*.do</url-pattern>時可用任意字符串.do組成的url訪問該Servlet可用/*配置url-pattern,其中*表示任意字符串;比如配置<url-pattern>/*</url-pattern>時可用/任意字符串組成的url訪問該Servlet。

ServletConfig

在Servlet的配置文件web.xml中可使用<init-param>為Servlet配置初始化參數。當servlet配置了初始化參數后Web容器在創建Servlet實例對象時會自動將這些初始化參數封裝到ServletConfig對象中并在調用servlet的init()方法時將ServletConfig對象傳遞給servlet。所以,可通過ServletConfig對象得到當前Servlet的初始化參數信息。

請看如下web.xml配置信息:

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>testServlet</servlet-name> <servlet-class>cn.com.TestServlet</servlet-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>testServlet</servlet-name> <url-pattern>/helloServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list></web-app>

在此web.xml配置了編碼方式(encoding)為UTF-8

/** * 本文作者:谷哥的小弟 * 博客地址:http://blog.csdn.net/lfdfhl */public class TestServlet implements Servlet { private ServletConfig mServletConfig; public TestServlet( ) { } @Override public void init(ServletConfig servletConfig) throws ServletException { mServletConfig=servletConfig; String encoding=mServletConfig.getInitParameter("encoding"); System.out.println("---> encoding="+encoding); }}

在該Servlet中可從init()方法的輸入參數中獲取到ServletConfig再利用其getInitParameter()方法獲取配置信息即可。

GenericServlet實現了Servlet接口和ServletConfig接口,所以在GenericServlet中利用:

this.getServletConfig().getInitParameter(“encoding”);

或者

this.getInitParameter(“encoding”);

這兩種方式獲取配置信息。


ServletContext

WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象,它代表當前web應用。在此介紹ServletContext幾種常用的應用。

利用ServletContext實現多個Servlet共享數據

public void setAttribute(String name, Object object)

利用setAttribute()方法保存數據

public Object getAttribute(String name)

利用getAttribute()方法獲取數據

public void removeAttribute(String name)

利用removeAttribute()方法移除數據

利用ServletContext獲取全局配置信息

<context-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value></context-param>

在web.xml中配置如上全局信息

ServletContext servletContext=mServletConfig.getServletContext();String encoding=servletContext.getInitParameter("encoding");

在Servlet可通過ServletContext獲取全局配置信息

利用ServletContext獲取獲取資源路徑

public String getRealPath(String path)

可使用ServletContext的getRealPath(path)方法獲取到當前應用任何位置的任何資源,其中參數path路徑一般以/WEB-INF開頭,斜杠/就表示了當前應用。為什么斜杠/后就是WEB-INF呢?其實之前我們也提到了:應用部署后所有的東西都在WEB-INF路徑下。我們也可以打開……tomcat/webapps/應用名/WEB-INF/即可看到與應用有關的所有資源。

現在我們在src的根目錄下建立test.properties文件,在該文件中只寫入一行簡單的測試數據:

username=xiaozemaliya

現在,我們在Servlet中獲取該username,如下所示:

mServletConfig=servletConfig;ServletContext servletContext=mServletConfig.getServletContext();String path=servletContext.getRealPath("/WEB-INF/classes/test.properties");Properties properties=new Properties();properties.load(new FileInputStream(path));String name=(String) properties.getProperty("username");

在此,再次提醒:src中的代碼編譯后的class文件存放于……tomcat/webapps/應用名/WEB-INF/classes文件夾中。

利用ServletContext實現Servlet的轉發

mServletConfig=servletConfig;ServletContext servletContext=mServletConfig.getServletContext();RequestDispatcher requestDispatcher=servletContext.getRequestDispatcher(path);requestDispatcher.forward(request, response);

關于Servlet的轉發,在此僅僅作一個非常簡單的引入,我們會在后續的學習中進一步介紹。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 庆元县| 鄯善县| 嵊泗县| 平定县| 佛山市| 临沭县| 高碑店市| 上饶县| 屯门区| 广德县| 武冈市| 内江市| 尼勒克县| 长宁区| 徐闻县| 石棉县| 田东县| 潼南县| 镇巴县| 陆川县| 烟台市| 长岭县| 玛沁县| 萍乡市| 合水县| 厦门市| 申扎县| 当涂县| 昆山市| 大石桥市| 浪卡子县| 吉木乃县| 中西区| 石阡县| 临高县| 和龙市| 抚宁县| 五指山市| 兴和县| 垦利县| 文昌市|