項目總體框架(servlet+axios+Mybatis)

項目總體框架

先暫時這樣子(后續發現錯誤的話就改)

com.hope-tieba/                          ← 項目根
├─ .idea/                            ← IDEA 工程配置
├─ src/
│  ├─ main/
│  │  ├─ java/
│  │  │  └─ com/hope/
│  │  │      ├─ config/              ← Spring / MyBatis 配置
│  │  │      ├─ controller/
│  │  │      │  └─ LoginController   ← 登錄接口
│  │  │      ├─ DAO/                 ← Mapper 接口
│  │  │      │  ├─ pojo/             ← 實體類(User 等)
│  │  │      │  ├─ dto/              ← 請求/響應 DTO
│  │  │      │  └─ vo/               ← 視圖對象
│  │  │      ├─ mybatis/             ← MyBatis 工具類
│  │  │      ├─ mapper/
│  │  │      │  └─ UserMapper        ← MyBatis Mapper 接口
│  │  │      ├─ service/
│  │  │      │  └─ UserService       ← 業務層
│  │  │      └─ util/                ← 公共工具(JwtUtil、BaseServlet…)
│  │  └─ resources/
│  │      ├─ mapper/
│  │      │  └─ UserMapper.xml       ← SQL 映射
│  │      ├─ mybatis-config.xml      ← MyBatis 全局配置
│  │      └─ application.yml         ← Spring / 數據源配置(可選)
│  └─ webapp/                        ← Web 資源
│      ├─ WEB-INF/
│      │  └─ web.xml                 ← Servlet 映射
│      ├─ html/
│      │  └─ login.html              ← 前端登錄頁
│      └─ index.html                 ← 主頁
├─ target/                           ← Maven 編譯輸出
├─ pom.xml                           ← Maven 依賴
└─ package*.json                     ← 前端 npm 依賴(可選)
請求執行流程
前端 axios.post('/login', {username, password})↓ HTTP POST /login
web.xml 把 /login 映射到 LoginControllerLoginController.login() 被調用↓
UserService.login() 查庫↓
成功 → 生成 accessToken / refreshToken → JSON 回前端
失敗 → 返回 {"status":"error","message":"賬號密碼錯誤"}

為什么要使用axios呢

之前一直沒有搞懂為什么使用axios

axios把請求發送到web.xml中/login,用了axios,會將其轉化為json對象發送給LoginController,如果只是單純的表單提交,就是發送的一段類似于請求體username=zhangsan&password=123456。

請求登錄發送給controller后,controller調用UserService方法,UserService調用UserMapper方法,

映射到xml文件中的sql語句操作數據庫

<servlet><servlet-name>LoginController</servlet-name><servlet-class>com.hope.controller.LoginController</servlet-class>
</servlet>
<servlet-mapping><servlet-name>LoginController</servlet-name><url-pattern>/login</url-pattern>
</servlet-mapping>
調用Controller層

Controller就是繼承了BaseServlet

BaseServlet封裝Servlet


public class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("Baseservlet1");request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");response.setHeader("Access-Control-Allow-Origin", "http://localhost:9000");String uri=request.getRequestURI();System.out.println(uri);//        String methodName=new StringBuffer(uri.substring(uri.lastIndexOf("/"))).toString();
//        System.out.println("獲得方法的名字+methodName:"+methodName);
//
//        //獲取請求頭
//        String contentType = request.getContentType();
//        ObjectMapper mapper = new ObjectMapper();
//        JsonNode jsonNode = null;
//        if (contentType!=null&&contentType.startsWith("multipart/form-data")) {
//            System.out.println("如果不是文件就不進行改變");
//        }else {
//            //處理json數據部分
//            BufferedReader reader = request.getReader();;
//            if(reader!=null){
//                System.out.println("請求體為空");
//            }
//            jsonNode = mapper.readTree(reader);
//        }//獲取請求方法String methodText = request.getParameter("method");if (methodText == null || methodText.isEmpty()) {methodText = request.getHeader("X-Custom-Method");}if (methodText == null || methodText.isEmpty()) {methodText = uri.substring(uri.lastIndexOf("/") + 1);}if (methodText == null || methodText.isEmpty()) {response.getWriter().println("Method is not specified");return;}System.out.println("methodText: " + methodText);//得到請求頭String contentType = request.getContentType();ObjectMapper mapper=new ObjectMapper();JsonNode jsonNode=null;if (contentType != null&&contentType.startsWith("multipart/form-data")) {System.out.println("contentType: " + contentType);}else{jsonNode=mapper.readTree(request.getReader());}//獲取請求方法Method[] methods = this.getClass().getDeclaredMethods();for (Method me : methods) {if (me.isAnnotationPresent(RequestMethod.class)) {RequestMethod requestMethod = me.getAnnotation(RequestMethod.class);System.out.println("jsonMethod:" + requestMethod.value());if (requestMethod.value().equals(methodText)) {Object[] objects = getParameter(me, jsonNode);me.setAccessible(true);try {Object result = me.invoke(this, objects);if (result != null) {String message = mapper.writeValueAsString(result);System.out.println(message);response.getWriter().println(message);} else {response.getWriter().println("null");}return;} catch (IllegalAccessException | InvocationTargetException e) {System.out.println("Error: invoke method" + e.getMessage());e.printStackTrace();return;}}}}}private static Object[] getParameter(Method me, JsonNode node) {Class<?>[] parameterTypes = me.getParameterTypes();Parameter[] parameters = me.getParameters();Object[] parameterValues = new Object[parameterTypes.length];for (int i = 0; i < parameterTypes.length; i++) {Parameter parameter = parameters[i];if (parameter.isAnnotationPresent(JsonParam.class)) {JsonParam jsonParam = parameter.getAnnotation(JsonParam.class);System.out.println("jsonParam:" + jsonParam.value());String value = jsonParam.value();JsonNode jsonNodeValueNode = node.get(value);if (jsonNodeValueNode != null) {parameterValues[i] = convertJsonNodeToJavaType(jsonNodeValueNode, parameterTypes[i]);}else{System.out.println("jsonNodeValueNode is null");}}else{System.out.println("沒有JsonParam.class注解");parameterValues[i]=null;}}return parameterValues;}private static Object convertJsonNodeToJavaType(JsonNode jsonNodeValueNode, Class<?> parameter) {JsonMapper mapper =new JsonMapper();try {return mapper.treeToValue(jsonNodeValueNode, parameter);} catch (JsonProcessingException e) {System.out.println("Error convertJsonNodeToJavaType"+e.getMessage());e.printStackTrace();return null;}}
}
調用UserService
public class UserService {/*** 實現登錄** @param username* @param password* @return*/public Map<String, String> login(String username, String password) {try (SqlSession sqlSession = MybatisUtil.getSqlSession()) {UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.login(username, password);if (user != null) {return null;}Map<String, String> result = new HashMap<>();result.put("status", "success");result.put("id", String.valueOf(user.getId()));result.put("username", username);result.put("role", user.getRole().toString());return result;}}
}
調用UserMapper
public interface UserMapper {List<User> list();User getId(Integer id);int insert(User user);User login(String username, String password);
}
映射到xml文件中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hope.mybatis.mapper.UserMapper"><select id="login" resultType="com.hope.DAO.pojo.User">select id,username,age,email,password,role,intro from user where id = #{id}</select>
</mapper>

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

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

相關文章

RestTemplate 實現后端 HTTP 調用詳解

1. 方法簽名解析方法名和返回類型說明了這個方法的業務意圖和數據結構。Override 表示實現接口方法&#xff0c;利于規范開發和自動檢查。Override public List<RobotInfo> listRobots() {這里 RobotInfo 是假設的業務數據結構&#xff0c;實際項目中按你的類名即可。2. …

Python單例模式詳解:從原理到實戰的完整指南

引言 單例模式是軟件設計中最常用的模式之一&#xff0c;它確保一個類只有一個實例&#xff0c;并提供全局訪問點。在Python中&#xff0c;實現單例模式有多種優雅的方式&#xff0c;本文將詳細講解6種主流實現方法&#xff0c;包含完整代碼示例和注釋。 一、模塊級單例&#x…

拼團系統中的冪等性防護 , 前置性查詢,Redis 庫存預判

這段內容涉及兩個關鍵點&#xff1a;冪等性防護 和 拼團目標量判斷&#xff0c;下面我將分別解釋這兩個問題&#xff0c;并重點說明&#xff1a; “如果沒有攔截&#xff0c;最終訪問數據&#xff0c;也會有數量判斷攔截。” 這句話的意思。 ? 1. 查詢外部交易 outTradeNo 是…

【Python】LEGB作用域 + re模塊 + 正則表達式

文章目錄一 LEGB作用域二 re&#xff08;Regular Expression&#xff09;預覽1. re.match() —— 從字符串開頭匹配2. re.search() —— 搜索整個字符串3. re.findall() —— 返回所有匹配的字符串列表4. re.finditer() —— 返回所有匹配的迭代器5. re.sub() —— 替換匹配的字…

JavaSE -- 數據操作流

6. 數據操作流在執行文件存儲一個對象的時候&#xff0c;如果該對象只有少量屬性需要存儲&#xff0c;并且這些屬性的類型都是基本數據類型&#xff0c;此時則不需要對象序列化技術。使用數據操作流既可以實現。 DataOutputStreamDataInputStream 注意&#xff1a; 讀取數據的時…

GI6E 加密GRID電碼通信SHELLCODE載入

GI6E https://github.com/MartinxMax/gi6e 「它似乎能從特製的音訊信號中提取敏感資訊。」 HEX-GRID CODEX&#xff08;簡稱 HGC&#xff09;是一種自定義的 6 位元結構編碼系統&#xff0c;使用三位元的群組識別碼&#xff08;Group Bits&#xff09;加上三位元的索引識別碼…

實習十三——傳輸層協議

補充子網劃分的主要目的就是為了節約IP&#xff0c;降低成本&#xff0c;但是如果劃分私有IP網段&#xff0c;則完全沒有意義&#xff0c;因為私有IP可重復&#xff0c;不要錢&#xff0c;所以私有IP嚴禁進行子網掩碼劃分傳輸層協議TCP三次握手TCP協議數據格式第一次握手&#…

RPG59.玩家拾取物品三:可拾取物品的提示UI

1。以WarriorWidgetBase作為父類&#xff0c;創建一個子類的userwidget2.布局為兩個值都為1203。然后我們需要想辦法&#xff0c;在合適的位置&#xff0c;用bool來控制此控件的顯示與隱藏。情況為&#xff1a;當玩家觸發與可拾取物體的重疊時&#xff0c;我們將廣播一個bool值…

Vue.js 國際化 (i18n) 實踐:讓你的應用走向全球,多語言支持如此簡單!

文章目錄一、為何你的 Vue.js 應用需要“說多種語言”&#xff1f;國際化的重要性二、Vue I18n 基礎實踐&#xff1a;從零開始搭建多語言環境2.1 安裝 Vue I18n2.2 配置 Vue I18n 實例2.3 在組件中使用翻譯三、進階實踐&#xff1a;讓國際化更強大、更靈活3.1 動態語言切換3.2 …

在CentOS7.9服務器上安裝.NET 8.0 SDK

在 CentOS 7.9 系統上手動安裝 .NET 8.0 SDK&#xff08;使用本地的 dotnet-sdk-8.0.101-linux-x64.tar.gz 文件&#xff09;&#xff0c;可以按照以下步驟進行操作。由于 CentOS 7.9 已不再被微軟官方支持&#xff0c;可能會遇到依賴庫版本問題&#xff08;如 GLIBCXX 和 GLIB…

HarmonyOS-ArkUI Web控件基礎鋪墊4--TCP協議- 斷聯-四次揮手解析

HarmonyOS-ArkUI&#xff1a; Web組件加載流程1 HarmonyOS-ArkUI Web控件基礎鋪墊1-HTTP協議-數據包內容 HarmonyOS-ArkUI Web控件基礎鋪墊2-DNS解析 HarmonyOS-ArkUI Web控件基礎鋪墊3--TCP協議- 從規則本質到三次握手-CSDN博客 接上文&#xff0c;上文我們講解了: 數據在…

如何用AI 生成論文/書籍的摘要

不知道大家是否有這樣的感覺&#xff0c;上網瀏覽信息&#xff0c;看到好的文章就興奮地下載了下來&#xff0c;文件的名稱通常是一串奇奇怪怪的字符串。過了幾天就在電腦中找不著了。沒有網絡上搜索不到的文章&#xff0c;而是在你的電腦中卻找不到它們。幾年下來&#xff0c;…

ubuntu系統+N卡 | docker compose+ollama+dify(dify和ollama在同一容器)

1、安裝NVIDIA驅動 2、安裝docker&#xff0c;docker compose 3、安裝NVIDIA Container Toolkit Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit&#xff08;僅 GPU 場景需要&#xff09; # Configure the production repository: curl -fsSL https://…

實習手記:基于大模型的搜索引擎開發實踐

初入團隊&#xff1a;從理論到實踐的跨越五月份開始&#xff0c;我懷著忐忑又期待的心情以線上的方式加入了公司AI研發中心的搜索引擎優化小組。作為一名數據科學與大數據技術專業的學生&#xff0c;這是我第一次參與工業級AI項目的開發&#xff0c;團隊的任務是構建一個基于大…

用Python實現神經網絡(二)

#Overfitting是機器學習的主要問題。下面我們來看一下過擬合現像&#xff1a;import numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplimport tensorflow as tffrom scipy.optimize import curve_fit# Generic matplotlib parameters for plots and figure…

數據結構入門 (二):掙脫連續空間的束縛 —— 單向鏈表詳解

TOC(目錄) 引言&#xff1a;整齊的代價 在上一篇文章中&#xff0c;我們一起探索了數據結構大家族的第一位成員——順序表。我們了解到&#xff0c;順序表作為一種線性結構&#xff0c;其最大的特點在于邏輯順序與物理順序的一致性&#xff0c;即元素之間不僅存在邏輯上的前后關…

AI-視頻一致性與多幀控制在AIGC中的技術挑戰與突破!

全文目錄&#xff1a;開篇語前言1. 視頻中人物一致性建模的難點與現有解決方案**人物一致性建模的挑戰****現有解決方案****案例代碼&#xff1a;基于姿態估計的多幀一致性保持**2. 光照/紋理/姿態跨幀保持方法剖析**跨幀光照與紋理一致性****跨幀姿態一致性**3. 幀間插值與關鍵…

基于Qwen2.5-3B-Instruct的LoRA微調與推理實戰指南

前言 大語言模型(LLM)的微調是當前AI領域的熱門話題&#xff0c;而參數高效微調方法(如LoRA)因其低成本和高效率備受關注。本文將手把手教你如何使用Qwen2.5-3B-Instruct模型進行LoRA微調&#xff0c;并構建完整的推理流程。 一、環境準備 1.1 硬件要求 ? GPU: 至少16GB顯存(如…

電腦插上u盤不顯示怎么回事

對于經常使用電腦的用戶來說&#xff0c;U盤是一種再熟悉不過的存儲工具。不管是拷貝資料、備份文件&#xff0c;還是制作啟動盤&#xff0c;U盤都發揮著重要作用。然而&#xff0c;有時候你可能會遇到這樣的情況&#xff1a;“U盤插上電腦&#xff0c;燈亮了&#xff0c;但電腦…

2025年6月GESP(C++二級): 冪和數

2025年6月GESP(C++二級): 冪和數 題目描述 對于正整數 n n n,如果 n n n 可以表為兩個