JavaWeb---三层架构

文章目录

  • 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();@Overridepublic 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 {@Overridepublic 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;}@Overridepublic 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 {// OracleDriverClass.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.xdnf.cn/news/1541112.html

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

相关文章

死锁(详解版)

一、什么是死锁 死锁就是多个线程在运行过程中&#xff0c;都需要获取对方线程所持有的锁&#xff08;资源&#xff09;&#xff0c;导致处于长期无限等待的状态。 二、死锁产生原因 两个线程各自持有不同的锁&#xff0c;然后试图获取对方线程的锁&#xff0c;造成双方无限等待…

聊城网站建设:企业如何打造高效官网

聊城网站建设&#xff1a;企业如何打造高效官网 在互联网飞速发展的今天&#xff0c;官方网站已成为企业展示形象、推广产品、与客户沟通的重要平台。尤其对于聊城地区的企业来说&#xff0c;建立一个高效的官网显得尤为重要。本文将分享一些关键步骤&#xff0c;帮助企业打造一…

如何在Mac上查看剪贴板历史记录

重点摘要 macOS 内建的剪贴簿查看器可以透过 Finder 存取,但只能显示最近一次复制的内容,而且重新开机后就会清除。若要更进阶的剪贴簿管理,第三方 app 像是 CleanClip 提供了强大的功能和更好的组织方式。CleanClip 提供了全方位的剪贴簿历史管理解决方案,支援各种内容类型和…

书客、柏曼、明基护眼台灯怎么样?实测三款热门护眼台灯推荐

随着市场上照明产品种类的日益丰富&#xff0c;从护眼台灯到护眼落地灯等各种选择足以让初次接触的宝妈们感到困惑&#xff0c;仿佛置身于一个复杂的选择迷宫。为了帮助大家筛选出真正优质的护眼灯&#xff0c;作为一位长期关注护眼照明领域的评测博主&#xff0c;我综合考虑了…

Swift里的数值变量的最大值和最小值

Swift里有很多种数值变量&#xff0c;如Int&#xff0c;Int8&#xff0c;Float&#xff0c;Double等。和绝大多数编程语言一样&#xff0c;由于是在计算机上运行&#xff0c;内存有限&#xff0c;所以必有最大值和最小值&#xff0c;而计算机无法处理超过该值的数。 在Swift中…

Unity 3D 概览一口气讲完!\(@^0^@)/

PS:好久没做Unity内容了&#xff0c;先做个合集凑合看着吧。。谢啦!!☆⌒(*&#xff3e;-゜)v Unity 3D 简介 Unity 3D 也称 Unity&#xff0c;是由 Unity Technologies 公司开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综…

AI大模型站在十字路口,持续突破or陷入低谷?

文&#xff5c;白 鸽 编&#xff5c;王一粟 当普通人被AI轰炸的已经疲劳&#xff0c;应用落地也没有惊人地突破&#xff0c;AI大模型的发展似乎已经进入瓶颈期。 在云栖大会之前&#xff0c;业界弥漫着对AI的唱衰&#xff0c;似乎又到了一个历史的转折点。如2017年上一代深度…

MySQL的索引——提高查找算法的数据结构 B+树

我们MYSQL服务器是在内存中的&#xff0c;所以所有的操作也是内存级的&#xff0c;索引也是如此 我们要提高算法的效率&#xff1a;首先要用一个好的数据存储结构储存数据&#xff0c;然后结构决定算法 所以——索引的本质就是一种提高算法效率组织的数据结构 缩印的主要价值体…

如何使用 React、TypeScript、TailwindCSS 和 Vite 创建 Chrome 插件

创建一个 Chrome 插件是一个有趣的项目&#xff0c;特别是当结合使用强大的工具如 React、TypeScript、TailwindCSS 和 Vite 时 在这篇文章中&#xff0c;我们将逐步引导完成整个过程&#xff0c;了解如何在 2024 年构建自己的 Chrome 插件。无论是经验丰富的开发者还是刚刚起…

Kafka 为什么这么快?

Kafka 是一款性能非常优秀的消息队列&#xff0c;每秒处理的消息体量可以达到千万级别。今天来聊一聊 Kafka 高性能背后的技术原理。 1 批量发送 Kafka 收发消息都是批量进行处理的。我们看一下 Kafka 生产者发送消息的代码&#xff1a; private Future<RecordMetadata>…

Mysql进阶——1

一.MySQL程序简介 本章介绍 MySQL 命令⾏程序以及在运⾏这些程序时指定选项的⼀般语法。 对常⽤程序进⾏详细的讲解&#xff0c;包括它们的选项。 MySQL安装完成通常会包含如下程序&#xff1a; • Linux系统程序⼀般在 /usr/bin⽬录下&#xff0c;可以通过命令查看&#x…

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…

让模型评估模型:构建双代理RAG评估系统的步骤解析

在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。 为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理…

MySQL练手题--日期连续类型(困难)

一、准备工作 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); Truncate table Failed; insert into Failed (fail_date) values (2018-12-28); insert into Failed (fail_date) values (2018-12-29); inser…

攻防世界-1-misc

下载附件&#xff0c;提示需要密码 提示密码是出题人的生日&#xff0c;这里可以自己定义一个关于生日的字典&#xff0c;使用字典生成工具&#xff0c;直接生成字典。&#xff08;我用的是19000101至20231231字典进行的爆破测试&#xff09; 使用archpr软件&#xff0c;和刚刚…

k8s下的网络通信与调度

目录 一、k8s网络通信 1、k8s通信整体架构 2、flannel网络插件 &#xff08;1&#xff09;flannel跨主机通信原理 &#xff08;2&#xff09;flannel支持的后端模式 3、calico网络插件 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;网络架构 &#xff08;…

Css_动态渐变圆圈旋转效果

1、效果图 2、实现代码 <template><div class"box"><div class"line"></div><div class"lineNew"></div></div> </template><script lang"ts" setup></script><styl…

C语言 | Leetcode C语言题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; const int HIGH_BIT 30;struct Trie {// 左子树指向表示 0 的子节点struct Trie* left;// 右子树指向表示 1 的子节点struct Trie* right; };struct Trie* createTrie() {struct Trie* ret malloc(sizeof(struct Trie));ret->left re…

天润融通创新功能,将无效会话转化为企业新商机

“您好&#xff0c;请问有什么可以帮您&#xff1f;” “......” 一个新的咨询会话进来&#xff0c;但客户却并不说话&#xff0c;这种情况客服人员肯定不会陌生&#xff0c;它一般被称为“无效会话”。 如今“无效会话”越来越多&#xff0c;已经成为困扰无数企业的难题。…

数学建模 第二讲 - 初等建模

绪论 主要内容:介绍以下几个初等模型&#xff0c;椅子问题、席位分配问题、行走步长问题、实物交换模型。 主要目的:体会数学建模的形式多样性与方法多样性&#xff0c;了解建模思想&#xff0c;着重理解由现实问题向数学问题的转化过程。 一、椅子问题 问题 四条腿长度相等…