網站首頁 編程語言 正文
一、什么是Servlet?
Servlet(Serve Applet)是Java Servlet的簡稱,用Java編寫的服務端端程序,具有獨立于平臺和協議的特性,主要功能在于交互式地瀏覽和生成數據,生成動態Web內容。Servlet 看起來像是通常的 Java 程序。Servlet 導入特定的屬于 Java Servlet API 的包。因為是對象字節碼,可動態地從網絡加載,可以說 Servlet 對 Server 就如同 Applet對 Client 一樣,但是,由于 Servlet 運行于 Server 中,它們并不需要一個。從這個角度講,Servlet 也被稱為 FacelessObject。一個 Servlet 就是 Java 編程語言中的一個類,它被用來擴展服務器的性能,服務器上駐留著可以通過“請求-響應”編程模型來訪問的應用程序。
二、Servlet的實現過程
1.客戶端發送請求到服務端;
2.服務端把請求傳給Servlet,Servlet處理請求并生成響應,然后將響應傳給服務端;
3.服務端把帶有動態數據的響應返回給客戶端。
有請求就一定會響應
三、Servlet的生命周期
1.實例化:Servlet容器創建Servlet的實例;
2.初始化:該容器調用init(ServletConfig)方法;
3.服務:如果請求Servlet,則容器調用service()方法;
4.銷毀:銷毀實例前一定會調用的destroy()方法;
?四、Servlet線程安全嗎?
Servlet默認是單例模式,一般來講它是非線程安全的。
在有成員變量的情況下,有多線程來修改成員變量的值,此時Servlet是非線程安全的。
package com.my.test;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/demo.do")
public class Demo2Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private int count = 0;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ExecutorService threadpool = Executors.newFixedThreadPool(200);
for (int i = 0; i < 1000; i++) {
threadpool.execute(new Runnable() {
@Override
public void run() {
try {
doPost(request,response,"http://localhost:8080/Servletday1/demo.do");
System.out.println("*****"+Thread.currentThread().getName());
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response,String url) throws ServletException, IOException {
//處理亂碼
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//獲取資源
PrintWriter out = response.getWriter();
out.println(Thread.currentThread().getName()+" "+(++count));
System.out.println(Thread.currentThread().getName()+"---------"+count);
//釋放資源
out.close();
}
}
所以盡量避免使用成員變量,可以使用synchronized鎖、lock鎖和CAS去解決線程安全的問題。
只要service()的局部變量不是有線程安全安全問題的,Servlet基本是線程安全的。
原文鏈接:https://blog.csdn.net/weixin_56373368/article/details/126975730
相關推薦
- 2022-03-15 React?Router?V6更新內容詳解_React
- 2022-10-10 ASP.NET?MVC使用jQuery?ui的progressbar實現進度條_實用技巧
- 2022-09-28 Dephi逆向工具Dede導出函數名MAP導入到IDA中的實現方法_python
- 2022-08-29 Python可視化神器pyecharts繪制水球圖_python
- 2022-09-09 React前端DOM常見Hook封裝示例下_React
- 2022-08-16 Go單元測試工具gomonkey的使用_Golang
- 2022-07-14 Python中添加搜索路徑的方法實例_python
- 2022-07-01 C語言詳細講解strcpy?strcat?strcmp函數的模擬實現_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支