【Java】Servlet原理
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021荣耀秋招笔试代码题
- 下一篇: Java的编码解码