BaseServlet的封裝

創建BaseServlet的必要性

如果不創建BaseServlet,現在我們只要實現一個功能,我們就需要創建一個servlet!

例如:用戶模塊(登錄,注冊,退出錄,激活,發送郵件等等功能) 也就是說,我們必須要創建一些系列的Servlet:UserLoginServlet - 登錄功能!? UserRegisterServlet ->注冊功能!

總之,只要你實現一個功能,你就得創建-個servlet!

這種情況會有兩個弊端!

1.創建大量的servlet!servet實例-> web容器(tomcat)管理!有大量的servlet實例必然會占有更大的
運行內存!會間接的拖慢web容器的速度!

2.servlet 他的service(dogel/dopost)方法是一個多線程方法!也就說理論上說!一個servlel可以處理很多次請求,也可以并發的 處理請求,一個servlel能力很強!? 但是只對應一個功能!你不覺得浪費么?

Baseservlet我們想解決的問題就是!簡化和優化servlet的創建和數量!

Baseservlet的實現思路

1.為什么一個servlet只對應一個功能!

一個serviet被訪問以后,只會有一個方法被調用,通常我們習慣一個方法中寫一個套業務邏輯!

一個servlet對應一個方法對應一個業務功能!

2.分析Baseservlet實現的思路

1.讓一個servet對應多個方法就好了!? 每個方法都實現一個業務邏輯!

2.具體的實現思路

步驟1:在一個servlel聲明多個處理業務邏方法!

步驟2:在每次訪問servlet的時候在路徑上添加一個標識!? 標識(method)用于判斷要訪問具體業務邏輯方法!

步驟3:當每次請求到 doget/dopost/service方法的時候,判斷參數的標識,調用對應的業務邏輯方
法即可!

Baseservlet的實現

1.實現基本的Baseservlet

步驟1:Baseservlet繼承httpservlet類,重寫其service方法

步驟2:在service方法中獲得具體要執行的方法如(登錄,注冊等),在執行

2.優化方法調用

利用標識符的字符串和方法名相同!

我們可以利用反射的技術!調用對應的執行方法!

避免了大量的if或switch判斷!

當有新的方法出現的時候!也不需要額外的添加判斷方法!

3.優化多Servlet實現

實現思路:

我們創建一個BascServlet類,讓他去繼承HttpServlet!BaseServlet中寫service方法!

在service寫 1.獲取標識 2.反射調用業務邏輯

每個模塊對應的Controller只需要集成Baseservlet即可!

HttpServlet->BaseServlet->模塊的Controller

4.優化返回值問題

每個方法都要進行響應

響應的方式固定: 轉發?重定向 返回字符串 返回字節流

如果在每個方法寫轉發和重定向和返回字符串的語法比較繁瑣!

我們可以統一在Baseservlet進行處理!

操作:

步驟1:將方法的返回值改成字符串即可!

步驟2: 根據約定的內容,添加特殊的標識!

例如:轉發“forward: 路徑”

步驟3:BaseServlet集中處理
執行方法!獲取返回值!進行非空判斷!

截取標識!進行轉發重定向或者寫回字符串處理!

好處:簡化方法的響應的操作!

注意:沒有管返回字節!

返回字節!我們只需要將方法的返回值改成void!

整體實現代碼樣例

BaseServlet代碼

package controller;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;import static utils.Constants.*;public class BaseServlet extends HttpServlet {@Overridepublic void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {try {//防止亂碼req.setCharacterEncoding("UTF-8");res.setCharacterEncoding("UTF-8");res.setContentType("text/html;charset=utf-8");//得到方法的名稱String m=req.getParameter(TAG);if(m==null||m.isEmpty()){m=INDEX;}Class<? extends BaseServlet>clazz=this.getClass();//獲取要執行的方法Method method = clazz.getDeclaredMethod(m, HttpServletRequest.class, HttpServletResponse.class);method.setAccessible(true);//得到返回值再進行判斷是什么操作:轉發 重定向 字符串(json)Object result = method.invoke(this, req, res);if(result!=null){String path=(String) result;if(path.startsWith(FORWARD)){ //轉發System.out.println("執行了轉發");path=path.replace(FORWARD,"");req.getRequestDispatcher(path).forward(req,res);}else if(path.startsWith(REDIRECT)){ //重定向System.out.println("執行了重定向");path=path.replace(REDIRECT,"");res.sendRedirect(path);}else{ //字符串(json)res.getWriter().println(path);}}} catch (Exception  e) {e.printStackTrace();System.out.println("BaseServlet異常處理");}}//方法為空public String index(HttpServletRequest req, HttpServletResponse res){return FORWARD+"路徑";}
}

Usercontroller類代碼

package controller;import com.google.gson.Gson;
import pojo.Result;
import pojo.student;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/Login")
public class UserController extends BaseServlet {//登錄功能public String login(HttpServletRequest req,HttpServletResponse res) throws IOException {String account = req.getParameter("account");String password = req.getParameter("password");System.out.println(account);System.out.println(password);//設置響應格式為jsonres.setContentType("application/json");// 創建一個示例對象Result dataObject = new Result(1,"json請求測試",new student("張三",14));// 將對象轉換為 JSON 字符串Gson gson = new Gson();String json = gson.toJson(dataObject);System.out.println(json);return json;}
}

工具類

package utils;public class Constants {public static final String TAG="method";public static final String FORWARD="forward:";public static final String REDIRECT="redirect:";public static final String INDEX="index";
}

測試

前端發送請求:

后端響應數據:

?前端響應數據:

json格式字符串

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42930.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42930.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42930.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea無法實力化id

解決&#xff1a;https://blog.csdn.net/qq_41264674/article/details/83409810?ops_request_misc&request_id&biz_id102&utm_termSerializable%E4%B8%8D%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90%E5%AE%9E%E5%8A%9B%E5%8C%96id&utm_mediumdistribute.pc_search_…

java-數據結構與算法-02-數據結構-03-遞歸

1. 概述 定義 計算機科學中&#xff0c;遞歸是一種解決計算問題的方法&#xff0c;其中解決方案取決于同一類問題的更小子集 In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller instances…

IT項目經理轉行大模型,項目經理的進來,你想知道的都在這里非常詳細

大模型&#xff08;如人工智能、機器學習和深度學習模型&#xff09;可以通過提供數據驅動的決策支持、自動化流程和預測分析來賦能IT項目經理。這些工具可以幫助項目經理更有效地管理項目&#xff0c;預測潛在的風險&#xff0c;并提高項目成功的可能性。以下是IT項目經理如何…

IPD流程學習筆記

一、前言 互聯網行業講究的是快速試錯&#xff0c;所以IPD流程的應用并不多&#xff0c;但是傳統企業數字化轉型中&#xff0c;怎么確保項目投入可以切合市場需求&#xff0c;有較好的ROI及落地性&#xff0c;輕量級的IPD還是很有必要了解下的&#xff0c;特別是重資產類的業務…

探討大數據在視頻匯聚平臺LntonCVS國標GB28181協議中的應用

隨著攝像頭和視頻監控系統的普及和數字化程度的提高&#xff0c;視頻監控系統產生的數據量急劇增加。大數據技術因其優秀的數據管理、分析和利用能力&#xff0c;成為提升視頻監控系統效能和價值的重要工具。 大數據技術可以將視頻監控數據與其他數據源進行融合分析&#xff0c…

libaom 編碼器實驗 AV1 標準 SVC 分層編碼

SVC編碼 視頻SVC編碼&#xff0c;即Scalable Video Coding&#xff08;可適性視訊編碼或可分級視頻編碼&#xff09;&#xff0c;是H.264/MPEG-4 AVC編碼的一種擴展&#xff0c;它提供了更大的編碼彈性&#xff0c;并且具有時間可適性&#xff08;Temporal Scalability&#x…

單向鏈表的概念和結構

文章目錄 1.鏈表的概念及結構2.單鏈表的實現 1.鏈表的概念及結構 概念&#xff1a;鏈表是一種物理存儲結構上非連續、非順序的存儲結構&#xff0c;數據元素的邏輯順序是通過鏈表 中的指針鏈接次序實現的 。 鏈表的結構跟火車車廂相似&#xff0c;淡季時車次的車廂會相應減少&…

【基礎算法總結】分治—歸并

分治—歸并 1.排序數組2.交易逆序對的總數3.計算右側小于當前元素的個數4.翻轉對 點贊&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;關注&#x1f496;&#x1f496; 你的支持是對我最大的鼓勵&#xff0c;我們一起努力吧!&#x1f603;&#x1f603; 1.排序數組 …

NFTScan | 07.01~07.07 NFT 市場熱點匯總

歡迎來到由 NFT 基礎設施 NFTScan 出品的 NFT 生態熱點事件每周匯總。 周期&#xff1a;2024.07.01~ 2024.07.07 NFT Hot News 01/ 數據&#xff1a;Mad Lads 地板價回升至 100 SOL 上方&#xff0c;24 小時漲幅為 13.65% 7 月 1 日&#xff0c;據數據顯示&#xff0c;Solana…

ARM架構以及程序運行解析

文章目錄 1. ARM架構 2. ARM處理器程序運行的過程 3. 示例 3. 基于ARM架構的STM32單片機 1. 運行模式 2. 寄存器組 3. STM32的基本結構 4. STM32的運行模式 4. 寄存器組詳解 1. 未備份寄存器 2. 備份寄存器 3. 程序計數器 4. 程序狀態寄存器 5. CPSR和SPSR寄存器…

【Unity】UGUI的基本介紹

Unity的UGUI&#xff08;Unity User Interface&#xff09;是Unity引擎內自帶的UI系統&#xff0c;官方稱之為UnityUI&#xff0c;是目前Unity商業游戲開發中使用最廣泛的UI系統開發解決方案。以下是關于Unity的UGUI的詳細介紹&#xff1a; 一、UGUI的特點 靈活性&#xff1a…

Trick : 10^x 以內最多的因子數

Trick : 1 0 x 10^x 10x 以內最多的因子數 1 0 5 10^5 105 以內具有最多的因子數的數是 83160&#xff0c;它有 128 個因子 ; 1 0 6 10^6 106 以內具有最多因子數的數是 720720&#xff0c;它有 240 個因子 ; 所以遇到需要枚舉因子的&#xff0c;預處理之后大膽枚舉就可以&…

Python 爬蟲 tiktok API接口獲取tiktok用戶關注列表

此接口可獲取tiktok用戶關注列表。若有需要&#xff0c;請點擊文末鏈接聯系我們。 詳細采集頁面如下https://www.tiktok.com/quanap_official 請求API http://api.xxxx.com/tt/user/following?user_id7252644648840381445&count10&offset0&tokentest 請求參數 返…

Impala寫Parquet文件

Impala Parquet相關代碼 https://github.com/cloudera/Impala/search?l=cpp&q=parquet&ref=cmdform 沒有可重用的庫接口,需要在代碼里去看,提取出來,直接使用源碼。 調用關系如下(自右向左調用): HdfsParquetTableWriter(HdfsTableWriter)<-HdfsTableSink<…

改進Transformer模型其實也不難

聲明&#xff1a;文章是從本人公眾號中復制而來&#xff0c;因此&#xff0c;想最新最快了解各類智能優化算法及其改進的朋友&#xff0c;可關注我的公眾號&#xff1a;強盛機器學習&#xff0c;不定期會有很多免費代碼分享~ 目錄 原理簡介 數據介紹 結果展示 完整代碼 之前…

列表(定義、引用、修改、切片和用途)

什么是列表 列表是 Python 中最常用的數據類型之一。它是一種有序、可變&#xff0c;異構的數據集合&#xff0c;可以存儲多個不同類型的元素。 列表的特點 列表是 Python 中的一種數據結構&#xff0c;具有以下特點&#xff1a; 有序性&#xff1a; 列表中的元素按照添加的…

【學術會議征稿】第五屆計算機工程與智能控制學術會議(ICCEIC 2024)

第五屆計算機工程與智能控制學術會議&#xff08;ICCEIC 2024) 2024 5th International Conference on Computer Engineering and Intelligent Control 第五屆計算機工程與智能控制學術會議&#xff08;ICCEIC 2024&#xff09;將于2024年10月18日至22日在廣州舉辦&#xff0…

improved-diffusion代碼逐行理解之train

目錄 代碼理解1、解析命令行參數2、分布式設置和日志配置3、創建模型和擴散過程4、加載數據5、訓練循環6、訓練過程中的關鍵點7、日志和模型保存 代碼 improved-diffusion代碼地址&#xff1a;https://github.com/openai/improved-diffusion 運行代碼會遇到的幾個問題&#xf…

LDR6282-顯示器:從技術革新到視覺盛宴

顯示器&#xff0c;作為我們日常工作和娛樂生活中不可或缺的一部分&#xff0c;承載著將虛擬世界呈現為現實圖像的重要使命。它不僅是我們與電子設備交互的橋梁&#xff0c;更是我們感知信息、享受視覺盛宴的重要窗口。顯示器在各個領域的應用也越來越廣泛。在辦公領域&#xf…

Gradle使用插件SonatypeUploader-v2.6上傳到maven組件到遠程中央倉庫

本文基于sonatypeUploader 2.6版本 插件的使用實例&#xff1a;https://github.com/jeadyx/SonatypeUploaderSample 發布步驟 提前準備好sonatype賬號和signing配置 注&#xff1a;如果沒有&#xff0c;請參考1.0博文的生成步驟&#xff1a; https://jeady.blog.csdn.net/art…