什么是Servlet绘迁?
Servlet 是 Java web 開發(fā)的基石棘催,是與平臺無關(guān)的服務(wù)器組件穆刻,它是運(yùn)行在 Servlet 容器/web 應(yīng)用服務(wù)器(Tomcat是其中一種具體的實現(xiàn)形式)始花,負(fù)責(zé)與客戶端進(jìn)行通信亲轨。
Servlet 的功能
- 創(chuàng)建并返回基于客戶請求的動態(tài)HTML頁面(客服發(fā)送請求到 Servlet , Servlet 按照請求結(jié)果給出特定的 HTML 界面趋惨,比如正確的界面或者有錯誤的界面,同時可以更新界面上的數(shù)據(jù)等)惦蚊。
- 與數(shù)據(jù)庫進(jìn)行通信器虾。
如何使用 Servlet ?
Servlet 本身是 javax 包提供的一組接口讯嫂,自定義一個類,讓這個類實現(xiàn) Servlet 接口兆沙,這個類就具備了接收客戶端請求及作出響應(yīng)的功能欧芽。
Step 1:
編寫一個類,實現(xiàn) javax.servlet.Servlet 接口(如果沒有這個類葛圃,需要把 Tomcat library 引入千扔,有 jsp-api。jar 和 servlet-api.jar 兩個 jar 包)库正,然后復(fù)寫五個方法曲楚。主要業(yè)務(wù)代碼是寫在 servlet() 方法中。
package com.xn.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//最核心方法褥符,業(yè)務(wù)邏輯寫在這里
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
Step 2:
網(wǎng)頁中輸入主機(jī)號(默認(rèn)是localhost)端口號加資源地址按理說是可以訪問到 Servlet 類的龙誊,但是由于瀏覽器權(quán)限等限制,這個是不允許的喷楣,瀏覽器只能訪問到 web 包下的根目錄的那些 .jsp 文件趟大,想訪問到 src 包下的 Servlet 實現(xiàn)類,需要在通過映射的方式間接訪問铣焊,同時映射需要開發(fā)者手動配置护昧,有兩種配置方式:
- 基于web/WEB-INF/web.xml 文件中做出映射 。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.xn.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
</web-app>
其中映射是靠 servlet-name 實現(xiàn)粗截,servlet-class 是需要映射的 Servlet 實現(xiàn)類的相對路徑,url-pattern 是在訪問時捣炬,跟在端口號后面的資源訪問路徑熊昌。
- 基于注解的方式(推薦)
直接在 Servlet 類上加上@WebServlet
注解,同時將 url 補(bǔ)充湿酸,最終效果與方法1完全一樣婿屹。
~~~
@WebServlet("/myservlet")
public class MyServlet implements Servlet {
}
~~~
有了以上的映射,那在啟動 tomcat 以后推溃,在瀏覽器里鍵入
http://localhost:端口號/myservlet
昂利,
就可以訪問到Servlet 實現(xiàn)類了(此時瀏覽器界面是空白的但是不會報錯),如果在 service 方法中有其他操作铁坎,此時就會執(zhí)行蜂奸。
之所以是空白界面,是因為以上操作硬萍,servlet 只是接收到了請求扩所,但是沒有做出響應(yīng)。簡單實現(xiàn)一個響應(yīng):
瀏覽器輸入:
http://localhost:端口號/myservlet?id=10086
~~~
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//最核心方法朴乖,業(yè)務(wù)邏輯寫在這里
System.out.println("接收到客服端的請求");
String id = servletRequest.getParameter("id");
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write("客戶端已接收到 id 為 " + id + "的請求");
}
~~~
此時重新啟動祖屏,鍵入上面的地址助赞,此時界面上會顯示出
客戶端已接收到 id 為 10086的請求
的中文文字信息。
Servlet 的生命周期
- 當(dāng)瀏覽器訪問 Servlet 的時候袁勺,Tomcat 會查詢當(dāng)前 Servlet 的實例化是否存在雹食,如果不存在,則通過反射機(jī)制動態(tài)創(chuàng)建對象期丰,如果存在群叶,直接執(zhí)行第3步。
- 調(diào)用 init 方法完成初始化操作(生命周期中只會調(diào)用一次咐汞,瀏覽器刷新的時候盖呼,不走這個方法)
- 調(diào)用 service 方法完成業(yè)務(wù)邏輯操作。
- 關(guān)閉 Tomcat 時化撕,會調(diào)用 destroy 方法几晤,釋放當(dāng)前對象所占用的資源。
Servlet 的生命周期方法:無參構(gòu)造方法植阴、inti璧针、service、destroy
- 無參構(gòu)造方法只調(diào)用一次狮荔,創(chuàng)建對象伐脖。
- inti只調(diào)用一次,初始化對象喷鸽。
- service 調(diào)用 N 次众雷,執(zhí)行業(yè)務(wù)方法。
- destroy 只調(diào)用一次做祝,卸載對象砾省。