软件设计之JavaWeb(3)

news2024/9/27 15:22:21

软件设计之JavaWeb(3)

此篇应在MySQL之后进行学习:
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷全新JavaWeb教程,企业主流javaweb技术栈
资料可以去尚硅谷官网免费领取
此章节最好学完JDBC观看

学习内容:

  1. 请求转发与响应重定向
  2. 路径问题
  3. MVC架构模式

1、请求转发与响应重定向

请求转发

1、请求转发是指服务器收到客户端的请求后,将该请求内部转发给同一服务器中的另一个资源(如Servlet、JSP等)来处理。客户端不会知道请求被转发了,浏览器的地址栏不会改变,仍显示最初的URL。常用于服务器端的内部逻辑处理,比如验证用户身份后将其转发到指定页面。
2、请求转发是通过HttpServletRequest对象实现的
3、客户端只产生了一次请求,服务端只产生了一对request和response对象
4、请求的参数是可以传递的
5、目标资源可以是servlt动态资源,也可以是html静态资源
6、目标资源可以是WEB-INF下的受保护的资源 该方式也是WEB-INF下的组员的唯一访问方式

响应重定向

1、是服务器收到请求后,向客户端发送一个重定向的响应,告诉客户端重新发送请求到另一个URL。浏览器地址栏会发生变化,指向新的URL。常用于需要客户端发送新的请求的场景,比如用户登录后重定向到主页面。
2、重定向是通过HttpServletResponse对象实现的
3、响应重定向是在服务器的提示下的,客户端的行为
4、请求产生了多次,后端就会有多个request对象 此时请求中的参数不能继续自动传递
5、目标资源可以是静态资源、外部资源、但不能是WEB-INF下的资源

2、路径问题

相对路径

相对路径:以当前资源所在路径为出发点;假设index.html在web目录下,那么就是从web开始找
语法上:不以/开头 ./表示当前资源路径../表示当前资源的上一级路径
重点:目录的加载是以客户端url进行主体分析,不能专注于磁盘下的目录结构
在这里插入图片描述

绝对路径

始终以固定的路径作为出发点去找目标资源,和当前资源所在路径没有关系
语法上以/开头,不同项目的固定路径出发点可能不一致,可以测试查看
base href标签可以针对当前html文件内容中,所有不加任何修饰的相对路径前,自动补充href的内容。(不加修饰的意思是除./../外)
请求转发的绝对路径是不需要添加项目上下文的,其代表的路径是
http://localhost:8080/d05(上下文路径)/

3、MVC架构模式

1、Model(模型):负责处理应用程序的数据逻辑。它从数据库中获取数据、处理业务逻辑,并将处理后的数据返回给 Controller 或 View。
2、View(视图):负责显示数据,是用户界面的部分。它通过 Controller 传递的数据来生成用户看到的内容。
3、Controller(控制器):负责处理用户的输入,并决定调用哪个 Model 来处理数据,再将数据返回给 View。
4、以日程管理为案例开发进行MVC代码思想学习

前后端分离MVC

在这里插入图片描述

非前后端分离MVC

在这里插入图片描述

数据库准备

创建完之后,在IDEA可以连接数据库,有一个database按钮

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- 创建日程表
-- ----------------------------
DROP TABLE IF EXISTS `sys_schedule`;
CREATE TABLE `sys_schedule`  (
  `sid` int NOT NULL AUTO_INCREMENT,
  `uid` int NULL DEFAULT NULL,
  `title` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `completed` int(1) NULL DEFAULT NULL,
  PRIMARY KEY (`sid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- 插入日程数据
-- ----------------------------

-- ----------------------------
-- 创建用户表
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user`  (
  `uid` int NOT NULL AUTO_INCREMENT,
  `username` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `user_pwd` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`uid`) USING BTREE,
  UNIQUE INDEX `username`(`username`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- 插入用户数据
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, 'zhangsan', 'e10adc3949ba59abbe56e057f20f883e');
INSERT INTO `sys_user` VALUES (2, 'lisi', 'e10adc3949ba59abbe56e057f20f883e');

SET FOREIGN_KEY_CHECKS = 1;

实体类创建(pojo)

1、实体类的类名和表格名称应该对应(对应不是一致)
2、实体类的属性与表格列名应该对应
3、每个属性都必须是私有的
4、每个属性都应该具备getter setter
5、必须具备无参构造器
6、应该实现序列化接口(缓存、分布式项目数据传递,可能会将对象序列化)
7、应该重写类的hashCode和equals方法
8、toString方法是否重写不要求
9、使用lombok帮助我们生成这些内容 getter setter 全参构造 无参构造 equals hashCode
步骤1:检查idea是否安装lombok插件,在设置->插件->已安装里面找,找不到就去marketplace里找找
步骤2:检查是否勾选了enable annotation processer,在设置->构建、执行、部署->编译器->注解处理器->启动注解处理
步骤3:导入lombok的依赖(lombok1.18.24.jar)

//根据两个表,分别创建两个实体类,此处只展示了sys_schedule表对应实体类创建
package com.atguigu.schedule.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@AllArgsConstructor//添加了全参构造
@NoArgsConstructor//添加了无参构造
@Data //getter setter equals hashcode
public class Sys_Schedule implements Serializable {
    private Integer sid;
    private Integer uid;
    private String title;
    private Integer completed;
}

DAO层代码

DAO:data access object数据访问对象
该类中用于定义针对表格的CRUD方法
DAO层一般需要定义接口和实现类
这里需要借助之前JDBC中设计的BaseDao类(基础查询、增删改操作)、JDBCUtil类(管理连接池)
思路:创建表对应Dao,以SysScheduleDao为例,里面包含对数据库操作,SysScheduleDaoImpl是实现类,它继承于BaseDao类,可以使用其中的函数,并实现SysScheduleDao接口内定义的对应数据库操作函数。

Controller包处理

1、构建BaseController类,作为其他表对应Controller的父类,提供功能:根据访问路径找到并使用对应函数
2、其他Controller类只要提供对应访问路径的函数即可,减少代码冗余
3、调用service层代码处理业务逻辑

public class BaseController extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //判断此次请求是增删改查哪一个
        String requestURI = req.getRequestURI();// /schedule/add
        String[] split = requestURI.split("/");
        String methodName = split[split.length-1];
        //使用反射通过方法名获取下面的方法
        Class aClass = this.getClass();
        try {
            Method declaredMethod = aClass.getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //暴力破解方法的访问修饰符权限
            declaredMethod.setAccessible(true);
            //执行方法
            declaredMethod.invoke(this,req,resp);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

工作流程梳理

1、Controller层:接收用户的请求,调用Service层来处理业务逻辑。
2、Service层:执行业务逻辑,调用DAO层来进行数据操作。
3、DAO层:与数据库交互,进行数据的增、删、改、查操作,返回操作结果给Service层。
4、POJO层:封装数据,将数据库中的数据转换为对象形式,并在不同层之间传递。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jenkins流水线+k8s部署springcloud微服务架构项目

文章目录 1.k8s安装2.jenkins安装3.k8s重要知识1.简介2.核心概念3.重要命令1.查看集群消息2.命名空间3.资源创建/更新4.资源查看5.描述某个资源的详细信息6.资源编辑7.资源删除8.资源重启9.查看资源日志10.资源标签 4.k8s控制台1.登录2.界面基本操作1.选择命名空间2.查看命名空…

损耗金属件检测系统源码分享

损耗金属件检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

全球和局部精细化:提升大模型推理能力的新方法

人工智能咨询培训老师叶梓 转载标明出处 尽管大模型在数学、科学或编程任务上表现出优异的推理精细化能力,但它们在没有外部反馈的情况下,很难识别何时何地需要精细化。为了解决这一问题,来自Meta的FAIR团队和佐治亚理工学院的研究者们提出了…

智能营销才是营销的未来

智能营销新纪元:大模型如何为运营与产品经理赋能 在数字化浪潮席卷全球的今天,营销行业正经历着一场前所未有的变革。随着人工智能技术的飞速发展,特别是大模型技术的兴起,为产品经理和运营人员提供了前所未有的工具与视野&#…

雷·达利欧(Ray Dalio)的20条《原则》

达利欧在《原则》(Principles)一书中总结了许多实用的原则。这些原则被广泛认同,并且适用于多种情景。以下是20条核心原则的英语原文以及中文翻译: 1. Embrace reality and deal with it. 翻译: 拥抱现实并应对它。适合场景: 适用…

c++中的继承和多态

目录 Linux中的管道通信 ​编辑派生类的默认成员函数 继承 派生类的构造 隐藏 如何设计一个不能被继承的类 菱形继承 virtual virtual是如何解决的 内存对象模型 继承和组合 继承 组合 多态 概念 多态的构成条件 虚函数的重写 Linux中的管道通信 派生类的默认成…

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6116 标注数量(xml文件个数):6116 标注数量(txt文件个数):6116 标注…

Lombok介绍

一、Lombok 1.1何为Lombok Lombok是Java的一个库,是一个工具,使用这个工具能够使得我们通过使用注解的方式减少Java中代码的开发。其简化主要是针对Java中的简单Java对象(就是无继承、无实现的)类。我们化简的就是这些类中重复冗余出现的构造函数&#…

运算符学习

ctrlaltL 自动格式化代码 原码反码补码 负数用反码去计算不会出错。跨零就会出错。补码解决了 字节-128到127

双指针的用法以及示例

当然可以!双指针(Two Pointers)是一种常用的算法技巧,特别适用于处理数组或链表等线性数据结构的问题。以下是双指针用法的总结: 双指针用法总结 基本概念: 双指针技术使用两个指针在数据结构上进行遍历&a…

SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)

学习本技术第一件事:你为什么要使用,解决什么问题的? 1.为什么使用(使用背景)? 首先应用场景是单体项目,如果是前后端分离就不用关注这个了,因为单体项目你前后端都是写在一个项目…

关于决策树的一些介绍(二)

我之前写过一篇关于决策树的文章,但在那篇文章里没有提及基尼系数,信息熵与信息增益等相关问题,所以我将在这篇文章中进行补充。 一、 决策树的一份python代码 首先,我先给出一份最基础的决策树代码,在这里&#xff…

在 Python 画图中同时设置中英文字体

前言 在使用matplotlib.pyplot画图时,默认情况下都是黑体字,很不美观。如果含有中文,可能无法显示;显示了中文之后英文字体就不能使用。本文针对这些问题逐一给出解决方案。 同时设置中英文字体 我们都知道,按照下面的…

00898 互联网软件应用与开发自考复习

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 识记:要求考生能够识别和记忆本课程中有关互联网软件开发与应用的概念性内容,并能够根据考核的不同要求,做出正确的表述、选择和判断。领会…

合资油车断崖式崩盘,买车的千万慎重了

文 | AUTO芯球 作者 | 雷慢 合资车,燃油车全体大逃亡的时候来了, 你敢信吗,8月份,国内新能源汽车零售渗透率达到54%, 我给大家讲个冷笑话, 几个月前还有车企老总说什么, “只要传统车企一发…

linux 操作系统下的curl 命令介绍和使用案例

linux 操作系统下的curl 命令介绍和使用案例 1. curl 命令简介 curl 是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,是综合传输工具,但传输的协议主要是 HTTP/HTTPS 和 FTP。curl 还支持很多种类型的服务器认证方式&#…

网络(三)——协议是什么???

文章目录 协议的概念结构化数据网络计算机服务端定制协议客户端代码 协议的概念 计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。 结构化数据 我们知道TCP是面向…

Linux基础---07文件传输(网络和Win文件)

Linux文件传输地图如下,先选取你所需的场景,若你是需要Linux和Linux之间传输文件就查看SCP工具即可。 一.下载网站文件 前提是有网: 检查网络是否畅通命令:ping www.baidu.com,若有持续的返回值就说明网络畅通。Ctr…

请查收《网安问答秘籍》

在数字化日益普及的今天,网络安全威胁层出不穷,保护个人隐私和数据安全成为每个人的必修课。秘籍精选了最实用的网络安全问答,广大群众及时了解网络安全知识,提升网络安全意识,有效防范网络诈骗,确保个人信…

获取无人机经纬度是否在指定禁飞区内

1. 计算公式: (AB X AE ) * (CD X CE) >= 0 && (DA X DE ) * (BC X BE) >= 0 参考: 判断点是否在矩形框(多边形)内_qt opencv 判断一点是否在矩形内-CSDN博客 2.测试结果: 3.实现完整代码: #include<cstd