基于MVC模式和分层模式完成登录和注册

一.概念(MVC)

1.什么是 mvc ?

MVC模式是 软件工程 中的一种 软件架构 模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

View:视图,为用户提供使用界面,与用户直接进行交互。
Model:模型,承载数据,并对用户提交请求进行计算的模块。其分为两类: 一类称为数据承载 Bean:实体类,专门用户承载业务数据的,如 Student、User 等 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理用户提交请求的。
Controller:控制器,用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。

基于MVC模式和分层模式完成登录和注册_第1张图片

 2.MVC 架构程序的工作流程:
(1)用户通过 View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX             请求等
(2)服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的 Model 对             用户请求进行处理
(3)Model 处理后,将处理结果再交给 Controller
(4)Controller 在接到处理结果后,根据处理结果找到要作为向客户端发回的响应               View 页面。页面经渲染(数据填充)后,再发送给客户端。

3.优点:关注前后端分离
4.缺点:模型层分层太粗,融合了数据处理、业务处理等所有的功能。核心的复杂业务逻辑都放到                模型层,导致模型层很乱
5.适应场景:后端业务逻辑简单的服务,比如接口直接提供对数据库增删改查

一.概念(分层)

1.为什么分层 ?

1)分层架构是将软件模块按照水平切分的方式分成多个层,一个系统由多层组成,每层由多个模块组成。同时,每层有自己独立的职责,多个层次协同提供完整的功能。

2)如果系统没有分层,当业务规模增加或流量增大时我们只能针对整体系统来做扩展。分层之后可以很方便的把一些模块抽离出来,独立成一个系统。

2.特点

  • 高内聚:分层的设计可以简化系统设计,让不同的层专注做某一模块的事
  • 低耦合:层与层之间通过接口或API来交互,依赖方不用知道被依赖方的细节
  • 复用:分层之后可以做到很高的复用
  • 扩展性:分层架构可以让我们更容易做横向扩展

3.后端三层架构

三层架构是指:视图层 View、服务层 Service,与持久层 Dao。它们分别完成不同的功能。
View 层:用于接收用户提交请求的代码在这里编写。
Service 层:系统的业务逻辑主要在这里完成。
Dao 层:直接操作数据库的代码在这里编写。

基于MVC模式和分层模式完成登录和注册_第2张图片

优点:逻辑与数据层分离
缺点:模型层分层比较粗,核心的复杂业务逻辑都放到模型层,导致模型层很乱
适应场景:后端业务逻辑简单的服务,比如接口直接提供对数据库增删改查

二.jstl标签和EL标签

JSTL

1.JSTL是Java中的一个定制标记库集。JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

2.jstl标签:在页面导入jstl的核心类库

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3.为什么使用 ?

1)实现了JSP页面的代码复用。

2)书写JSP页面时可读性更强。

3)在应用程序服务器之间提供了一致的接口,最大程度地提高了WEB应用在各应用服务器之间的移植。

4)简化了JSP和WEB应用程序的开发。

EL

1.概念

 EL 表达式的全称:Expression Language 表达式语言。

 EL 是 JSP 内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象,取得对象属性的值,或执行简单的运算或判断操作。

2.作用

1)EL表达式主要是替换和简化 jsp 页面中表达式脚本在jsp页面中进行数据的输出。

2)EL 表达式仅仅用来读取数据,而不能第数据进行修改。

3.特点

1)EL 在得到某个数据时,会自动进行数据类型的转换

2)EL 表达式输出数据时,如果有则输出数据,如果为 null 则什么也不输出。

4.语法格式

${表达式}

5.注意事项:

1)jsp 默认是支持 el 表达式的。

2)如果要忽略 el 表达式,有两种方式

3)设置 jsp 中 page 指令中:isELIgnored="true" 忽略当前jsp页面中所有的el表达式

4)\${表达式}:这种方式忽略当前这个 el 表达式,会在当前页面呈现原有格式。

 

二.代码

1.书写数据库

#判断存在即删除数据库
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;

2.书写实体类

package com.gao.bean;

public class Googs {
    private  Integer gid;
    private String gname;
    private String price;
    private String 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 String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getMark() {
        return mark;
    }

    public void setMark(String mark) {
        this.mark = mark;
    }

    @Override
    public String toString() {
        return "Googs{" +
                "gid=" + gid +
                ", gname='" + gname + '\'' +
                ", price='" + price + '\'' +
                ", mark='" + mark + '\'' +
                '}';
    }
}
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 + '\'' +
                '}';
    }
}

3.首页

<%--
  Created by IntelliJ IDEA.
  User: gt
  Date: 2023/2/15
  Time: 11:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    熊出没


欢迎来到狗熊岭

狗熊岭大门

4.注册、登录页面

<%--
  Created by IntelliJ IDEA.
  User: gt
  Date: 2023/2/15
  Time: 11:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    进入


进入

账号:
密码:
    没有账号?注册一个
<%--
  Created by IntelliJ IDEA.
  User: gt
  Date: 2023/2/18
  Time: 16:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    注册页


注册

账号:
密码:
电话:
地址:
有账号?回去登录!

5.页面跳转

<%--
  Created by IntelliJ IDEA.
  User: gt
  Date: 2023/2/17
  Time: 20:28
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    错误页面


看什么看,出错了

去主页
<%@ page import="java.util.List" %>
<%@ page import="com.gao.bean.Goods" %><%--
  Created by IntelliJ IDEA.
  User: gt
  Date: 2023/2/17
  Time: 20:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


    正确页


<%--EL表达式是通过$ { } 从作用域对象中自动获取数据,如果是对象可以通过.访问其属性--%>

from${user.address}的${user.username}憋瞅了,填对了,还瞅啥

<%--itmes:要便利的集合元素 var:临时变量--%> <%-- <%--%> <%-- //获取session对象--%> <%-- HttpSession session1=request.getSession();--%> <%-- //从session对象中获得集合--%> <%-- List goodsList = (List) session1.getAttribute("goodsList");--%> <%-- //便利集合--%> <%-- for (Goods goods : goodsList){--%> <%-- %>--%> <%-- --%> <%-- --%> <%-- --%> <%-- --%> <%-- --%> <%-- --%> <%-- <%--%> <%-- }--%> <%-- %>--%>
商品编号 商品名称 商品价格 商品说明
${goods.gid} ${goods.gname} ${goods.price} ${goods.mark}
<%=goods.getGid()%>><%=goods.getGname()%>><%=goods.getPrice()%>><%=goods.getMark()%>>

6.页面注册

package com.gao.servlet;

import com.gao.bean.User;
import com.gao.dao.UserDao;

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("/register")
public class Register extends HttpServlet {


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);

    }
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.设置请求和响应的编码
        request.setCharacterEncoding("utf-8");//设置请求的编码格式为中文
        response.setCharacterEncoding("utf-8");//设置响应的编码格式
        response.setContentType("text/html;charset=UTF-8");//以什么样的格式(文本/网页)响应
        //2.获取请求参数
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        String phone=request.getParameter("phone");
        String address=request.getParameter("address");

        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
        user.setPhone(phone);
        user.setAddress(address);

        System.out.println(user);
        //jdbc操作
        UserDao userDao=new UserDao();
        int row=userDao.register(user);

        //做出响应
        if(row>0){
            response.sendRedirect("login.jsp");
        }else {
            response.sendRedirect("register.jsp");
        }
    }
}

7.书写JDBC并完成分层操作以及完成映射关系

package com.gao.dao;

import com.gao.bean.Goods;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class GoodDao {
    private static String driver="com.mysql.cj.jdbc.Driver";
    private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimeZone=UTC";
    private static String user="root";
    private static String password="root";

    private Connection con=null;//数据库连接对象
    private PreparedStatement pstm=null;//预处理对象
    private ResultSet rs=null;//结果集对象
    private int row=0;//增删改受影响行

    public List selectAll() {
        List goodsList = new ArrayList<>();
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(url, user, password);
            String sql = "select * from t_goods;";
            pstm = con.prepareStatement(sql);
            rs = pstm.executeQuery();
            while (rs.next()) {
                //把当前数据行中的数据取出来,存储到Goods对象中
                Goods goods = new Goods();
                goods.setGid(rs.getInt("gid"));
                goods.setGname(rs.getString("gname"));
                goods.setPrice(rs.getString("price"));
                goods.setMark(rs.getString("mark"));
                //把Goods对象储存到集合中
                goodsList.add(goods);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //8.关闭资源
            try {
                if (rs != null) {
                    rs.close();
                }
                if (pstm != null) {
                    pstm.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return goodsList;
        }
    }
}
package com.gao.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JDBCUtil {
    private static String driver="com.mysql.cj.jdbc.Driver";
    private static String url="jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimeZone=UTC";
    private static String user="root";
    private static String password="root";

    private static Connection con=null;

    /**
     * 获取数据库连接对象
     */
    public static Connection getCon(){
        try {
            Class.forName(driver);
            con= DriverManager.getConnection(url,user,password);
        }catch (Exception e){
            e.printStackTrace();
        }
        return con;
    }
    /**
     * 查询的资源关闭
     * rs
     * pstm
     * con
     */
    public static void close(ResultSet rs, PreparedStatement pstm,Connection con){
        try{
            if(rs!=null){
                rs.close();
            }
            if(pstm!=null){
                pstm.close();
            }
            if (con!=null){
                con.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public static void close(PreparedStatement pstm, ResultSet rs) {
        try{
            if(pstm!=null){
                pstm.close();
            }
            if(rs!=null){
                rs.close();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

public int register(User user) {

        try {
            con= JDBCUtil.getCon();
            String sql="insert into t_user(username,password,phone,address)values(?,?,?,?)";
            //获取预处理对象
            pstm=con.prepareStatement(sql);
            //传参
            pstm.setObject(1,user.getUsername());
            pstm.setObject(2,user.getPassword());
            pstm.setObject(3,user.getPhone());
            pstm.setObject(4,user.getAddress());
            //执行
            row=pstm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.close(pstm,rs);
        }
        return row;
    }
}

8.页面登陆

package com.gao.servlet;

import com.gao.bean.Goods;
import com.gao.bean.User;
import com.gao.dao.GoodDao;
import com.gao.dao.UserDao;

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 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;

@WebServlet("/login")
public class login 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 {
        //1.设置请求和响应的编码格式。以及响应的格式
        request.setCharacterEncoding("utf-8");//设置请求的编码格式为中文
        response.setCharacterEncoding("utf-8");//设置响应的编码格式
        response.setContentType("text/html;charset=UTF-8");//以什么样的格式(文本/网页)响应
        //2.获取请求的参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username);
        System.out.println(password);
        //执行业务处理
        UserDao userDao=new UserDao();
        User login= userDao.login(username,password);
        //判断登陆的用户信息是否为空
        if (login!=null){
            System.out.println("登录成功");
            //1.登陆成功后在session中保存用户的个人信息
            HttpSession session = request.getSession();
            session.setAttribute("user",login);

//            GoodDao goodDao=new GoodDao();
//            List goodsList = goodDao.selectAll();
//            System.out.println(goodsList);
            //2.请求转发----登陆业务已经处理完毕,应该做请求转让,让别的servlet执行商品信息的查询
            request.getRequestDispatcher("selectAllGoods").forward(request,response);
        }else{
            //登陆失败,跳转到错误页
            response.sendRedirect("error.jsp");
        }
    }
}

9. 书写JDBC并完成分层

package com.gao.dao;

import com.gao.bean.User;
import com.gao.util.JDBCUtil;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserDao {
    Connection con=null;//数据库连接对象
    PreparedStatement pstm=null;//预处理对象
    ResultSet rs=null;//结果集对象
    User login=null;
    int row=0;

    public User login(String username,String password) {
        try {
            //1.加载数据库驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取数据库连接
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimeZone=UTC","root","root");
            //3.定义登录的sql语句
            String sql="select * from t_user where username=? and password=?";
            //4.获取预处理对象
            pstm = con.prepareStatement(sql);
            //5.传参
            pstm.setObject(1,username);
            pstm.setObject(2,password);
            //6.执行查询
            rs=pstm.executeQuery();
            //7.解析结果集
            if (rs.next()){
                login=new User();
                //从结果集中获取数据,封装到实体类对象中
                int uid=rs.getInt("uid");
                login.setUid(uid);
                login.setUsername(rs.getString("username"));
                login.setPassword(rs.getString("pasasword"));
                login.setPhone(rs.getString("phone"));
                login.setAddress(rs.getString("address"));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            //8.关闭资源
            try{
                if(rs!=null){
                    rs.close();
                }
                if(pstm!=null){
                    pstm.close();
                }
                if (con!=null){
                    con.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return login;
    }

SelectAllGoods

package com.gao.servlet;

import com.gao.bean.Goods;
import com.gao.bean.User;
import com.gao.dao.GoodDao;
import com.gao.dao.UserDao;

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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

@WebServlet("/selectAllGoods")
public class SelectAllGoods extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.设置请求和响应的编码
        request.setCharacterEncoding("utf-8");//设置请求的编码格式为中文
        response.setCharacterEncoding("utf-8");//设置响应的编码格式

        System.out.println("SelectAllGoods~~~~~~~");

        //去查询数据库中商品信息表中的数据
        GoodDao goodDao=new GoodDao();
        List goodsList = goodDao.selectAll();
        System.out.println(goodsList);

        //把商品信息传输到页面中进行展示----此处借用HttpSession传输数据
        HttpSession session = request.getSession();//获取HttpSession对象
        //把查询到的商品信息集合存储到session对象中,起名叫做goodsList
        session.setAttribute("goodsList",goodsList);

        response.sendRedirect("zhuye.jsp");
    }
}

你可能感兴趣的:(mvc,数据库,sql)