網(wǎng)站首頁 編程語言 正文
一、什么是Servlet?
Servlet(Serve Applet)是Java Servlet的簡稱,用Java編寫的服務端端程序,具有獨立于平臺和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動態(tài)Web內(nèi)容。Servlet 看起來像是通常的 Java 程序。Servlet 導入特定的屬于 Java Servlet API 的包。因為是對象字節(jié)碼,可動態(tài)地從網(wǎng)絡加載,可以說 Servlet 對 Server 就如同 Applet對 Client 一樣,但是,由于 Servlet 運行于 Server 中,它們并不需要一個。從這個角度講,Servlet 也被稱為 FacelessObject。一個 Servlet 就是 Java 編程語言中的一個類,它被用來擴展服務器的性能,服務器上駐留著可以通過“請求-響應”編程模型來訪問的應用程序。
二、Servlet的實現(xiàn)過程
1.客戶端發(fā)送請求到服務端;
2.服務端把請求傳給Servlet,Servlet處理請求并生成響應,然后將響應傳給服務端;
3.服務端把帶有動態(tài)數(shù)據(jù)的響應返回給客戶端。
有請求就一定會響應
三、Servlet的生命周期
1.實例化:Servlet容器創(chuàng)建Servlet的實例;
2.初始化:該容器調(diào)用init(ServletConfig)方法;
3.服務:如果請求Servlet,則容器調(diào)用service()方法;
4.銷毀:銷毀實例前一定會調(diào)用的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-12-02 關于Nginx?命令行控制的問題_nginx
- 2022-04-27 Python?Pandas學習之Pandas數(shù)據(jù)結構詳解_python
- 2022-07-06 C語言實現(xiàn)可增容動態(tài)通訊錄詳細過程_C 語言
- 2022-10-17 Python速成篇之像selenium一樣操作電腦詳解_python
- 2022-10-21 tomcat8中startup可以啟動tomcat8w無法啟動的問題分析_Tomcat
- 2022-07-03 kafka?rabbitMQ及rocketMQ隊列的消息可靠性保證分析_相關技巧
- 2022-03-24 Unity腳本自動添加頭部注釋的全過程_C#教程
- 2022-07-01 python神經(jīng)網(wǎng)絡Keras實現(xiàn)LSTM及其參數(shù)量詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支