当前位置: 首页 > news >正文

项目总体框架(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

package com.hope.util;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;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.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class BaseServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("Baseservlet");response.setContentType("text/html;charset=utf-8");ObjectMapper mapper = new ObjectMapper();JsonNode node = mapper.readTree(request.getReader());JsonNode method = node.get("method");if (method == null || !method.isTextual() || method.asText().isEmpty()) {System.out.println("method is null此方法为空");}String methodText = method.asText();System.out.println("methodText:" + methodText);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, node);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 e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}}}}}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("没有JsonParam.class注解");}}return parameterValues;}private static Object[] convertJsonNodeToJavaType(JsonNode jsonNodeValueNode, Class<?> parameter) {JsonMapper mapper =new JsonMapper();try {return (Object[]) mapper.treeToValue(jsonNodeValueNode,parameter);} catch (JsonProcessingException e) {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://cholon.pzdurr.cn
http://astragali.pzdurr.cn
http://bucketeer.pzdurr.cn
http://antiquate.pzdurr.cn
http://caltrap.pzdurr.cn
http://celesta.pzdurr.cn
http://bunned.pzdurr.cn
http://biofacies.pzdurr.cn
http://aeroscope.pzdurr.cn
http://ascent.pzdurr.cn
http://asyllabic.pzdurr.cn
http://angelic.pzdurr.cn
http://chordotonal.pzdurr.cn
http://acidly.pzdurr.cn
http://anthropolatry.pzdurr.cn
http://affectlessness.pzdurr.cn
http://amphotericin.pzdurr.cn
http://behoove.pzdurr.cn
http://bombinate.pzdurr.cn
http://brachyuran.pzdurr.cn
http://amygdalaceous.pzdurr.cn
http://amok.pzdurr.cn
http://adi.pzdurr.cn
http://balneary.pzdurr.cn
http://bacony.pzdurr.cn
http://boaster.pzdurr.cn
http://casque.pzdurr.cn
http://blacksnake.pzdurr.cn
http://beryl.pzdurr.cn
http://abortionism.pzdurr.cn
http://www.dtcms.com/a/280952.html

相关文章:

  • ue4 houdini pivot painter 学习笔记
  • 可微分3D高斯溅射(3DGS)在医学图像三维重建中的应用
  • OpenCV 对数变换函数logTransform()
  • ubuntu22.04 软创建 RAID1 与配置流程
  • pytest快速上手指南【pytest】
  • LED 照明应用提供高性价比方案?会是你的首选吗?
  • C++ 中两个类之间的通信方式
  • labview关于OOP
  • labview生成exe应用程序常见问题
  • Java行为型模式---责任链模式
  • redis集群的部署
  • 渭河SQL题库-- 来自渭河数据分析
  • JavaScript与Vue:现代前端开发的完美组合
  • King’s LIMS:实验室数字化转型的智能高效之选
  • AWS S3事件通知实战:从配置到生产的完整指南
  • 云蝠智能赋能呼入场景——重构企业电话服务
  • JVM——为什么Java8移除了永久代(PermGen)并引入了元空间(Metaspace)?
  • 订单初版—7.支付和履约实现的重构文档
  • 域名备案是否可以加急
  • DirectX12(D3D12)基础教程九 间接绘制
  • Dynadot邮箱工具指南(十二):删除域名邮箱
  • 学习软件测试的第十六天
  • C++ Qt插件开发样例
  • Git Bash 实战操作全解析:从初始化到版本管理的每一步细节
  • 读取和写入json,xml文件
  • Kubernetes 架构原理与集群环境部署
  • Codeforces Round 907 (Div. 2) F. A Growing Tree(2000,子树修改)
  • 拥抱 Spring Boot:开启 Java 后端开发的“快车道”
  • MySQL功能模块探秘:数据库世界的奇妙之旅
  • 解决了困扰我的upload靶场无法解析phtml等后缀的问题