日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

【Java】Servlet原理

發(fā)布時間:2023/12/14 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】Servlet原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.什么是Servlet

Servlet是JavaWeb三大組件之一(Listener / Filter),屬于動態(tài)資源,服務(wù)器將收到的請求交給Servlet處理

?

Servlet需要做的事:

>>接收請求數(shù)據(jù)

>>處理請求

>>完成響應(yīng)

?

編寫一個Servlet需要兩步:

**編寫Servlet類

**在web.xml文件中配置Servlet(在Servlet3.0之后用注解實現(xiàn))

?

編寫Servlet需要我們實現(xiàn)javax.servlet.Servlet接口

public interface Servlet{ public void init(ServletConfig config) throws ServletException; public ServletConfig getServletConfig(); public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException; public String getServletInfo(); public void destroy(); }

接口中有3個生命周期方法:(在Servlet出生、服務(wù)、死亡的狀態(tài)分別調(diào)用對應(yīng)方法

void init(ServletConfig);//Servlet是在第一次被訪問時由服務(wù)器創(chuàng)建的

void service(ServletRequest,ServletResponse); //接收到一次請求 就調(diào)用service()一次

void destroy();??//通常在服務(wù)器被關(guān)閉時,服務(wù)器會去銷毀Servlet,在銷毀Servlet之前服務(wù)器會先去調(diào)用Servlet的destroy()方法

?

剩下兩個方法:

getSevletConfig:ServletConfig對象對應(yīng)web.xml文件(Sevlet3.0之前所需的配置文件)中的<servlet>元素。

該對象用來返回初始化參數(shù)和 ServletContext

例如你想獲取當(dāng)前Servlet在web.xml文件中的配置名,那么可以使用servletConfig.getServletName()方法獲取

getServletInfo:該方法用于返回Servlet的描述信息,這些信息可以是Servlet的作者,版本、版權(quán)信息等。

默認(rèn)情況下,這個方法返回空串。開發(fā)人員可以覆蓋這個方法來返回有意義的信息

?

2.GenericServlet

GenericServlet.java

public abstract class GenericServlet implements Servlet, ServletConfig,java.io.Serializable {private static final long serialVersionUID = 1L;private transient ServletConfig config;public GenericServlet() {}@Overridepublic void destroy() {}@Overridepublic String getInitParameter(String name) {return getServletConfig().getInitParameter(name);}@Overridepublic Enumeration<String> getInitParameterNames() {return getServletConfig().getInitParameterNames();}@Overridepublic ServletConfig getServletConfig() {return config;}@Overridepublic ServletContext getServletContext() {return getServletConfig().getServletContext();}@Overridepublic String getServletInfo() {return "";}@Overridepublic void init(ServletConfig config) throws ServletException {this.config = config;this.init();}public void init() throws ServletException {}public void log(String msg) {getServletContext().log(getServletName() + ": " + msg);}public void log(String message, Throwable t) {getServletContext().log(getServletName() + ": " + message, t);}@Overridepublic abstract void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;@Overridepublic String getServletName() {return config.getServletName();} }

**GenericServlet的init()方法

在GenericServlet中,定義了一個ServletConfig config實例變量,并在init(ServletConfig)方法中把參數(shù)ServletConfig賦給了實例變量。然后在該類的很多方法中使用了實例變量config。

如果子類覆蓋了GenericServlet的init(StringConfig)方法,那么this.config=config這一條語句就會被覆蓋了,也就是說GenericServlet的實例變量config的值為null,那么所有依賴config的方法都不能使用了。如果真的希望完成一些初始化操作,那么去覆蓋GenericServlet提供的init()方法,它是沒有參數(shù)的init()方法,它會在init(ServletConfig)方法中被調(diào)用。

?

**實現(xiàn)了ServletConfig接口

GenericServlet還實現(xiàn)了ServletConfig接口,所以可以直接調(diào)用getInitParameter()、getServletContext()等ServletConfig的方法。

3.HttpServlet

HttpServlet類是GenericServlet的子類,它提供了對HTTP請求的特殊支持,

所以通常我們都會通過繼承HttpServlet來完成自定義的Servlet

HttpServlet類中提供了service(HttpServletRequest,HttpServletResponse)方法,這個方法是HttpServlet自己的方法,不是從Servlet繼承來的。

在繼承得來的service(..)方法中會把ServletRequest和ServletResponse強轉(zhuǎn)成HttpServletRequest和HttpServletResponse,

然后調(diào)用service(HttpServletRequest,HttpServletResponse)方法,

這說明子類可以去覆蓋service(HttpServletRequest,HttpServletResponse)方法即可,

這就不用自己去強轉(zhuǎn)請求和響應(yīng)對象了

其實子類也不用去覆蓋service(HttpServletRequest,HttpServletResponse)方法,

因為HttpServlet還要做另一步簡化操作(doGet() / doPost())

@Overridepublic void service(ServletRequest req, ServletResponse res)throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;try {request = (HttpServletRequest) req;response = (HttpServletResponse) res;} catch (ClassCastException e) {throw new ServletException("non-HTTP request or response");}service(request, response); }

在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法會去判斷當(dāng)前請求是GET還是POST

(判斷方法:request.getMethod()可以來獲取當(dāng)前請求的類型),

如果是GET請求,那么會去調(diào)用本類的doGet()方法,

如果是POST請求會去調(diào)用doPost()方法,這說明我們在子類中去覆蓋doGet()或doPost()方法即可。

?

public class AServlet extends HttpServlet {

??? public void doGet(HttpServletRequest request, HttpServletResponse response)

?????????? throws ServletException, IOException {

?????? System.out.println("hello doGet()...");

??? }

}

public class BServlet extends HttpServlet {

??? public void doPost(HttpServletRequest request, HttpServletResponse response)

?????????? throws ServletException, IOException {

?????? System.out.println("hello doPost()...");

??? }

}

總結(jié)

以上是生活随笔為你收集整理的【Java】Servlet原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。