Java Servlet詳解(註解配置+生命週期)
什麼是Servlet : (Server applet)?
顧名思義:服務端的小程式
Servlet只是一個介面,定義了Java被瀏覽器訪問到(Tomcat)的識別規則,我們需要定義一個類來實現Servlet介面
建立一個專案流程
1.建立一個JavaEE專案
2.定義一個類實習Servlet方法
3.實現介面中的抽象方法
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class Servlet implements javax.servlet.Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("訪問");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("關閉");
}
}
4.在WEB.XML中配置Servelt
<?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_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
結果
執行原理加圖解
1.當伺服器接受到伺服器請求的時候,會先解析瀏覽器的UPL地址,獲取訪問服務的路徑
2.然後查詢WEB.xml檔案,檢視是否有對應的
3.如果有,則找到對應的
4.tomcat會將位元組碼檔案載入進記憶體,並且建立其物件
5.呼叫其方法
Servlet的生命週期
1.被建立:執行init方法只執行一次
Servlet什麼時候建立?
預設情況:在第一次被訪問的時候建立
可以在配置執行Servlet的建立時機
在
- 第一次被訪問時,建立
的值為負數 - 在伺服器啟動時,建立
的值為0或正整數
注意
- Servlet的init方法,只執行一次,說明一個Servlet在記憶體中只存在一個物件,Servlet是單例的
- 多個使用者同時訪問時,可能存線上程安全問題。
- 解決:儘量不要在Servlet中定義成員變數。即使定義了成員變數,也不要對修改值
2. 提供服務:執行service方法,執行多次
* 每次訪問Servlet時,Service方法都會被呼叫一次。
3. 被銷燬:執行destroy方法,只執行一次
* Servlet被銷燬時執行。伺服器關閉時,Servlet被銷燬
* 只有伺服器正常關閉時,才會執行destroy方法。
* destroy方法在Servlet被銷燬之前執行,一般用於釋放資源
Servlet3.0
好處:支援註解配置,不需要使用web.xml了
步驟:
1. 建立JavaEE專案,選擇Servlet的版本3.0以上,可以不建立web.xml
2. 定義一個類,實現Servlet介面
3. 複寫方法
4. 在類上使用@WebServlet註解,進行配置
* @WebServlet("資源路徑")
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
String name() default "";//相當於<Servlet-name>
String[] value() default {};//代表urlPatterns()屬性配置
String[] urlPatterns() default {};//相當於<url-pattern>
int loadOnStartup() default -1;//相當於<load-on-startup>
WebInitParam[] initParams() default {};
boolean asyncSupported() default false;
String smallIcon() default "";
String largeIcon() default "";
String description() default "";
String displayName() default "";
}
程式碼
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/demo1")
public class Servlet implements javax.servlet.Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("訪問");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("關閉");
}
}
相比於之前更加簡潔,使用更加方便
IDEA中Tomcat的相關配置
1. IDEA會為每一個tomcat部署的專案單獨建立一份配置檔案
* 檢視控制檯的log:Using CATALINA_BASE: "C:\Users\86151.IntelliJIdea2017.3\system\tomcat\Tomcat_8_5_31_CSDNWeb"
地址來源
2. 工作空間專案和tomcat部署的web專案
* tomcat真正訪問的是“tomcat部署的web專案”,"tomcat部署的web專案"對應著"工作空間專案" 的web目錄下的所有資源
* WEB-INF目錄下的資源不能被瀏覽器直接訪問。
3. 斷點除錯:使用"小蟲子"啟動 dubug 啟動
Servlet的體系結構
GenericServlet:
將Servlet介面中其他的方法做了預設空實現,只將service()方法作為抽象
將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可
HttpServlet
對http協議的一種封裝,簡化操作
1. 定義類繼承HttpServlet
2. 複寫doGet/doPost方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
} catch (IllegalArgumentException var9) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
} else if (method.equals("HEAD")) {
lastModified = this.getLastModified(req);
this.maybeSetLastModified(resp, lastModified);
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
** Servlet相關配置**
1. urlpartten:Servlet訪問路徑
1. 一個Servlet可以定義多個訪問路徑 : @WebServlet({"/d4","/dd4","/ddd4"})
2. 路徑定義規則:
1. /xxx:路徑匹配
2. /xxx/xxx:多層路徑,目錄結構
3. *.do:副檔名匹配
以上就是Tomcat與Servlet的一些基礎知識,喜歡我的可以關注收藏,我會經常更新文章