## Web專題一:Servlet
[TOC]
> Servlet是用Java編寫的服務器端程序,運行于支持Java的Web應用服務器中,可以響應HTTP請求
### 1.1. Servlet生命周期

#### 1.1.1. init()方法
~~~
void init() throws ServletException
~~~
在Servlet第一次被創建時才會被調用,且只調用一次
#### 1.1.2. service()方法
~~~
void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
~~~
Servlet容器在這里處理請求,根據請求的方法調用相應的doGet等方法,且每個請求都會產生一個新的線程
#### 1.1.3. doGet()方法
~~~
void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
~~~
處理請求方法為GET的請求,更多request方法如下:
~~~
private static final String METHOD_DELETE = "DELETE";
private static final String METHOD_HEAD = "HEAD";
private static final String METHOD_GET = "GET";
private static final String METHOD_OPTIONS = "OPTIONS";
private static final String METHOD_POST = "POST";
private static final String METHOD_PUT = "PUT";
private static final String METHOD_TRACE = "TRACE";
~~~
#### 1.1.4. doDestory()方法
銷毀Servlet,只被調用一次
### 1.2. Servlet完整示例
#### 1.2.1. 創建Servlet類
定義`Servlet`方法有3種:
- 實現`Servlet`接口
- 繼承`GenericServlet`類
- 繼承`HttpServlet`類
~~~
package org.ibu;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.IOException;
import java.util.logging.Logger;
public class SearchServlet extends HttpServlet {
final Logger logger = Logger.getLogger(SearchServlet.class.getName());
@Override
public void init() throws ServletException
{
logger.info("Servlet::init()");
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
logger.info("Servlet::service()");
super.service(req, res);
}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
logger.info("Servlet::doGet()");
}
@Override
public void destroy()
{
logger.info("Servlet::destroy()");
}
}
~~~
#### 1.2.2. 配置Servlet
在`/WEB-INF/web.xml`添加Servlet配置,將URL映射到Servlet類,將`/SearchServlet`和`/search`映射到SearchServlet類上
~~~
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>SearchServlet</servlet-name>
<servlet-class>org.ibu.SearchServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SearchServlet</servlet-name>
<url-pattern>/SearchServlet</url-pattern>
<url-pattern>/search</url-pattern>
</servlet-mapping>
</web-app>
~~~
### 1.3. Servlet完整示例(注解方式)
#### 1.3.1. 創建Servlet類
~~~
package org.ibu;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.IOException;
import java.util.logging.Logger;
@WebServlet(name = "SearchServlet",
urlPatterns = {"/SearchServlet", "/search"})
public class SearchServlet extends HttpServlet {
final Logger logger = Logger.getLogger(SearchServlet.class.getName());
@Override
public void init() throws ServletException
{
logger.info("Servlet::init()");
}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
logger.info("Servlet::service()");
super.service(req, res);
}
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
logger.info("Servlet::doGet()");
}
@Override
public void destroy()
{
logger.info("Servlet::destroy()");
}
}
~~~
#### 1.3.2. 配置Servlet
`/WEB-INF/web.xml`無需配置Servlet
~~~
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_4_0.xsd"
version="4.0">
</web-app>
~~~
#### 1.3.3. 生命周期示例
1. startup啟動web服務器
2. 瀏覽器訪問[http://localhost:8080/SearchServlet](http://localhost:8080/SearchServlet)
3. 瀏覽器訪問[http://localhost:8080/search](http://localhost:8080/search)
4. shutdown停止Web服務器
日志信息輸出如下:
~~~
19-Apr-2020 11:19:49.521 信息 [http-nio-8080-exec-3] org.ibu.SearchServlet.init Servlet::init()
19-Apr-2020 11:19:49.522 信息 [http-nio-8080-exec-3] org.ibu.SearchServlet.service Servlet::service()
19-Apr-2020 11:19:49.523 信息 [http-nio-8080-exec-3] org.ibu.SearchServlet.doGet Servlet::doGet()
19-Apr-2020 11:20:14.163 信息 [http-nio-8080-exec-8] org.ibu.SearchServlet.service Servlet::service()
19-Apr-2020 11:20:14.163 信息 [http-nio-8080-exec-8] org.ibu.SearchServlet.doGet Servlet::doGet()
...
19-Apr-2020 11:20:20.506 信息 [localhost-startStop-2] org.ibu.SearchServlet.destroy Servlet::destroy()
~~~
- JavaCook
- Java專題零:類的繼承
- Java專題一:數據類型
- Java專題二:相等與比較
- Java專題三:集合
- Java專題四:異常
- Java專題五:遍歷與迭代
- Java專題六:運算符
- Java專題七:正則表達式
- Java專題八:泛型
- Java專題九:反射
- Java專題九(1):反射
- Java專題九(2):動態代理
- Java專題十:日期與時間
- Java專題十一:IO與NIO
- Java專題十一(1):IO
- Java專題十一(2):NIO
- Java專題十二:網絡
- Java專題十三:并發編程
- Java專題十三(1):線程與線程池
- Java專題十三(2):線程安全與同步
- Java專題十三(3):內存模型、volatile、ThreadLocal
- Java專題十四:JDBC
- Java專題十五:日志
- Java專題十六:定時任務
- Java專題十七:JavaMail
- Java專題十八:注解
- Java專題十九:淺拷貝與深拷貝
- Java專題二十:設計模式
- Java專題二十一:序列化與反序列化
- 附加專題一:MySQL
- MySQL專題零:簡介
- MySQL專題一:安裝與連接
- MySQL專題二:DDL與DML語法
- MySQL專題三:工作原理
- MySQL專題四:InnoDB存儲引擎
- MySQL專題五:sql優化
- MySQL專題六:數據類型
- 附加專題二:Mybatis
- Mybatis專題零:簡介
- Mybatis專題一:配置文件
- Mybatis專題二:映射文件
- Mybatis專題三:動態SQL
- Mybatis專題四:源碼解析
- 附加專題三:Web編程
- Web專題零:HTTP協議
- Web專題一:Servlet
- Web專題二:Cookie與Session
- 附加專題四:Redis
- Redis專題一:數據類型
- Redis專題二:事務
- Redis專題三:key的過期
- Redis專題四:消息隊列
- Redis專題五:持久化