软件设计之JavaWeb(3)
此篇应在MySQL之后进行学习:
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷全新JavaWeb教程,企业主流javaweb技术栈
资料可以去尚硅谷官网免费领取
此章节最好学完JDBC观看
学习内容:
- 请求转发与响应重定向
- 路径问题
- 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);
}
}
}
工作流程梳理
标签:SET,请求,utf8mb4,软件设计,----------------------------,--,NULL,JavaWeb From: https://blog.csdn.net/thm19990903/article/details/1421860631、Controller层:接收用户的请求,调用Service层来处理业务逻辑。
2、Service层:执行业务逻辑,调用DAO层来进行数据操作。
3、DAO层:与数据库交互,进行数据的增、删、改、查操作,返回操作结果给Service层。
4、POJO层:封装数据,将数据库中的数据转换为对象形式,并在不同层之间传递。