分层
统MVC架构
- 优点:清晰方便调用
- 缺点:模型层分层太粗,融合了数据处理、业务处理等所有的功能。核心的复杂业务逻辑都放到模型层,导致模型层很乱
- 适应场景:后端业务逻辑简单的服务,比如接口直接提供对数据库增删改查
书写数据库mysql
#判断存在即删除数据库
drop database if exists mydb;
#创建数据库
create database mydb;
#使用数据库
use mydb;
#创建表
create table t_user
(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);
insert into t_user(username,password,phone,address) values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小美','123','18565234759','信阳');
select * from t_user where username=? and password=?
select * from t_user;
create table t_goods
(
gid int primary key auto_increment,
gname varchar(20),
price double,
mark varchar(100)
);
insert into t_goods(gname,price,mark) values('泡面',4.5,'够香够辣就是这个味!');
insert into t_goods(gname,price,mark) values('火腿',8.5,'肉质细腻Q弹!');
insert into t_goods(gname,price,mark) values('雪碧',3.5,'清爽冰凉随心爽!');
select * from t_goods;
创建模型层 User.java 用户实体类
package com.gao.bean;
/*对应用户的实体类*/
public class User {
private Integer uid;
private String username;
private String password;
private String phone;
private String address;
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
}
创建模型层 Goods.java 用户实体类
package com.gao.bean;
public class Goods {
private Integer gid;
private String gname;
private double price;
private String mark;
@Override
public String toString() {
return "Goods{" +
"gid=" + gid +
", gname='" + gname + '\'' +
", price=" + price +
", mark='" + mark + '\'' +
'}';
}
public Integer getGid() {
return gid;
}
public void setGid(Integer gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getMark() {
return mark;
}
public void setMark(String mark) {
this.mark = mark;
}
}
页面布局jsp
<html>
<head>
<title>这是第一个Web页面</title>
</head>
<body>
<h2>首页</h2>
<a href="denglu.jsp">去登录</a>
<a href="register.jsp">去注册</a>
</body>
</html>
主页界面布局
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>zhuce</title>
</head>
<body>
<h3>正在进行注册</h3>
<form action="register" method="post">
账号:<input type="text" name="username" value=""> <br>
密码:<input type="password" name="password" value=""> <br>
电话:<input type="text" name="phone" value=""> <br>
地址:<input type="text" name="address" value=""> <br>
<input type="submit" value="注册">
<a href="denglu.jsp">已有账号? 去登录</a>
</form>
</body>
</html>
登陆页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页</title>
</head>
<body>
<h2>登录</h2>
<form action="login" method="post">
账号: <input type="text" name="username" value=""><br>
密码: <input type="password"name="password" value=""><br>
<input type="submit" value="登录">
<a href="register.jsp">没有账号,点击注册</a>
</form>
</body>
</html>
错误页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登陆失败跳转到测试页</title>
</head>
<body>
<h3>${error_msg}</h3>
<a href="denglu.jsp">返回登录</a>
</body>
</html>
主页商品页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<%--<%--%>
<%-- //获取session--%>
<%-- HttpSession session1=request.getSession();--%>
<%-- User user= (User) session1.getAttribute("user");--%>
<%--%>--%>
<%--El表达式,通过${}从作用域对象中获取数据是对象,则可以通过对象名.属性名获取其数据--%>
<h2>欢迎来自${user.address}的${user.username}访问项目的主页</h2>
<table>
<thead>
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品说明</th>
<th>操作</th>
</tr>
</thead>
<a href="addGoods.jsp">添加商品</a>
<tbody id="List">
<%--${goodsList}
item: 要遍历的集合对象(写El表达式) var:要集合中对应临时对象--%>
<c:forEach items="${goodsList}" var="goods">
<tr>
<td>${goods.gid}</td>
<td>${goods.gname}</td>
<td>${goods.price}</td>
<td>${goods.mark}</td>
<td><a href="#">修改</a>
<a href="dell?gid=${goods.gid}">删除</a></td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
连接数据库util
package com.gao.util;
import com.gao.servlet.Register;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCUtil {
static String driver = "com.mysql.cj.jdbc.Driver"; // 定义数据库驱动类名
static String url = "jdbc:mysql:///mydb?useSSL=false&serverTimezone=UTC"; // 定义数据库连接 URL
static String username = "root"; // 定义数据库用户名
static String password = "123456"; // 定义数据库密码
static Connection conn = null; // 定义连接对象,初始值为 null
public static Connection getCon() { // 定义获取连接对象的方法
try {
Class.forName(driver); // 加载数据库驱动程序
conn = DriverManager.getConnection(url, username, password); // 获取连接对象
} catch (Exception e) { // 处理异常
e.printStackTrace();
}
return conn; // 返回连接对象
}
//资源回收方法
// public static void colse(Register rs, PreparedStatement pstm, Connection con) throws SQLException { // 定义关闭 ResultSet、PreparedStatement 和 Connection 对象的方法
// if (rs != null) { // 如果 ResultSet 对象不为空
// rs.close(); // 关闭 ResultSet 对象
// }
// if (pstm != null) { // 如果 PreparedStatement 对象不为空
// pstm.close(); // 关闭 PreparedStatement 对象
// }
// if (con != null) { // 如果 Connection 对象不为空
// con.close(); // 关闭 Connection 对象
// }
// }
// public static void colse(PreparedStatement pstm, Connection con) throws SQLException { // 定义关闭 PreparedStatement 和 Connection 对象的方法
// if (pstm != null) { // 如果 PreparedStatement 对象不为空
// pstm.close(); // 关闭 PreparedStatement 对象
// }
// if (con != null) { // 如果 Connection 对象不为空
// con.close(); // 关闭 Connection 对象
// }
// }
}
登陆界面继承httpservlet类
package com.gao.servlet;
import com.gao.bean.Goods;
import com.gao.bean.User;
import com.gao.dao.GoodsDao;
import com.gao.dao.UserDao;
import com.gao.dao.impl.UserDaoimpl;
import com.gao.util.JDBCUtil;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
public class denglu extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1,设置响应的编码格式,以及响应的格式
req.setCharacterEncoding("utf-8");//设置请求的编码格式为中文
//从请求中获取用户提交的参数(数据)
resp.setCharacterEncoding("utf-8");//设置响应的编码格式
resp.setContentType("text/html;charset=utf-8"); //以什么样的格式(文本/网页)响应
//2,获取请求的参数
String username = req.getParameter("username");//根据表单的name属性获取用户输入的值
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
//3,执行业务处理
Connection connection=null;//数据库的连接对象
PreparedStatement pstm=null;//预处理对象
ResultSet rs=null;//结果集对象
User gog=null;
try{
connection= JDBCUtil.getCon();
//3,定义登录的sql语句
String sql="select*from t_user where username=? and password=?";
//4,获取预处理对象
pstm = connection.prepareStatement(sql);
//5,传参
pstm.setObject(1,username);
pstm.setObject(2,password);
//6,执行查询
rs=pstm.executeQuery();
//7,解析结果集
if(rs.next()){
gog=new User();
//从结果集中获取数据,封装到实体类对象中
int uid=rs.getInt("uid");
gog.setUid(uid);
gog.setUsername(rs.getString("username"));
gog.setPassword(rs.getString("password"));
gog.setPhone(rs.getString("phone"));
gog.setAddress(rs.getString("address"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
//8,关闭资源
try{
if(rs!=null){
rs.close();
}
if(pstm!=null){
pstm.close();
}
if(connection!=null){
connection.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
// //3,执行业务处理---jdbc操作
// UserDaoimpl userDaoimpl=new UserDaoimpl();
// User login=userDaoimpl.Login(username,password);
//判断登录的用户信息是否为空
if (gog!=null){
//登录成功,当前servlet的业务处理完毕
System.out.println("登录成功!");
//把用户信息存储到session中
HttpSession session=req.getSession();
session.setAttribute("user",gog);
//登陆成功 当前servlet的业务处理完毕----后续执行查询商品的操作应该由别人来完成---请求转发给别的servlet处理
req.getRequestDispatcher("servletAllGoods").forward(req,resp); //使用字符集合给前端做出响应
}else {
//登陆失败 返回登陆
req.setAttribute("error_msg","用户名或密码错误!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
}
}
}
goodsdao把商品信息封装到集合中
package com.gao.dao;
import com.gao.bean.Goods;
import com.gao.bean.User;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class GoodsDao {
//连接数据库的四大参数
static String driver = "com.mysql.cj.jdbc.Driver"; // 定义数据库驱动类名
static String url = "jdbc:mysql:///mydb?useSSL=false&serverTimezone=UTC"; // 定义数据库连接 URL
static String username = "root"; // 定义数据库用户名
static String password = "123456"; // 定义数据库密码
static Connection conn = null; // 定义连接对象,初始值为 null
Connection connection=null;//数据库的连接对象
PreparedStatement pstm=null;//预处理对象
ResultSet rs=null;//结果集对象
private int row=0;
public List<Goods> selectAll() {
List<Goods> goodsList = new ArrayList<>();
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, username, password);
String sql = "select * from t_goods";
pstm = conn.prepareStatement(sql);
rs = pstm.executeQuery();
while (rs.next()) {
//从结果集中获取数据,封装到goodf对象中
Goods goods = new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
//把当前行对应的对象存储到集合中
goodsList.add(goods);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs!=null){
rs.close();
}
if (pstm != null) {
pstm.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return goodsList;
}
}
servletAllGoods
package com.gao.servlet;
import com.gao.bean.Goods;
import com.gao.dao.GoodsDao;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;
@WebServlet("/servletAllGoods")
public class servletAllGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("SelectAllGoods...dopost");
//查询所有商品信息
GoodsDao goodsDao=new GoodsDao();
List<Goods> goodsList=goodsDao.selectAll();
System.out.println(goodsList);
//把数据传递到前端页面
HttpSession session=request.getSession();
//向session中存入商品信息集合
session.setAttribute("goodsList",goodsList);
//登录成功,跳转到主页
response.sendRedirect("zhuye.jsp");
}
}
userdao接口
package com.gao.dao;
import com.gao.bean.User;
public interface UserDao {
/*
* 完成登陆操作
* username用户名
* password密码
* return 数据库查询的用户信息对象*/
public User Login(String username, String password);
public int register(User user);
}
作用域删除 添加
一、pageContext(page域)
page域指当前页面
作用范围:作用范围是整个JSP页面,是四大作用域中最小的一个
二、request(request域)
-
request是指一次请求,即当用户访问web服务器的时候,web服务器会生成
- requestresponse和对象,然后在 service法调用,完成用户的请求和对用户的响
- 应。
- 作用范围:请求间。
三、session(session域)
-
session是指一次会话,当用户首次访问服务器时,服务器会根据每一个浏览器的请求创建一个session对象,每个用户有且仅有一个session对象,相当于身份证,保存在服务器中,借助 cookie
- 技术来传递id属性,就可以在每次访问中找到自己的 session.
- 作用范围:作用范围是会话间
四、application(ServletContext域)
-
application即是 servlet的ServeltContext。
- 作用范围:整个Web应用。
- 作用:应用程序中
添加删除主页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--- el表达式是通过$ { } 从作用域对象中自动获取数据,如果是对象可以通过.访问其属性-->
<h2>欢迎来自${user.address}的${user.username}来到二次元的世界</h2>
<a href="addGoods.jsp">添加商品</a>
<table>
<thead>
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
<th>商品说明</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${goodsList}" var="goods">
<tr>
<td>${goods.gid}</td>
<td>${goods.gname}</td>
<td>${goods.price}</td>
<td>${goods.mark}</td>
<td>
<a href="#">修改</a>
<a href="del?gid=${goods.gid}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
<%-- <%--%>
<%-- //获取session对象--%>
<%-- HttpSession session1=request.getSession();--%>
<%-- //从session对象中获得集合--%>
<%-- List<Goods> goodsList= (List<Goods>) session1.getAttribute("goodsList");--%>
<%-- for (Goods goods:goodsList){--%>
<%-- %>--%>
<%-- <tr>--%>
<%-- <td><%=goods.getGid()%></td>--%>
<%-- <td><%=goods.getGname()%></td>--%>
<%-- <td><%=goods.getPrice()%></td>--%>
<%-- <td><%=goods.getMark()%></td>--%>
<%-- </tr>--%>
<%-- <%--%>
<%-- }--%>
<%-- %>--%>
</table>
</body>
</html>
添加页面
<%--
Created by IntelliJ IDEA.
User: Dell
Date: 2023/2/23
Time: 12:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>添加商品</title>
</head>
<body>
<h2>商品信息录入</h2>
<form action="addGoods" method="post">
商品名称:<input type="text" name="gname" value="" placeholder="商品名称"></br>
商品价格:<input type="number" name="price" step="0.01" value="" placeholder="商品价格"><br>
商品说明:<input type="text"name="mark" placeholder="商品说明">
<input type="submit" value="提交">
</form>
</body>
</html>
Java代码
package com.yang.servlet;
import com.yang.bean.Goods;
import com.yang.dao.GoodsDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/addGoods")
public class AddGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
Goods goods=new Goods();
goods.setGname(request.getParameter("gname"));
goods.setPrice(Double.parseDouble(request.getParameter("price")));
goods.setMark(request.getParameter("mark"));
GoodsDao goodsDao=new GoodsDao();
int row=goodsDao.add(goods);
if (row>0){
System.out.println("添加成功");
request.getRequestDispatcher("SelectAllGoods").forward(request,response);
}else{
request.setAttribute("error_msg","添加商品失败");
request.getRequestDispatcher("error.jsp").forward(request,response);
}
}
}
删除Java代码
package com.yang.servlet;
import com.yang.bean.Goods;
import com.yang.dao.GoodsDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/del")
public class DelGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int gid=Integer.parseInt(request.getParameter("gid"));
GoodsDao goodsDao=new GoodsDao();
int row= goodsDao.del(gid);
if (row>0){
request.getRequestDispatcher("selectAllGoods").forward(request,response);
}else{
request.setAttribute("error_msg","删除出现了错误");
request.getRequestDispatcher("error.jsp").forward(request,response);
}
}
}
运行结果
登录界面
注册界面
商品信息展示界面
数据库账户密码数据运行页面
数据库商品信息展示界面
主页的重新布局实现添加删除操作
添加商品信息界面
商品添加成功
点击删除界面在没有实现跳转直接在本页面实现一个刷新把数据库重新查询
1. HTTP 协议介绍
基本介绍:
- HTTP(Hyper Text Transfer Protocol): 全称超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
- HTTP 是一种应用层协议,是基于 TCP/IP 通信协议来传递数据的,其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0
- 协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。
- 注意: 当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。HTTPS 将在本文末尾具体介绍
http是无状态的,不记录用户信息
2. HTTP 协议的工作过程
当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。
基础术语:
客户端: 主动发起网络请求的一端
服务器: 被动接收网络请求的一端
请求: 客户端给服务器发送的数据
响应: 服务器给客户端返回的数据
HTTP 协议的重要特点: 一发一收,一问一答
注意: 网络编程中,除了一发一收之外,还有其它的模式
多发一收:例如上传大文件
- 一发多收:例如看直播时,搜索一个词条可以得到多个视频源
- 多发多收:例如串流(steam link、moonlight 等等)