JavaWeb---三层架构

news2024/11/14 15:08:19

文章目录

  • 1. 为什么需要分层?
  • 2.软件设计中的分层模式
  • 3.分层
  • 4.三层架构:显示层、业务逻辑层、数据访问层
  • 3. 案例:利用三层架构原理实现编写web程序的流程

摘自:https://blog.csdn.net/qq_64001795/article/details/124112824

1. 为什么需要分层?

业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护,采用三层软件设计架构后,软件系统在可扩展性和可复用性方面得到极大提高,

2.软件设计中的分层模式

分层模式是最常见的一种架构模式;甚至可以说分层模式是很多架构模式的基础。
在这里插入图片描述

3.分层

①分层模式是将解决方案的组件分隔不同的层中(分工合作,细化)
②每一层的组件应保持内聚性(部门之间常联系)
③每一层都应与其下面的各层保持松耦合

4.三层架构:显示层、业务逻辑层、数据访问层

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 案例:利用三层架构原理实现编写web程序的流程

login.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action ="doLogin.jsp" method = "post">
        账户: <input type = "text" name = "username"/>
        <br><br>
        密码:  <input type = "password" name = "password"/>
        <br><br>
        <input type = "submit" value = "登录"/>
    
    
    </form>
</body>
</html>

dologin.jsp页面

<%@page import="com.zking.news.biz.impl.UsersBizImpl"%>
<%@page import="com.zking.news.biz.IUsersBiz"%>
<%@page import="com.zking.news.entity.Users"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    
    <%
        //设置request编码
        request.setCharacterEncoding("utf-8");
    
        //获取表单值
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        
        //实体封装
        Users users = new Users(username,password);
        
        //调用业务逻辑层
        IUsersBiz iub = new UsersBizImpl();
        Users u = iub.usersLogin(users);
        
        if(u!=null){
            session.setAttribute("users", u);
            out.println("ok");
        }else{
            out.println("no");
        }
            
    %>
    

biz包---->impl包---->UsersBizImpl.java

package com.zking.news.biz.impl;
 
import java.sql.Connection;
 
import com.zking.news.biz.IUsersBiz;
import com.zking.news.dao.IUserDao;
import com.zking.news.dao.impl.UsersDaoImpl;
import com.zking.news.entity.Users;
import com.zking.news.utils.DBHelper;
//目前阶段   业务逻辑层的实现类  直接拿数据访问层的数据操作即可
public class UsersBizImpl implements IUsersBiz {
    //直接实例化数据访问层的dao即可
    private IUserDao iud = new UsersDaoImpl();
 
    @Override
    public Users usersLogin(Users users) {
        
        Connection con = DBHelper.getConn();
        //复杂处理  sql = select * from tb_users where username = ?
        //怎么数据
        return iud.usersLogin(users);
    }
 
}

biz包---->IUsersBiz.java

package com.zking.news.biz;
 
import com.zking.news.entity.Users;
 
public interface IUsersBiz {
    /**
     * 方法功能:用户登录
     * @param Users users 用户实体(封装账户和密码)
     * @return Users users 数据库中返回的实体(方便session保存)
     */
    Users usersLogin(Users users);
    
    
}

Dao包---->Impl包---->UsersDaoImpl.java

package com.zking.news.dao.impl;
 
import java.sql.ResultSet;
 
import com.zking.news.dao.IUserDao;
import com.zking.news.entity.Users;
import com.zking.news.utils.BaseDao;
import com.zking.news.utils.DBHelper;
 
public class UsersDaoImpl extends BaseDao implements IUserDao {
 
    @Override
    public Users usersLogin(Users users) {
        Users u = null;//存储数据库中返出来的用户实体
        //用户登录的sql语句
        String sql = "select * from tb_t281_news_users where username = ? and password = ?";
        //调用Basedao中的通用查询方法  返回一个结果集对象
        ResultSet rs = this.executeQuery(sql, new Object[] {
                users.getUsername(),
                users.getPassword()
        });
        try {
            //判断结果集是否存在记录
            if(rs.next()) {//存在记录
                u = new Users(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6), rs.getInt(7), rs.getString(8));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.myClose(conn, ps, rs);
        }
        return u;
    }
 
    
    
    public static void main(String[] args) {
        Users usersLogin = new UsersDaoImpl().usersLogin(new Users("admin", "123"));
        System.out.println(usersLogin);
    }
}

Dao包---->IUserDao.java

package com.zking.news.dao;
 
import com.zking.news.entity.Users;
 
/**
 * 数据访问层接口
 * @author Administrator
 *
 */
public interface IUserDao {
 
    
    /**
     * 方法功能:用户登录
     * @param Users users 用户实体(封装账户和密码)
     * @return Users users 数据库中返回的实体(方便session保存)
     */
    Users usersLogin(Users users);
    
}

entity包

package com.zking.news.entity;
 
/**
 * 用户实体
 * 
 * @author Administrator
 *
 *         数据表中的字段及类型以及字段的名称 与 实体类一一对应
 *
 *
 */
public class Users {
 
    private int userid;
    private String username;
    private String password;
    private String usex;
    private String uaddress;
    private String utelphone;
    private int urole;
    private String udate;
 
    public Users() {
        // TODO Auto-generated constructor stub
    }
    
    
    
 
    public Users(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
 
 
 
 
    public Users(String username, String password, String usex, String uaddress, String utelphone, int urole,
            String udate) {
        super();
        this.username = username;
        this.password = password;
        this.usex = usex;
        this.uaddress = uaddress;
        this.utelphone = utelphone;
        this.urole = urole;
        this.udate = udate;
    }
 
    public Users(int userid, String username, String password, String usex, String uaddress, String utelphone,
            int urole, String udate) {
        super();
        this.userid = userid;
        this.username = username;
        this.password = password;
        this.usex = usex;
        this.uaddress = uaddress;
        this.utelphone = utelphone;
        this.urole = urole;
        this.udate = udate;
    }
 
    public int getUserid() {
        return userid;
    }
 
    public void setUserid(int userid) {
        this.userid = userid;
    }
 
    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 getUsex() {
        return usex;
    }
 
    public void setUsex(String usex) {
        this.usex = usex;
    }
 
    public String getUaddress() {
        return uaddress;
    }
 
    public void setUaddress(String uaddress) {
        this.uaddress = uaddress;
    }
 
    public String getUtelphone() {
        return utelphone;
    }
 
    public void setUtelphone(String utelphone) {
        this.utelphone = utelphone;
    }
 
    public int getUrole() {
        return urole;
    }
 
    public void setUrole(int urole) {
        this.urole = urole;
    }
 
    public String getUdate() {
        return udate;
    }
 
    public void setUdate(String udate) {
        this.udate = udate;
    }
 
    @Override
    public String toString() {
        return "Users [userid=" + userid + ", username=" + username + ", password=" + password + ", usex=" + usex
                + ", uaddress=" + uaddress + ", utelphone=" + utelphone + ", urole=" + urole + ", udate=" + udate + "]";
    }
 
}

utils包(BaseDao和DBHelper

package com.zking.news.utils;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
public class BaseDao {
    //protected 访问控制符    受保护的
    protected Connection conn =null;
    protected PreparedStatement ps = null;
    protected ResultSet rs = null;
    
 
    /**
     * 方法功能:通用增删改方法
     */
    public int executeUpdate(Connection conn,String sql,Object...x) {
        int n = 0;
        try {
            // a.获取数据库连接
            conn = DBHelper.getConn();
            // b.sql传入方法返回执行对象
            ps = conn.prepareStatement(sql);
            //新增的sql语句  有占位符  
            if(null!=x) {
                //拿到可变参数中的2个值
                for(int i = 0;i<x.length;i++) {
                    //System.out.println(x[i]);
                    ps.setObject(i+1, x[i]);
                }
            }
            n = ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBHelper.myClose(conn, ps, null);
        }
        
        return n;
        
    }
    
    
    /**
     * 方法功能:通用查询     查询所有  查询一个   模糊查询
     */
    public ResultSet executeQuery(String sql,Object...x) {
        try {
            // a.获取数据库连接
            conn = DBHelper.getConn();
            // b.sql传入方法返回执行对象
            ps = conn.prepareStatement(sql);
            //新增的sql语句  有占位符  
            if(null!=x) {
                //拿到可变参数中的2个值
                for(int i = 0;i<x.length;i++) {
                    //System.out.println(x[i]);
                    ps.setObject(i+1, x[i]);
                }
            }
            rs = ps.executeQuery();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //不能关闭    通用的查询base方法  不能实现数据库关闭
            //DBHelper.myClose(conn, ps, null);
        }
        
        return rs;
        
    }
        
}
package com.zking.news.utils;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
/**
 * 数据库帮助类
 * 
 * @author Administrator
 *
 */
public class DBHelper {
 
    private static final String URL = "jdbc:oracle:thin:@localhost:1521:orcl";
 
    // 1.加载驱动 静态代码块进行封装 优先级别最高(静态代码块>普通代码块>构造函数)
    static {
        try {
            // OracleDriver
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    // 2.建立数据库连接
    public static Connection getConn() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(URL, "scott", "123");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
 
    public static void main(String[] args) {
        // System.out.println(DBHelper.getConn());
    }
 
    // 3.关闭服务
    /**
     * 方法功能:数据库服务关闭
     * 
     * @param conn
     *            连接对象
     * @param ps
     *            执行对象
     * @param rs
     *            结果集对象
     */
    public static void myClose(Connection conn, PreparedStatement ps, ResultSet rs) {
        try {
            if (null != conn && !conn.isClosed()) {
                conn.close();
            }
            if (null != ps) {
                ps.close();
            }
            if (null != rs) {
                rs.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
}

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

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

相关文章

Qt日志输出及QsLog日志库

目录 Qt日志输出及QsLog日志库日志输出格式化日志普通格式化条件格式化环境变量设置格式化日志输出位置日志输出对象信息禁用输出 QsLog日志库使用方法1. 将QsLog目录添加到项目中2. 配置CMakeLists.txt文件3. 配置.pro文件4. 日志记录器的配置5. 运行程序6. 启用行号和文件名C…

Why is OpenAI image generation Api returning 400 bad request in Unity?

题意&#xff1a;为什么 OpenAI 图像生成 API 在 Unity 中返回 400 Bad Request 错误&#xff1f; 问题背景&#xff1a; Im testing out dynamically generating images using OpenAI API in Unity. Amusingly, I actually generated most of this code from chatGPT. 我正在…

idea中.git文件夹存在但是没有git功能列表

1.问题&#xff1a; 该项目中已经将.git文件夹置入了&#xff0c;但是idea中却没有git相关的功能列表&#xff0c;如图&#xff1a; 2.解决办法&#xff1a; 在【文件】-【设置】-【版本控制】-【目录映射】中添加目录映射应用就好了 &#xff08;【File】 -> 【S…

网络资源模板--Android Studio 图书借阅App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--图书借阅App 二、项目测试环境 三、项目详情 首页 这段代码是一个 Android 应用的 MainActivity 类&#xff0c;功能简要总结如下&#xff1a; 1. **界面设置**&#xf…

Hutool:Java开发者的瑞士军刀

有想念&#xff0c;才是团圆&#xff1b;在一起&#xff0c;便是中秋。 在Java的世界里&#xff0c;有这样一个工具库&#xff0c;它小巧而强大&#xff0c;功能丰富且易于使用&#xff0c;它就是Hutool。Hutool是一个Java工具包&#xff0c;旨在减少Java开发人员在开发过程中…

Oracle数据库逻辑与物理结构操作

一、实验步骤 1、查询所有DBA和USER开头的静态数据字典 2、查询所有V$动态性能视图 3、查询当前数据库中的表空间信息 ①查询和TABLESPACE相关的数据字典 ②通过动态性能视图查询表空间信息 ③通过数据字典查询表空间信息 4、操作数据文件 &#xff08;1&#xff09;向 ORC…

JavaWeb JavaScript 11.XML —— 配置文件

生活想埋没我&#xff0c;没想到我是颗种子 —— 24.9.19 一、XML 1.什么是XML XML是EXtensible Markup Languge的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签 可扩展 三个字…

网络:UDP协议

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言UDP协议报头和有效载荷分离的问题有效载荷向上交付的问题&#xff0c;也就是交给哪个进程&#xff1f;怎么确定把报文收全了&#xff1f;UDP报头是如何封装的呢&…

JavaWeb纯小白笔记02:Tomcat的使用:发布项目的三种方式、配置虚拟主机、配置用户名和密码

通过Tomcat进行发布项目的目的是为了提供项目的访问能力&#xff1a;Tomcat作为Web服务器&#xff0c;能够处理HTTP请求和响应&#xff0c;将项目的内容提供给用户进行访问和使用。 一.Tomcat发布项目的三种方式&#xff1a; 第一种&#xff1a;直接在Tomcat文件夹里的webapp…

数学建模 第一讲 - 概论

一、什么是数学模型 一个栗子 例 1.1 一只装满水的圆柱型桶&#xff0c;底半径为 1米&#xff0c;高为 2米&#xff0c;底部有一直径为 0.1 米的洞。问桶流空要多少时间? 数学模型是对于一个特定的对象为了一个特定目标&#xff0c;根据事物的内在规律&#xff0c;作出一些必…

防止用户过于轻松采集网页内容的方法

面对AI&#xff0c;所有禁止采集网页内容的功能都是徒劳&#xff0c;最不济截图后采集文字总简单了吧&#xff1f;能做的就是增加一点点人工采集的难度。 以下总结一下 一、注册用户 必须注册才能浏览全部内容&#xff0c;那么这样就可以针对用户控制其浏览次数&#xff0c;浏…

ActiveMQ、RabbitMQ 和 Kafka 在 Spring Boot 中的实战

在现代的微服务架构和分布式系统中&#xff0c;消息队列 是一种常见的异步通信工具。消息队列允许应用程序之间通过 生产者-消费者模型 进行松耦合、异步交互。在 Spring Boot 中&#xff0c;我们可以通过简单的配置来集成不同的消息队列系统&#xff0c;包括 ActiveMQ、Rabbit…

多层感知机paddle

多层感知机——paddle部分 本文部分为paddle框架以及部分理论分析&#xff0c;torch框架对应代码可见多层感知机 import paddle print("paddle version:",paddle.__version__)paddle version: 2.6.1多层感知机&#xff08;MLP&#xff0c;也称为神经网络&#xff0…

QEMU:模拟 ARM 大端字节序运行环境

文章目录 1. 前言2. ARM 大小端模拟测试2.1 裸机模拟测试2.1.1 大端模拟测试2.1.2 小端模拟测试 2.2 用户空间模拟测试2.2.1 大端模拟测试2.2.2 小端模拟测试 2.3 结论 3. 参考链接 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&…

leetcode刷题3

文章目录 前言回文数1️⃣ 转成字符串2️⃣ 求出倒序数再比对 正则表达式匹配[hard]1️⃣ 动态规划 盛最多水的容器1️⃣ 遍历分类2️⃣ 双指针贪心 最长公共前缀1️⃣ 遍历&#xff08;zip解包&#xff09; 三数之和1️⃣ 双指针递归 最接近的三数之和1️⃣ 迭代一次双指针 电…

携手阿里云CEN:共创SD-WAN融合广域网

在9月19日举行的阿里云云栖大会上&#xff0c;犀思云作为SD-WAN领域的杰出代表及阿里云的SD-WAN重要合作伙伴&#xff0c;携手阿里云共同推出了创新的企业上云方案——Fusion WAN智连阿里云解决方案。这一创新方案不仅彰显了犀思云在SD-WAN技术领域的深厚积累&#xff0c;更体现…

前端web端项目运行的时候没有ip访问地址

我们发现 没有netWork 的地址 导致 团队内其他同学无法打开我们的地址 进行访问 在page.json 中的运行 指令中 添加 --host 记得加上空格 这样我们就可以看到这个地址了 团队其他同学 就可以访问我们这个地址了

Resnet50网络——口腔癌病变识别

一 数据准备 1.导入数据 import matplotlib.pyplot as plt import tensorflow as tf import warnings as w w.filterwarnings(ignore) # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负…

2024华为杯研究生数学建模竞赛(研赛)选题建议+初步分析

难度&#xff1a;DE<C<F&#xff0c;开放度&#xff1a;CDE>F。 华为专项的题目&#xff08;A、B题&#xff09;暂不进行选题分析&#xff0c;不太建议大多数同学选择&#xff0c;对自己专业技能有很大自信的可以选择华为专项的题目。后续会直接更新A、B题思路&#…

计算机网络传输层---课后综合题

线路&#xff1a;TCP报文下放到物理层传输。 TCP报文段中&#xff0c;“序号”长度为32bit&#xff0c;为了让序列号不会循环&#xff0c;则最多能传输2^32B的数据&#xff0c;则最多能传输&#xff1a;2^32/1500B个报文 结果&#xff1a; 吞吐率一个周期内传输的数据/周期时间…