java中部的分页实现(二)

大家好,欢迎来到雄雄的小课堂,昨天分享了关于分页查询的理论知识,今天我们就来结合代码和案例实际的应用一下,方便大家理解。

前言:我们都知道,实现分页需要三个步骤。第一,确定页大小(每页显示的数据量)。第二,计算显示的总页数。第三,写分页的sql语句。这三步已经在昨天的推文中详细说明,需要的可以点击这里快速浏览:javaweb中实现分页,持续更新……

01

开发环境

Myeclipse 10.5

Mysql 5.5

Tomcat 7.0

JDK 1.7

Chrome浏览器

02

数据库和表结构:

下面是表中的测试数据,需要说明的是saddress这一列,本来是当做地址的,现在有其他的需求,就当成了角色使用,但是并不影响分页。

03

Javaweb代码

Java代码是以分层开发的思想来实现的,其中有实体类:Student,Dao类和接口:BaseDaoNew,IStudentDao,Dao层实现类StudentDaoImpl:Service接口和实现类IStudentService,StudentService以及最后的工具类PageUtils

代码如下

实体类:Student

package org.entity;/*** * @author 24519* 学生的实体类**/
public class Student {private   int     sid;private   String sname;private   String sphone;private   String spass;private   String saddress;private   int     sage;//封装public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSphone() {return sphone;}public void setSphone(String sphone) {this.sphone = sphone;}public String getSpass() {return spass;}public void setSpass(String spass) {this.spass = spass;}public String getSaddress() {return saddress;}public void setSaddress(String saddress) {this.saddress = saddress;}public int getSage() {return sage;}public void setSage(int sage) {this.sage = sage;}}

BaseDaoNew:

package org.dao;import java.sql.*;
import java.util.List;import com.sun.org.glassfish.external.statistics.annotations.Reset;/*** * @author 24519* 连接数据库的工作类**/
public  class BaseDaoNew {private Connection conn = null;private PreparedStatement pre;private ResultSet rs;//连接数据库public Connection getConn(){try{//加载驱动Class.forName("com.mysql.jdbc.Driver");//数据库连接字符串String url= "jdbc:mysql://localhost:3306/schooldb?user=root&password=root";//连接数据库conn = DriverManager.getConnection(url);}catch(Exception ex){ex.printStackTrace();}return conn;}//增删改public int ExecuteUpdate(String sql,List params) throws SQLException{int rel = 0;conn = getConn();pre = conn.prepareStatement(sql);if(params!=null){for(int i = 0;i<params.size();i++){pre.setObject(i+1, params.get(i));}}rel = pre.executeUpdate();return rel;}//查询public ResultSet ExecuteQuerty(String sql,List params) throws SQLException{conn = getConn();pre = conn.prepareStatement(sql);if(params!=null){for(int i = 0;i<params.size();i++){pre.setObject(i+1, params.get(i));}}return pre.executeQuery();}//关闭连接public void closeConn(Connection conn,PreparedStatement pre,ResultSet rs){try {if(rs!=null){rs.close();}if(pre!=null){pre.close();}if(conn!=null){conn.close();}} catch (SQLException e) {e.printStackTrace();}}}

IStudentDao:

package org.dao;import java.util.List;import org.entity.Student;//学生信息的接口
public interface IStudentDao {//增加学生信息public int addStudent(Student stu);//修改学生信息public int updateStudent(Student stu);//删除学生信息public int delStudent(int sid);//根据编号查询学生信息public Student findStudentById(int sid);//查询全部学生信息public List<Student> findStudentAll();//登录public Student login(String name,String pass);//总记录数public int findAllStudentCount();//分页查询public List<Student> findStudentByPage(int currIndex,int pageSize);
}

StudentDaoImpl:

package org.dao.impl;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import org.dao.BaseDao;
import org.dao.BaseDaoNew;
import org.dao.IStudentDao;
import org.entity.Student;import com.sun.xml.internal.ws.Closeable;/*** * @author 24519* 学生信息的实现类**/
public class StudentDaoImpl implements IStudentDao {BaseDao base = new BaseDao();private Connection conn = base.getConn();PreparedStatement pre = null;ResultSet rs = null;@Overridepublic int addStudent(Student stu) {int rel = 0;String sql = "insert into Student values(?,?,?,?,?,?);";try {List<Object> params = new ArrayList<Object>();params.add(stu.getSid());params.add(stu.getSname());params.add(stu.getSphone());params.add(stu.getSpass());params.add(stu.getSaddress());params.add(stu.getSage());rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic int updateStudent(Student stu) {String sql = "update student set sname = ?," +"sphone = ?,spass=?,saddress=?,sage=? where sid = ?";int rel = 0;try {List<Object> params = new ArrayList<Object>();params.add(stu.getSname());params.add(stu.getSphone());params.add(stu.getSpass());params.add(stu.getSaddress());params.add(stu.getSage());params.add(stu.getSid());rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic int delStudent(int sid) {String sql = "delete from Student where sid = ?";int rel = 0;try {List<Object> params = new ArrayList<Object>();params.add(sid);rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic Student findStudentById(int sid) {Student student = new Student();String sql = "select * from student where sid = ?";try {List<Object> params = new ArrayList<Object>();params.add(sid);rs = base.ExecuteQuery(sql, params);while(rs.next()){student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString("saddress"));student.setSage(rs.getInt(6));}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return student;}@Overridepublic List<Student> findStudentAll() {List<Student> stus = new ArrayList<Student>();String sql = "select * from Student";try {rs = base.ExecuteQuery(sql, null);while(rs.next()){Student student = new Student();student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString(5));student.setSage(rs.getInt(6));stus.add(student);//将信息放入集合中}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return stus;}//登陆@Overridepublic Student login(String name, String pass) {Student student = new Student();String sql = "select * from student where sname = ? and spass = ?;";try {List<Object> params = new ArrayList<Object>();params.add(name);params.add(pass);rs = base.ExecuteQuery(sql, params);while(rs.next()){student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString(5));student.setSage(rs.getInt(6));}} catch (SQLException e) {e.printStackTrace();}return student;}//查询总记录数@Overridepublic int findAllStudentCount() {String sql = "select count(*) from student";int count = 0;try {rs = base.ExecuteQuery(sql, null);rs.next();count = rs.getInt(1);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return count;}//分页查询@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {String sql = "select * from student limit ? ,?";int one = (currIndex-1)*pageSize;List<Object> params = new ArrayList<Object>();params.add(one);params.add(pageSize);List<Student> sList = new ArrayList<Student>();try {rs = base.ExecuteQuery(sql, params);while(rs.next()){Student stu = new Student();stu.setSid(rs.getInt(1));stu.setSname(rs.getString(2));stu.setSphone(rs.getString(3));stu.setSpass(rs.getString(4));stu.setSaddress(rs.getString(5));stu.setSage(rs.getInt(6));sList.add(stu);}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return sList;}}

IStudentService:

package org.service;import java.util.List;import org.entity.Student;public interface IStudentService {//增加学生信息public int addStudent(Student stu);//修改学生信息public int updateStudent(Student stu);//删除学生信息public int delStudent(int sid);//根据编号查询学生信息public Student findStudentById(int sid);//查询全部学生信息public List<Student> findStudentAll();//登录public Student login(String name,String pass);//计算总记录数public int findAllStudentCount();//分页查询public List<Student> findStudentByPage(int currIndex,int pageSize);}

StudentService:

package org.service.impl;import java.util.List;import org.dao.IStudentDao;
import org.dao.impl.StudentDaoImpl;
import org.entity.Student;
import org.service.IStudentService;public class StudentServiceImpl implements IStudentService {//创建Dao层的对象private IStudentDao sDao = new StudentDaoImpl();@Overridepublic int addStudent(Student stu) {return sDao.addStudent(stu);}@Overridepublic int updateStudent(Student stu) {return sDao.updateStudent(stu);}@Overridepublic int delStudent(int sid) {return sDao.delStudent(sid);}@Overridepublic Student findStudentById(int sid) {return sDao.findStudentById(sid);}@Overridepublic List<Student> findStudentAll() {return sDao.findStudentAll();}@Overridepublic Student login(String name, String pass) {return sDao.login(name, pass);}@Overridepublic int findAllStudentCount() {return sDao.findAllStudentCount();}//分页查询@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {return sDao.findStudentByPage(currIndex, pageSize);}}

PageUtils:

package org.utils;import java.util.List;import org.entity.Student;/*** * @author 24519* 分页的工具类**/
public class PageUtils {//页大小(每页显示多少条记录)private int pageSize;//当前页private int currIndex;//总记录数private int totalCount;//总页数private int totalPage;//每页显示的数据List<Student> sList;public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getCurrIndex() {return currIndex;}//设置当前页public void setCurrIndex(int currIndex) {//判断当前页是否小于0,如果是,则默认第一页if(currIndex<=0){this.currIndex = 1;}else{this.currIndex = currIndex;}}public int getTotalCount() {return totalCount;}//计算总页数public void setTotalCount(int totalCount) {this.totalCount = totalCount;int pages = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;totalPage = pages;}public int getTotalPage() {return totalPage;}public void setTotalPage(int totalPage) {this.totalPage = totalPage;}public List<Student> getsList() {return sList;}public void setsList(List<Student> sList) {this.sList = sList;}}

代码解析:我们可以看到,在IStudentDao中,除了有增删改和登录的接口外,还有两个接口,一个是查询总记录数,另一个为分页查询数据.

//总记录数public int findAllStudentCount();//分页查询public List<Student> findStudentByPage(int currIndex,int pageSize);

总记录数的作用就是对总页数进行计算,公式为,总页数=总记录数%页大小==0?总记录数/页大小:总记录数/页大小+1;

分页查询的数据,由于是多条,即返回List<Student>集合,每页显示5条数据,那我们就查询5条,即参数pageSize的值为5。currIndex的作用是用来记录当前页。

实现类对于这两个接口的关键代码如下:

//查询总记录数@Overridepublic int findAllStudentCount() {String sql = "select count(*) from student";int count = 0;try {rs = base.ExecuteQuery(sql, null);rs.next();count = rs.getInt(1);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return count;}//分页查询@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {String sql = "select * from student limit ? ,?";int one = (currIndex-1)*pageSize;List<Object> params = new ArrayList<Object>();params.add(one);params.add(pageSize);List<Student> sList = new ArrayList<Student>();try {rs = base.ExecuteQuery(sql, params);while(rs.next()){Student stu = new Student();stu.setSid(rs.getInt(1));stu.setSname(rs.getString(2));stu.setSphone(rs.getString(3));stu.setSpass(rs.getString(4));stu.setSaddress(rs.getString(5));stu.setSage(rs.getInt(6));sList.add(stu);}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return sList;}

PageUtils类的我们需要注意,在设置当前页currIndex的值时,要对齐进行判断,因为当前页永远永远的不可能小于0 或者大于总页数,设置的关键代码如下:

//设置当前页public void setCurrIndex(int currIndex) {//判断当前页是否小于0,如果是,则默认第一页if(currIndex<=0){this.currIndex = 1;}else{this.currIndex = currIndex;}}

设置总记录数的关键代码如下:顺便对总页数进行计算

//计算总页数public void setTotalCount(int totalCount) {this.totalCount = totalCount;int pages = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;totalPage = pages;}

接下来就可以在表现层进行分页,我们在进分页查询的页面之前,先进doPage.jsp对数据进行处理,将所有需要用到的分页数据全部封装至PageUtils类中,完整实现代码如下:各个关键步骤均有注释

<%@page import="org.entity.Student"%>
<%@page import="org.service.impl.StudentServiceImpl"%>
<%@page import="org.service.IStudentService"%>
<%@page import="org.utils.PageUtils"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%Student stu = (Student) request.getAttribute("student");//判断是否是管理员if (stu.getSaddress().equals("管理员")) {//获取当前页,//如果是空,默认是1String curr = request.getParameter("currIndex");if (curr == null) {curr = "1";}Integer currIndex = Integer.parseInt(curr);PageUtils p = new PageUtils();p.setPageSize(5);//计算总记录数IStudentService s = new StudentServiceImpl();//从数据库中查询总记录数p.setTotalCount(s.findAllStudentCount());//如果当前页大于等于总页数,那当前页就是总页数if (currIndex >= p.getTotalPage()) {currIndex = p.getTotalPage();} else if (currIndex <= 0) {//如果当前页小于等于0,则当前页等于1currIndex = 1;}p.setCurrIndex(currIndex);//从数据库中查询每页显示的数据放在集合中List<Student> sList = s.findStudentByPage(currIndex, 5);p.setsList(sList);//将p对象放在request作用域中,在请求的页面中获取request.setAttribute("p", p);//跳转到分页的页面request.getRequestDispatcher("findStudentPage.jsp").forward(request, response);} else {//普通员工//跳转到查询自己信息的页面request.setAttribute("stu", stu);request.getRequestDispatcher("shouInfo.jsp").forward(request,response);}
%>

注意看这一行代码,当我们将一切处理完之后,通过这行代码转发至分页显示信息的页面,

request.getRequestDispatcher("findStudentPage.jsp").forward(request, response);

下面就是分页显示数据的页面了:

<%@page import="org.utils.PageUtils"%>
<%@page import="org.entity.Student"%>
<%@page import="org.service.impl.StudentServiceImpl"%>
<%@page import="org.service.IStudentService"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'FindStudentPage.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%//获取所有的数据PageUtils p = (PageUtils)request.getAttribute("p");//从工具类中获取每页显示的数据List<Student> sList =p.getsList() ;%><table border="1"><tr><td>编号</td><td>姓名</td><td>电话</td><td>密码</td><td>地址</td><td>年龄</td></tr><%for(Student stu :sList){%><tr><td><%=stu.getSid() %></td><td><%=stu.getSname() %></td><td><%=stu.getSphone() %></td><td><%=stu.getSpass() %></td><td><%=stu.getSaddress()%></td><td><%=stu.getSage() %></td></tr><%}%>
</table><a href="doPage.jsp?currIndex=1">首页</a><a href="doPage.jsp?currIndex=<%=p.getCurrIndex()-1%>">上一页</a><%=p.getCurrIndex()%> / <%=p.getTotalPage()%><a href="doPage.jsp?currIndex=<%=p.getCurrIndex()+1%>">下一页</a><a href="doPage.jsp?currIndex=<%=p.getTotalPage()%>">末页</a><br/><form action="doPage.jsp" method="post">至<input type="number" max="<%=p.getTotalPage() %>" min="1" value="<%=p.getCurrIndex() %>" style="display:inline-block; width:50px" name="currIndex"/>页<input type="submit" value="跳转"></form></body>
</html>

代码解析:

先从request中获取doPage.jsp中放入的数据,然后以表格的形式展示出来。

04

翻页解析

首页,很简单,当前页码必定是1,所以直接写currIndex=1即可。

上一页,假如当前也是2,那么上一页就是当前也减去1,所以上一页就是currIndex-1。

下一页,正好和上一页相反,即currIndex+1。

尾页,假如一共有5页,那么尾页就是5,即currIndex=5。

当前页和总页数由于我们在doPage都放在了PageUtils中,所以直接从PageUtils中获取即可。

注意我们无论是点击上一页还是下一页,或者首页尾页,均是跳转至doPage.jsp中操作,在doPage.jsp中,直接获取currIndex的值,然后在调用Service里面的方法进行分页查询。

运行结果如下:

往期精彩

javaweb中实现分页,持续更新……

2020-11-24

一个简单的分页工具类

2020-11-23

javaWeb中,如何通过Commons-FileUpload组件上传文件

2020-11-22

多功能语音播放器

2020-11-21

CSS动画示例(上一篇是CSS过渡…)

2020-11-20

CSS3中的动画示例

2020-11-19

点分享

点点赞

点在看

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

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

相关文章

SpringSecurity授权(访问控制)

一、 访问控制url匹配 在前面讲解了认证中所有常用配置&#xff0c;主要是对httpSecurity.formLogin()进行操作。而在配置类中httphttpSecurity.authorizeRequests()主要是对url进行控制&#xff0c;也就是我们所说的授权&#xff08;访问控制&#xff09;。httpSecurity.autho…

剥析surging的架构思想

1、前言 前面第一篇阐述了采用基于.NET CORE微服务架构&#xff0c;应用surging服务端与客户端之间进行通信的简单示例以及对于surging服务化框架简单介绍。在这篇文章中&#xff0c;我们将剥析surging的架构思想。 surging源码下载 2、通信机制 2.1 简介 在单体应用中&am…

javaweb实现分页(二)

前言&#xff1a;我们都知道&#xff0c;实现分页需要三个步骤。第一&#xff0c;确定页大小&#xff08;每页显示的数据量&#xff09;。第二&#xff0c;计算显示的总页数。第三&#xff0c;写分页的sql语句。这三步已经在昨天的推文中详细说明&#xff0c;需要的可以点击这里…

滴滴出行基于RocketMQ构建企业级消息队列服务的实践

转载自 滴滴出行基于RocketMQ构建企业级消息队列服务的实践 本文整理自滴滴出行消息队列负责人 江海挺 在Apache RocketMQ开发者沙龙北京站的分享。通过本文&#xff0c;您将了解到滴滴出行&#xff1a; 1. 在消息队列技术选型方面的思考&#xff1b; 2. 为什么选择 RocketMQ…

[信息安全] 1.密码工具箱

0. 何谓安全&#xff1f; 对于信息安全性的重要性&#xff0c;我想大家都不会否认。那么具体来说应该具有哪些特性才能称之为安全呢&#xff1f;举个简单的例子&#xff1a;我给你发送一条消息“借给我100元”&#xff0c;当你收到这条消息并且处理后你的账户里面会少出来100块…

深入理解TCP/IP协议-TCP建立与终止连接

转载自 深入理解TCP/IP协议-TCP建立与终止连接 一、引言 TCP 是一个面向连接的协议。无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。连接创建与终止的状态变化图如下&#xff1a; 二、三次握手建立连接 过程如下&#xff1a; 客户端发送一个 SY…

在Docker中运行asp.net core 跨平台应用程序

概述 Docker已经热了有一两年了&#xff0c;而且我相信这不是一个昙花一现的技术&#xff0c;而是一个将深远影响我们日后开发和部署、运营应用系统的一种创新&#xff08;很多人将其作为devops的一种非常重要的基石&#xff09;。学习docker的最好方式&#xff0c;莫过于它的…

java中的Queue队列的用法

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;今天给大家分享的是“java中的Queue队列的用法” 前言&#xff1a;好多人对Queue不是很熟悉&#xff0c;毕竟平时也不怎么用&#xff0c;遇到集合要么List要么map这些常用的&#xff0c;殊不知&#xff0c;java中还有个Que…

SpringCloud Netflix Eureka

文章目录一、 Eureka简介Eureka组件二、 Eureka和Zookeeper 对比1 什么是CAP定理2 基于CAP定理比对Eureka和Zookeeper三、 搭建Eureka注册中心1 POM文件2 配置文件application.yml3 启动类4 访问Eureka Server WEB服务管理平台四、 Eureka 服务管理平台介绍1 Eureka Server服务…

使用枚举定义常量更好点儿

大家好&#xff0c;欢迎来到雄雄的小课堂&#xff0c;昨天给大家分享的是“java中的Queue队列的用法示例”&#xff0c;今天&#xff0c;分享的主题是“java中&#xff0c;推荐使用枚举定义常量”。 前言&#xff1a;常量&#xff0c;相信大家多不会陌生&#xff0c;常量值一般…

SpringCloud Netflix Ribbon

文章目录一、 Ribbon简介二、 使用Ribbon开发微服务1 创建springcloud工程 和 commons子模块2 开发服务提供者 - ribbonappservice3 开发服务消费者 - ribbonappclient三、 集中式与进程内负载均衡区别四、 Ribbon常见的负载均衡策略1 Ribbon中的常用负载均衡简介2 配置负载均衡…

Entity Framework Core 生成跟踪列

注意&#xff1a;我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时&#xff0c;功能可能存在变动。 当您设计数据库时&#xff0c;有时需要添加列以跟踪记录何时更改&#xff0c;以及谁进行了更改。例如&#xff0c;您添加以下列&#xff1a; Cre…

老师,我们想看到您的笑容!

“老师&#xff0c;你可以对我们笑笑吗&#xff1f;”今天偶然遇见一位学生在吃饭的路上和我说道。我冲他点了点头&#xff0c;笑道&#xff1a;“好呀”&#xff01;是啊&#xff0c;我是好久没有把笑声带回班级中了。1目前&#xff0c;4班都在倾尽全力的做项目&#xff0c;试…

阿里巴巴开源 Spring Cloud Alibaba,加码微服务生态建设

转载自 阿里巴巴开源 Spring Cloud Alibaba&#xff0c;加码微服务生态建设 本周&#xff0c;Spring Cloud联合创始人Spencer Gibb在Spring官网的博客页面宣布&#xff1a;阿里巴巴开源 Spring Cloud Alibaba&#xff0c;并发布了首个预览版本。随后&#xff0c;Spring Cloud…

微软发布Azure Stack更多细节,预计9月交付

在近日举行的微软全球合作伙伴大会上&#xff0c;微软宣布Azure Stack现在开始接受预定&#xff0c;预计9月份就可以交付。Azure Stack是微软公有Azure云的私有云实现。和其他私有云提供商不同&#xff0c;微软将把Azure Stack作为一项基于消费的服务&#xff0c;这和其公有云的…

今天你们表现的真棒!!!

12月5日在报告厅举行了“2020级青鸟4班 HTML网页设计大赛”。从一个洁白如纸的空白页面&#xff0c;到布满五彩斑斓样式的cool页面&#xff0c;是同学们一个字母一个单词的敲打出来的。从头脑空白啥都不会说到现在的条理清晰张嘴就来的演讲&#xff0c;是同学们时时刻刻写稿子背…

再有人问你Netty是什么,就把这篇文章发给他

转载自 再有人问你Netty是什么&#xff0c;就把这篇文章发给他 本文基于Netty4.1展开介绍相关理论模型&#xff0c;使用场景&#xff0c;基本组件、整体架构&#xff0c;知其然且知其所以然&#xff0c;希望给大家在实际开发实践、学习开源项目提供参考。 这是一篇万字长文&a…

SpringCloud Netflix Hystrix

文章目录一、 Hystrix简介1 什么是灾难性雪崩效应2 什么是Hystrix二、 服务降级(Ribbon中)三、 服务熔断(Ribbon中)&#xff08;服务降级的强化版&#xff09;四、 请求缓存(Ribbon中)(不推荐)(查询频率高&#xff0c;修改频率低时谨慎使用)五、 Openfeign的雪崩处理1 服务降级…

[信息安全] 3.HTTPS工作流程

0. 简单回顾 在前面两篇博客中介绍了密码相关的一些基本工具&#xff0c;包括&#xff08;对称密码&#xff0c;公钥密码&#xff0c;密码散列函数&#xff0c;混合密码系统&#xff0c;消息认证码码&#xff0c;数字签名&#xff0c;伪随机数&#xff0c;数字证书&#xff09…

如何实现省市关联的下拉列表

前言&#xff1a;在某些电商网站或者APP中&#xff0c;通常填写地址时&#xff0c;会有这样的功能&#xff1a;当我们选择的省份是“山东”时&#xff0c;则城市的下拉列表里所展示的便是山东的城市&#xff0c;当选择的省份是“山西”时&#xff0c;城市的下拉列表所展示的便是…