Java学习日记(day26)

news2024/11/25 15:29:54

一、MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,

用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

最简单的、最经典就是JSP(view) +Servlet(controller) + JavaBean(model)

视图和逻辑隔离开来

控制器是核心

M(Model) 模型 JavaBean

V(View) 视图 Html JSP Thymeleaf Volicity Freemaker

C(Control) 控制器 Servlet,Controller,Action

  1. 当控制器收到来自用户的请求
  2. 控制器调用业务层完成JavaBean数据封装
  3. 完成业务后通过控制器跳转JSP页面的方式给用户反馈信息
  4. JSP个用户做出响应。

什么是JavaBean

JavaBean:一种规范,表达实体和信息的规范,便于封装重用

  1. 所有属性为private
  2. 提供默认无参构造方法
  3. 提供getter和setter
  4. 实现serializable接口

二、三层架构

  1. Controller:负责控制,拿到View传递过来的数据,封装之后交给Service处理,Service处理完了之后,Controller拿到结果之后,将结果交给界面。
  2. Service:业务逻辑(分页,为了完成分页就要调用两次DAO层)
  3. DAO:纯粹的JDBC的增删改查操作

上一层可以调用下一层所有代码,并不是StudentServlet只能调用IStudentService代码,也可以调用ITeacherService代码

@WebServlet("/student")
public class StudentServlet extends HttpServlet {
    private IStudentService studentService = new StudentServiceImpl();
    private ITeacherService teacherService = new TeacherServiceImpl();
    
}

@Service
public class StudentServiceImpl implements IStudentService {
    private IStudentDao studentDao = new StudentDaoImpl();
    private ITeacherDao teacherDao = new TeacherDaoImpl();
    
}

public class StudentDaoImpl implements IStudentDao {

}

三、分页

做分页首先要规定每页有多少条

每页有5条,取出第1页数据 limit 0,5

每页有5条,取出第2页数据 limit 5,5

每页有5条,取出第3页数据 limit 10,5

pageSize: 5 pageNo: 1 2 3

limit (pageNo-1)*pageSize,pageSize

limit 中offset代表偏移到哪个位置,rows代表往下数多少个

pageNo, pageSize 1,5 2,5 3,5

limit (pageNo-1)*pageSize ,pageSize

pageNo limit

1 0,5

2 5,5

3 10,5

分页常见的问题:

  1. 封装一个分页类需要哪些信息
  2. 分页需要发送哪两条sql语句
    • 查询当前页的数据 select id,name,age,gender from student limit 0,5;
    • 查询总的数量,目的是为了算总的页数 select count(*) from student;
public class PageInfo{
     //当前页数据
     private List<Student> list;
     //总的页数   Math.ceil(总数量/pageSize)      
     private Integer totalPage;
     private Integer pageNo;
     private Integer pageSize;
}

//缺点是这个PageInfo只能封装Student,使用泛型就可以解决这个问题,这个T代表可以传递任何对象
public class PageInfo<T>{
    private List<T> list;
    private Integer totalPage;
    private Integer pageNo;
    private Integer pageSize;
}

@Override
public PageInfo selectByPage(Integer pageNo, Integer pageSize) {
    //第一条sql:查询当前页的数据
    int offset = (pageNo - 1) * pageSize;
    List<Banji> list = banjiDao.selectByPage(offset, pageSize);
    //第二条sql:查询总的数量
    int totalCount = banjiDao.selectTotalCount();
    int totalPage = (int)Math.ceil((double)totalCount / pageSize);

    //PageInfo pageInfo = new PageInfo(list, totalPage, pageNo, pageSize);
    PageInfo<Banji> pageInfo = new PageInfo(list, totalPage, pageNo, pageSize);
    return pageInfo;
}
 
public static void main(String[] args) {
    int totalCount = 12;
    int pageSize = 5;
    System.out.println(totalCount / pageSize);//2
    System.out.println((double)totalCount / pageSize);//2.4
    System.out.println(Math.ceil((double)totalCount / pageSize));//3.0

    int totalPage = (int)Math.ceil((double)totalCount / pageSize);
    System.out.println(totalPage);//3
}

UserServlet.selectByPage
com.mysql.cj.jdbc.ClientPreparedStatement: select id,name,password from users limit 0,5
com.mysql.cj.jdbc.ClientPreparedStatement: select count(*) from users
PageInfo{list=[User{id=1, name='lisi', password='123'}, User{id=2, name='wangwu', password='123'}, User{id=3, name='dshfi', password='123'}, User{id=4, name='hweiohwi', password='12'}, User{id=5, name='12ih', password='23'}], totalPage=3, pageNo=1, pageSize=5}
UserServlet.selectByPage
com.mysql.cj.jdbc.ClientPreparedStatement: select id,name,password from users limit 5,5
com.mysql.cj.jdbc.ClientPreparedStatement: select count(*) from users
PageInfo{list=[User{id=6, name='23hih', password='hio'}, User{id=7, name='hidosfhi', password='23'}, User{id=8, name='dhfih', password='34'}, User{id=9, name='ihdsfoih', password='23423'}, User{id=10, name='hdifh', password='232'}], totalPage=3, pageNo=2, pageSize=5}
UserServlet.selectByPage
com.mysql.cj.jdbc.ClientPreparedStatement: select id,name,password from users limit 10,5
com.mysql.cj.jdbc.ClientPreparedStatement: select count(*) from users
PageInfo{list=[User{id=11, name='12hihi', password='iff'}, User{id=12, name='dhsfii', password='1212'}], totalPage=3, pageNo=3, pageSize=5}

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

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

相关文章

Java基础(8)- Java代码笔记5

目录 一、static关键字 1.概述&#xff1a;静态关键字 2.使用 a.修饰一个成员变量 b.修饰一个方法 3.调用静态成员&#xff1a;类名直接调用&#xff08;不用new对象&#xff09; 4.静态成员特点&#xff1a; 5.static修饰成员的访问特点 6.静态成员在开发中的使用场景…

搭建 canal 监控mysql数据到Elasticsearch(总结)

搭建 canal 监控mysql数据到 elasticsearch 中 需求: 要将 MySQL 数据库 info 中的 notice 和 result 表的增、删、改操作同步到 Elasticsearch 的 notice 和 result 索引&#xff0c;您需要正确配置 MySQL、Canal 、Canal Adapter 、 Elasticsearch 和 kibana 系统rocky9.2…

Django + websocket 连不上

看了网上的几个简单例子&#xff0c;一步一步做&#xff0c;但无一成功。都连不上websocket。 后来按一个视频教程的操作步骤来做&#xff0c;成功了。差别在于视频教程中加了 pip install daphne 和setting.py中 连不上的表现&#xff1a; 前端报错&#xff1a; WebSock…

如何打造在线音乐网站?java springboot架构,vue前端开发,音乐分享新体验

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于Prometheus 和K8S kubernetes 构建 搭建监控告警系统

目录 1、Prometheus介绍&#xff1f; 2、Prometheus特点&#xff1f; 2.1 样本 3、Prometheus组件介绍 4、Prometheus工作流程 4、Prometheus和zabbix对比分析 5、Prometheus的几种部署模式 5.1 基本高可用模式 5.2 基本高可用远程存储 5.3 基本HA 远程存储 联邦集群…

【QA】牙科光固化机类产品导光元件在进行检测时应关注哪些问题?

版权说明&#xff1a;本文来源【国家药品监督管理局】&#xff0c;如果您认为我们的文中描述与事实不符或有侵权行为&#xff0c;请及时联系我们。感谢您的关注。

怎么找TikTok代运营助力?灵感魔方怎么样?

在当今全球化的浪潮中&#xff0c;海外版抖音已然成为了品牌出海的重要阵地。然而&#xff0c;面对这个充满机遇与挑战的平台&#xff0c;如何找到专业的TikTok代运营团队来助力品牌成功出海呢&#xff1f;以下是一些关键的考量因素和方法。 首先&#xff0c;专业的TikTok代运…

ubuntu系统如何跑分

win系统下&#xff0c;跑分工具很多&#xff0c;ubuntu的话&#xff0c;估计很多人陌生。 这里介绍ubuntu跑分工具--geekbench 1&#xff0c;geekbench安装 下载地址i&#xff1a;https://www.geekbench.com/download/linux/ 点击进去就自动下载了。 没有下载到就继续点击…

MATLAB代码|中心差分卡尔曼滤波(CDKF)的滤波例程,无需下载,直接复制到MATLAB上面就能运行

文章目录 CDKF介绍代码运行结果各模块解析初始化系统模型设置CDKF循环绘图另有关于EKF和CDKF的对比程序:EKF+CDKF两个滤波的MATLAB程序,估计三轴位置,带中文注释—— https://blog.csdn.net/callmeup/article/details/136610153。 CDKF介绍 中心差分卡尔曼滤波(Central D…

C# 上位机开发指南:高效学习建议

目录 前言 上位机概念 基础知识 1、C#语言基础 2、.NET框架 3、桌面应用开发 4、设备通信 5、数据操作 6、多线程和并发 7、UI/UX设计 8、调试和测试 关键概念 事件驱动编程 异步编程 设计模式 通信协议学习 数据处理与存储 实时性与并发处理 技术选型 1、框…

CosyVoice 本地部署详细教程 手把手小白教程

CosyVoice 本地部署详细教程 注意事项 所有相关的软件、文件名称不要使用中文名称&#xff0c;也不要有中文路径&#xff0c;也不要有空格。 包括C盘用户名&#xff0c;不要有中文或空格。 模型部署前准备 nvidia显卡,建议显存6G以上AI框架CUDA、cuDNN安装 &#xff08;已安…

集成电路学习:什么是IP知识产权

一、IP&#xff1a;知识产权 IP是Intellectual Property的缩写&#xff0c;即知识产权。知识产权是一种无形的财产权&#xff0c;也称智力成果权&#xff0c;它指的是通过智力创造性劳动所获得的成果&#xff0c;并且是由智力劳动者对成果依法享有的专有权利。这种权利包括人身…

神仙公司名单(南京)

神仙公司&#xff08;南京&#xff09; 继续&#xff0c;神仙公司系列。 上一期我们介绍了 深圳的神仙公司&#xff0c;结果留言区的重点全都指向了 HW 和 BYD &#x1f923;&#x1f923; 不愧是你们&#xff0c;但我们不是"那个"排行。 言归正传&#xff0c;这期给…

笔记:《利用Python进行数据分析》之透视表和交叉表

透视表和交叉表 透视表&#xff08;pivot table&#xff09;是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合&#xff0c;并根据行和列上的分组键将数据分配到各个矩形区域中。在Python和pandas中&#xff0c;可以通过本章所…

代码随想录算法训练营第十八天| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

今日内容 leetcode. 669 修剪二叉搜索树leetcode. 108 将有序数组转换为二叉搜索树leetcode. 538 把二叉搜索树转换为累加树 Leetcode. 669 修剪二叉搜索树 文章链接&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;669. 修剪二叉搜索树 - 力扣&#xff08…

mathtype批量更改公式编号的格式

这是一个笔记 在使用的时候遇到的问题,经过研究发现mathtype生成的右编号公式可以批量更新 调整前 如图,如果调整前使用的是默认的编号格式,显示为 1.5 1.5 1.5: 这里面1和5的意义为: 1:节编号5:公式编号 如下:调整后 如果需要不按章节形式来分类,则可以通过以下…

大数据中心运营管理整体规划方案(32页PPT)

随着信息技术的飞速发展&#xff0c;大数据已成为推动产业升级、促进经济社会发展的重要力量。大数据中心作为数据存储、处理与分析的核心基础设施&#xff0c;其运营管理的规范化、高效化、智能化直接关系到数据价值的有效挖掘和企业的核心竞争力。大数据中心运营管理整体规划…

免费下载Win11 24H2专业版!附详细安装教程

今日&#xff0c;系统之家小编给大家带来2024年最新的Windows11 24H2专业版系统&#xff0c;更新后系统版本号将升至26100.1591。系统基于微软官方最新Windows 11 24H2专业版进行离线制作与优化&#xff0c;确保系统安全无毒&#xff0c;兼容性强&#xff0c;可完美支持新老机型…

构建可扩展的数据平台(数据平台设计中的数据网格趋势)

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 欢迎来到雲闪世界。在本文中&#xff0c;我旨在深入研究各种类型的数据平台架构&#xff0c;更好地了解它们的演变、优势、劣势和实际应用。重点是数据网格架构、它在现代数据堆栈 (MDS) 中的作用以及当今…

Getting an error trying to import environment OpenAI Gym

题意&#xff1a;尝试导入 OpenAI Gym 环境时遇到错误 问题背景&#xff1a; I am trying to run an OpenAI Gym environment: 我正在尝试运行一个 OpenAI Gym 环境&#xff1a; env gym.make("ALE/Breakout-v5", render_mode"rgb_array")But I get th…