如何把数据库中的数据显示到页面

news2024/11/16 11:54:18

主要内容:使用JDBC访问数据库中数据(Java Web数据可视化案例)

文章目录

  • 前期准备:
  • 案例:
    • 第一步:创建数据库及数据
    • 第二步:编写实体类
    • 第三步:编写Dao类
    • 第四步:编写Servlet代码
    • 第五步:画页面
    • 页面运行效果
  • 练习:
    • 第一步:创建数据库及数据
    • 第二步:编写实体类
    • 第三步:编写Dao类
    • 第四步:编写Servlet代码
    • 第五步:画页面
    • 页面运行效果
  • 扩展:
    • Dao类代码中JDBC代码
    • JDBC使用
    • 完整代码
  • 总结:


前期准备:

安装 JDK、MySQL、Tomcat 和 Eclipse的 Java Web 版本;

①、Eclipse需要Web版本JAVA环境变量配置步骤及测试(JDK的下载 & 安装 & 环境配置教程)(右上角其实也可以更改)
确认Eclipse的版本:
在这里插入图片描述

②、此内容涉及数据库,如果没有数据库点此链接下载

③、Tomcat是必须安装并配置的,否则不能运行,Tomcat下载安装以及配置(详细教程)

案例:

要求:使用Java Web技术把数据库中数据分析的结果展示到网页上,分析结果是关于购买图书的记录,具体包括购买年份、图书名称、作者、价格等信息,具体要求如下:

①、写出创建数据库表 book 并插入模拟数据的SOL语句
②、编写表示信息的实体类 BookBean,应该包括成员变量、访问器方法和构造方法。
③、编写 BookDao类,连接到数据库,执行查询,封装查询结果
④、编写 BookServlet类,关联到请求/list 上,调用 BookDao得到数据并存储到reguest 对象中,然后转向 list.isp.
⑤、编写listisp,使用JSTL 把查询的结果显示在网页上

第一步:创建数据库及数据

首先需要创建数据库和表使用MySQL创建数据库和表更多学习,也可以看下面的语句

用命令行方式创建数据库

首先【Win+R】打开cmd,或者在MySQL安装的位置,打开 bin 文件夹输入cmd回车
然后输入:mysql -u root -p,再输入密码即可

①、创建数据库:create database practice2020;
②、使用数据库:use practice2020
③、创建表:

create table book(
id int primary key auto_increment,
year int,
bookname int,
author varchar(255),
price varchar(255)
);

④、为了方便在界面上展示效果在这插入语句:

insert into book values(1,2002,'Web前端','张三','25.5'); 
insert into book values(2,2012,'JAVA','李四','52.1');

最后test02这个数据库里的book表的数据:
在这里插入图片描述

接下来我们要编写代码来表示数据库里的数据

第二步:编写实体类

(1)、类名
(2)、成员变量,和表中的列对应
(3)、访问器方法,setter方法和getter方法
(4)、无参数构造方法
(5)、有参数的构造方法,有多少个成员,就给多少个参数

通常与数据库中的表结构一致。

package Bean;

public class BookBean {
	private int id;
	private String year;
	private String bookname;
	private String author;
	private String price;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getBookname() {
		return bookname;
	}
	public void setBookname(String bookname) {
		this.bookname = bookname;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public BookBean(int id, String year, String bookname, String author, String price) {
		super();
		this.id = id;
		this.year = year;
		this.bookname = bookname;
		this.author = author;
		this.price = price;
	}
}

第三步:编写Dao类

访问数据库,取出数据库数据

// 得到所有数据
public List<BookBean> list() {
		// (1)定义存储数据的容器
		List<BookBean> datas = new ArrayList<>();
		// (2)把相关对象定义成成员变量
		// (3)try...catch...finally
		try {
			// (6)写sql语句
			String sqlString = "select * from book order by id";
			// (7)连接到数据库
			Class.forName(driverName);
			con = DriverManager.getConnection(url, username, password);
			// (8)执行sql语句,会得到结果集
			pstmt = con.prepareStatement(sqlString);
			ResultSet rSet = pstmt.executeQuery(sqlString);
			// (9)遍历结果集,next指向下一行,并返回true,
			// 如果没有下一行了,返回false,循环结束
			while (rSet.next()) {
				// (10)取出当前行的各个列
				int id = rSet.getInt(1);
				String year = rSet.getString(2);
				String bookname = rSet.getString(3);
				String author = rSet.getString(4);
				String price = rSet.getString(5);

				// (11)转换成对象(封装成),调用多个参数的构造方法
				BookBean bookBean = new BookBean(id, year, bookname, author, price);
				// (12)把当前对象添加到集合中(容器中)
				datas.add(bookBean);
			}
		} catch (Exception e) {
			// (4)处理异常
			// System.out.println(e.getMessage());
			e.printStackTrace();
		} finally {
			// (5)释放资源
			if (rs != null) {
				try {
					rs.close();
				} catch (Exception e2) {

				}
			}
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (Exception e2) {

				}
			}
			if (con != null) {
				try {
					con.close();
				} catch (Exception e2) {

				}
			}
		}
		// (13)把表示所有对象的数据返回
		return datas;
	}

这里如果说你换了个项目,那么有些参数你是需要改的:

// (1)定义存储数据的容器
List<BookBean> datas = new ArrayList<>();
// (6)写sql语句
String sqlString = "select * from book order by id";
// (10)取出当前行的各个列
	int id = rSet.getInt(1);
	String year = rSet.getString(2);
	String bookname = rSet.getString(3);
	String author = rSet.getString(4);
	String price = rSet.getString(5);
// (11)转换成对象(封装成),调用多个参数的构造方法
BookBean bookBean = new BookBean(id, year, bookname, author, price);

第四步:编写Servlet代码

进行业务处理,如果没有业务,只是把Dao里面的数据直接返回给Controller

package servlet;

import java.io.IOException;
//.....import信息在此省略
import java.util.List;

// (1)关联到FindAll地址
@WebServlet("/FindAll")
public class FindAllServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    // (2)前两行调用servcie或者DAO得到数据
            BookDao dao = new BookDao();
	    List<BookBean> datas = dao.list();

	    // (3)传值到界面,第一个参数是名字,第二个参数是具体值
	    request.setAttribute("datas", datas);
	    
	    // (4)跳转到界面,list.jsp是显示数据的界面,list.jsp可以继续访问request
	    RequestDispatcher rd = request.getRequestDispatcher("list.jsp");
	    rd.forward(request, response);    
	    
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

第五步:画页面

编写HTML文件或JSP、Vue文件都可以,只要是前端的
这里用的是JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据列表</title>
</head>
<body>
	<table>
		<tr>
			<th>ID</th>
			<th>购买年份</th>
			<th>图书名称</th>
			<th>作者</th>
			<th>价格</th>
		</tr>
		<!-- request.setAttribute("datas",datas); -->
		<!-- datas表示所有数据,data表示其中的一个数据 -->
		<c:forEach var="data" items="${datas}">
			<tr>
				<td>${data.id}</td>
				<td>${data.year}</td>
				<td>${data.bookname}</td>
				<td>${data.author}</td>
				<td>${data.price}</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

页面运行效果

在这里插入图片描述

练习:

要求:使用Java Web技术把数据库中数据分析的结果展示到网页上,分析结果是关于全国学历教育入学数education,具体包括年份、本科入学人数、高中入学人数和初中入学人数。具体要求如下:

①、写出创建数据库表education并插入模拟数据的SQL语句。
②、编写表示信息的实体类 EducationBean,应该包括成员变量、访问器方法和构造方法。
③、编写 EducationDao类,连接到数据库,执行查询,封装查询结果。
④、编写EducationServlet类,关联到请求/list 上,调用EducationDao得到数据并存储到request对象中,然后转向 list.jsp
⑤、编写 list.jsp,使用JSTL把查询的结果显示在网页上。

第一步:创建数据库及数据

①、写出创建数据库test,表education并插入模拟数据的SQL语句

首先创建数据库:create database test;
然后使用数据库:use test
然后创建表:

create table education(
year int primary key,
benke int,
gaozhong int,
chuzhong int
);

在这里插入图片描述

然后插入一些模拟数据并查看:

插入数据:

insert into education values(2018,3000,4000,5000);
insert into education values(2019,3300,4400,5200);
insert into education values(2020,3400,4500,5300);
insert into education values(2021,3500,4600,5500);

查看数据: select * from education;
在这里插入图片描述

第二步:编写实体类

②、编写表示信息的实体类 EducationBean,应该包括成员变量、访问器方法(set、get)和构造方法

打开Java编译工具,这里用的是Eclipse
选择【File】→【new】→【Project】
在这里插入图片描述
接着选择【web】→【Dynamic Web Project】
在这里插入图片描述
然后起个名字直接点完成
在这里插入图片描述
接下来创建实体类bean
在src上点击右键,new→package
在这里插入图片描述
输入名字bean
在这里插入图片描述
然后创建类EducationBean
在bean上点右键,new→class
在这里插入图片描述
输入名字EducationBean
在这里插入图片描述
接下来编写代码(跟数据库对应):

package bean;

public class EducationBean {
//成员变量
	private int year;
	private int benke;
	private int gaozhong;
	private int chuzhong;

}

然后生成访问器方法(set、get)和构造方法
生成set、get方法动图演示:
请添加图片描述
生成构造方法动图演示:

请添加图片描述
最后EducationBean 里面完整代码:

package bean;

public class EducationBean {
	//成员变量
	private int year;
	private int benke;
	private int gaozhong;
	private int chuzhong;
	//生成set、get方法
	public int getYear() {
		return year;
	}
	public void setYear(int year) {
		this.year = year;
	}
	public int getBenke() {
		return benke;
	}
	public void setBenke(int benke) {
		this.benke = benke;
	}
	public int getGaozhong() {
		return gaozhong;
	}
	public void setGaozhong(int gaozhong) {
		this.gaozhong = gaozhong;
	}
	public int getChuzhong() {
		return chuzhong;
	}
	public void setChuzhong(int chuzhong) {
		this.chuzhong = chuzhong;
	}
	//生成构造方法
	public EducationBean(int year, int benke, int gaozhong, int chuzhong) {
		super();
		this.year = year;
		this.benke = benke;
		this.gaozhong = gaozhong;
		this.chuzhong = chuzhong;
	}
	
}

第三步:编写Dao类

③、编写 EducationDao类,连接到数据库,执行查询,封装查询结果

把驱动程序放到工程里面的lib文件夹,跟着自己的mysql版本走(百度自行搜索jar包下载)
在这里插入图片描述
要在上方加上mysql连接的代码

	private String url = "jdbc:mysql://localhost:3306/test?useSSL=false";  
    // 数据库信息,旧版本中不用useSSL=false
	private String username = "root";
	private String password = "123456";
	private String driverName = "com.mysql.jdbc.Driver";
	
	private Connection con=null;  //连接对象
	private PreparedStatement pstmt = null; //语句对象 
	private ResultSet rs = null; //结果集对象

接下来跟着上方案例的第三步来写,中间的一些参数要改
要改的地方:
数据库名字、数据库字段、表名、用户名、密码、实体类名字、当前行的各个列、构造方法中的参数

package dao;

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

import bean.EducationBean;

public class EducationDao {
	private String url = "jdbc:mysql://localhost:3306/test?useSSL=false";  
    // 数据库信息,旧版本中不用useSSL=false
	private String username = "root";
	private String password = "123456";
	private String driverName = "com.mysql.jdbc.Driver";
	
	private Connection con=null;  //连接对象
	private PreparedStatement pstmt = null; //语句对象 
	private ResultSet rs = null; //结果集对象
	// 得到所有数据
	public List<EducationBean> list(){
		// (1)定义存储数据的容器
		List<EducationBean> datas = new ArrayList<>();
		// (2)把相关对象定义成成员变量
		// (3)try...catch...finally
		try {
			// (6)写sql语句
			String sqlString = "select * from education order by year";
			// (7)连接到数据库
			Class.forName(driverName);
			con = DriverManager.getConnection(url,username,password);
			// (8)执行sql语句,会得到结果集
			pstmt = con.prepareStatement(sqlString);
			ResultSet rSet = pstmt.executeQuery(sqlString);
			// (9)遍历结果集,next指向下一行,并返回true,
			// 如果没有下一行了,返回false,循环结束
			while(rSet.next()) {
				// (10)取出当前行的各个列
				int year = rSet.getInt(1);
				int benke = rSet.getInt(2);
				int gaozhong = rSet.getInt(3);
				int chuzhong = rSet.getInt(4);

				// (11)转换成对象(封装成),调用多个参数的构造方法
				EducationBean educationBean = new EducationBean(year, benke,gaozhong,chuzhong);
				// (12)把当前对象添加到集合中(容器中)
				datas.add(educationBean);
			}
		} catch (Exception e) {
			// (4)处理异常
			//System.out.println(e.getMessage());
			e.printStackTrace();
		} finally {
			// (5)释放资源
			if(rs!=null) {
				try {
					rs.close();
				} catch (Exception e2) {
					
				}
			}
			if(pstmt!=null) {
				try {
					pstmt.close();
				} catch (Exception e2) {
					
				}
			}
			if(con!=null) {
				try {
					con.close();
				} catch (Exception e2) {
					
				}
			}
		}
		// (13)把表示所有对象的数据返回
		return datas;
	}

}

解释:
con:连接对象
pstmt:语句对象
ResultSet:结果集对象

第四步:编写Servlet代码

④、编写 EducationServlet类,关联到请求/list上,调用EducationDao得到数据并存储到request对象中,然后转向 list.jsp

首先新建servlet这样一个包
在这里插入图片描述
然后在包上右键新建Servlet
在这里插入图片描述
起名:EducationServlet
在这里插入图片描述

点下一步后,因为关联到请求/list 上,所以:
请添加图片描述

当然不在这一步改也可以,创建好后在代码内改也行

在这里插入图片描述

新建好后直接找到doGet方法,把上方案例中的2、3、4步复制过来,改下实体类、Dao包名字即可:

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		EducationDao dao = new EducationDao();
		List<EducationBean> datas = dao.list();

		// (3)传值到界面,第一个参数是名字,第二个参数是具体值
		request.setAttribute("datas", datas);

		// (4)跳转到界面,list.jsp是显示数据的界面,list.jsp可以继续访问request
		RequestDispatcher rd = request.getRequestDispatcher("list.jsp");
		rd.forward(request, response);

	}

第五步:画页面

⑤、编写 list.jsp,使用JSTL把查询的结果显示在网页上

需要把JSTL的库放在lib文件夹内(百度自行搜索jar包下载)
在这里插入图片描述
接下来新建JSP页面
在这里插入图片描述
取名为:list.jsp
在这里插入图片描述
这里的页面内容也可以跟着上面的案例来改:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>数据列表</title>
</head>
<body>
	<table>
		<tr>
			<th></th>
			<th>本科人数</th>
			<th>高中人数</th>
			<th>初中人数</th>
		</tr>
		<!-- request.setAttribute("datas",datas); -->
		<!-- datas表示所有数据,data表示其中的一个数据 -->
		<c:forEach var="data" items="${datas}">
			<tr>
				<td>${data.year}</td>
				<td>${data.benke}</td>
				<td>${data.gaozhong}</td>
				<td>${data.chuzhong}</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

在这里插入图片描述

到此代码全部写完

页面运行效果

运行Servlet:
在这里插入图片描述

至此项目包目录:
在这里插入图片描述

扩展:

Dao类代码中JDBC代码

①、 JDBC是Java访问各种数据库管理系统的标准的API,用户编写数据库访问代码的时候不需要关注数据库管理系统的实现细节。

②、使用JDBC的准备工作:
不同的数据库管理系统需要对应的驱动程序,驱动程序是一个压缩包jar包。

要访问的数据库的基本信息:数据库位置(IP+端口+数据库名),认证信息(用户名和口令)

SQL语句:要完成的功能对应的SQL语句

③、 JDBC相关的接口和类:

Driver表示连接数据库的驱动程序,通过驱动程序与数据库交互;
Connection表示应用程序与数据库之间的连接,不管进行什么操作都要先连接到数据库;
Statement、PreparedStatement、CallableStatement执行SQL语句
ResultSet表示执行查询时候的结果集

JDBC使用

①、加载驱动程序:
格式:Class.forName(驱动程序名字)
例如:Class.forName("com.mysql.jdbc.Driver");

②、创建连接:
格式:Connection con = DriverManager.getConnection(constr,user,pass);

constr表示连接字符串,user表示用户名,pass表示密码
例如:Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bookstore" ,"root" ,"root");

③、创建语句对象:
格式:Statement stmt = con.createStatement();

④、执行增删改:
格式:int n = stmt.executeUpdate(sql)n表示执行成功的记录数

例如:

String sql = "insert into student values('000004,wangfei',20)";
int n = stmt.executeUpdate(sql);

正常插入返回1,插入失败返回0

⑤、执行查询:
格式:ResultSet rs = stmt.executeQuery(sql)n表示执行成功的记录数,sql表示要执行的sql语句

例如:

String sql ="select * from student";
ResultSet rs = stmt.executeQuery(sql);

⑥、结果集处理:

结果集就像一个有表头的表格

通过next方法指向下一行,如果没有下一行返回false

使用getInt(n),或者getInt(列名)得到当前行的第一列,返回值是int类型

使用getString(n),或getString(列名),返回值是String类型

查询单个值(例如某个表的记录数):

rs.next();
int n = rs.getInt(1);

查询一条记录(例如根据主键查询学生):

if(rs.next())
	String sname = rs.getString(2)

查询多条记录(例如查询所有学生):

while(rs.next))
	String sname = rs.getString(2);

⑦、关闭相关对象:

需要关闭的对象:连接对象Connection、语句对象Statement、结果集对象ResultSet

关闭顺序:结果集对象、语句对象、连接对象

通常关闭的时候,需要异常处理:

//加载驱动程序,驱动程序不存在
//执行的SQL语句出错了
//连接的数据库不存在,数据库没有启动也会出错
if(rs!=null) try{rs.close()}catch(Exception e);  
if(stmt!=null) try{stmt.close()}catch(Exception e); 
if(con!=null) try{con.close()}catch(Exception e);

⑧、异常处理
在访问数据库的过程中可能发生各种异常,所以需要进行异常处理。

完整代码

package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class DBBean {
	//数据库信息,旧版本中不用useSSL=false
	private String url = "jdbc:mysql://localhost:3306/practice2020?useSSL=false";
	private String username = "root";
	private String password = "root";
	private String driverName = "com.mysql.jdbc.Driver";
	
	private Connection con=null; //连接对象
	private PreparedStatement pstmt = null; //语句对象
	private ResultSet rs = null; //结果集对象
	
//连接、执行、关闭
public DBBean() throws ClassNotFoundException, SQLException {
	//加载驱动程序,创建连接
	Class.forName(driverName);
	con = DriverManager.getConnection(url,username,password);
}
//增删改(区别在SQL语句和SQL语句里面需要的变量)
public int executeUpdate(String sql,List<Object> params) throws SQLException{
	//创建语句对象
	pstmt = con.prepareStatement(sql);
	//如果有参数,表示提供的参数在SQL语句里面需要变量。如果变量和参数不一致,报错
	if(params!=null && params.size()>0){
	 	//有多少变量循环多少次
		for(int i=0;i<params.size();i++){ 
			//对变量赋值
			pstmt.setObject(i+1,params.get(i));  
		}
	}
	return pstmt.executeUpdate();
}

//查询
public ResultSet executeQuery(String sql,List<Object> params) throws SQLException{
	pstmt = con.prepareStatement(sql);
	if(params!=null && params.size()>0){
		for(int i=0;i<params.size();i++){
			pstmt.setObject(i+1,params.get(i));
		} 
	}
	return pstmt.executeQuery();
}
//关闭
public void close(){
	if(rs!=null){
		try {rs.close();
		}catch(Exception ee){}
	}
	if(pstmt!=null){
		try {pstmt.close();
		}catch(Exception ee){} 
	}
	if(con!=null){
		try {con.close();
		}catch(Exception ee){}
		}
	} 
}

总结:

实现自己数据的展示

基本过程:
(1)创建 Web 工程;
(2)创建表示信息的实体类;
(3)添加两个类库:json 和 mysql 驱动程序;
(4)复制 DBBean,修改数据库信息;
(5)创建 DAO,从数据库中获取信息;
(6)创建 Service,调用 DAO 得到数据;
(7)创建 Servlet,调用 Service,对用户返回 JSON 数据;
(8)创建页面文件,获取 Servlet 的数据并显示。

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

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

相关文章

SpringBoot中使用redis事务

本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到&#xff0c;其实非关系型数据库&#xff0c;比如redis也有对事务的支持&#xff0c;本文主要探讨在SpringBoot中如何使用redis事务。 事务的相关介绍可以参考&#xff1a; 0、起因 在一次线上事故中&#xff0c;我们…

与春相拥,在职读研邂逅中国人民大学与加拿大女王大学金融硕士项目何其有幸

工作几年后的你是否有冒出在职读研的想法&#xff1f;或许你为此纠结了一段时间&#xff0c;在职读研要考虑到的因素众多&#xff0c;年龄、精力分配等&#xff0c;工作几年&#xff0c;经历了职场的磨练&#xff0c;更能知道自己家想要的是什么&#xff0c;对于是否读研会有一…

红海云签约长久数科,引领汽车流通行业人力资源数字化创新

上海铂中数字科技有限公司&#xff08;以下简称“长久数科”&#xff09;是国内领先的数字化汽车供应链服务企业&#xff0c;致力于通过整合客户资源、技术资源、产业链配套资源以及地面服务资源&#xff0c;打造一站式服务的汽车生态大数据SaaS平台。 近日&#xff0c;长久数…

编译原理陈火旺第三版第六章课后题答案

下面的答案仅供参考&#xff01; 1.按照表6.1所示的属性文法&#xff0c;构造表达式(4*71) *2的附注语法树。 答&#xff1a; 首先考虑最底最左边的内部结点,它对应于产生式F→digit,相应的语义规则为F. val: digit.lexval,由于这个结点的子结点digit的属性digit . lexval的…

一文彻底理解Java 17中的新特性密封类

密封类的作用 在面向对象语言中&#xff0c;我们可以通过继承&#xff08;extend&#xff09;来实现类的能力复用、扩展与增强。但有的时候&#xff0c;有些能力我们不希望被继承了去做一些不可预知的扩展。所以&#xff0c;我们需要对继承关系有一些限制的控制手段。而密封类…

android framework-ActivityManagerService(AMS)上

一、SystemServer android-10.0.0_r41\frameworks\base\services\java\com\android\server\SystemServer.java 1.1、startOtherService AMS初始化完成后&#xff0c;会调用systemReady方法。 mActivityManagerService.systemReady(() -> {Slog.i(TAG, "Making service…

springboot +flowable,简单实现工作流基础功能的demo例子

一.简介 对于flowable是什么以及关于此框架的具体信息可以参看此项目的官方文档&#xff1a;https://www.flowable.org/docs/userguide/index.html Flowable is a light-weight business process engine written in Java.这是官网文档对此框架的完美解释&#xff1a;Flowable…

NetApp AFF C 系列全闪存存储解决方案

NetApp AFF C 系列: “C”代表“酷炫”(Cool) 采用最新的容量闪存技术&#xff0c;辅以若干一流的智能技术&#xff0c;您将获得一个经济实惠的闪存解决方案&#xff0c;它重新定义了安全性、可扩展性和可持续性。 为什么选择 AFF C 系列的容量闪存解决方案&#xff1f; 实现…

jmeter获取图片验证码-解密图片并识别

说明&#xff1a; 关于图片验证码的处理方式有三种方法&#xff1a;一是让开发屏蔽验证码&#xff0c;二是让开发后端指定一个万能验证码&#xff0c;三是使用OCR工具进行图片验证码的解密及识别&#xff0c;推荐使用前两种方法最省事&#xff1b; OCRServer工具识别图片验证码…

Netty核心源码分析(二),Netty的Server端接收请求过程源码分析

文章目录 系列文章目录一、连接请求接受过程源码分析1、事件的值2、processSelectedKeys获取事件&#xff08;1&#xff09;doReadMessages方法&#xff08;2&#xff09;pipeline的fireChannelRead方法&#xff08;3&#xff09;ServerBootstrapAcceptor的channelRead方法 3、…

关于数据挖掘和数据集成?

按照数据的生命周期&#xff0c;我们通常将大数据技术分为数据集成、数据存储、批流处理、数据查询与分析、数据调度与编排、数据开发、BI 7 个部分。 可以看到数据集成在数据生命周期最前面的位置&#xff0c;它负责将多个来自不同数据源的数据聚合存放在一个数据存储中&…

分布式任务调度框架Power-Job

分布式任务调度框架的由来及对比 在大型业务业务系统中&#xff0c;不可避免会出现一些需要定时执行需求的场景&#xff0c;例如定时同步数据&#xff0c;定时清洗数据&#xff0c;定时生成报表&#xff0c;大量机器一同执行某个任务&#xff0c;甚至有些需要分布式处理的任务…

中继器+js组件化GIS地图

虽然可以使用JavaScript注入的方式将GIS地图嵌入Axure&#xff0c;但每次使用地图都需要重复嵌入并修改代码&#xff0c;不太方便。那么&#xff0c;能不能实现组件化呢&#xff1f;我们可以使用中继器&#xff08;repeater&#xff09;将常用的地图参数提取出来&#xff0c;通…

力扣题库刷题笔记406-根据身高重建队列

1、题目如下&#xff1a; 2、个人Python代码实现 这里需要单独备注一下截图中第21行代码&#xff1a; 上图可以看到&#xff0c;已经对[5, 2]等元素进行了遍历循环&#xff0c;且[5, 2]左侧确实只存在[7, 0][6, 1]两个元素身高高于他&#xff0c;但是继续[5,0]循环完成后&#…

@Async异步线程:Spring 自带的异步解决方案

前言 在项目应用中&#xff0c;使用MQ异步调用来实现系统性能优化&#xff0c;完成服务间数据同步是常用的技术手段。如果是在同一台服务器内部&#xff0c;不涉及到分布式系统&#xff0c;单纯的想实现部分业务的异步执行&#xff0c;这里介绍一个更简单的异步方法调用。 对于…

FreeRTOS - 计数信号量

一.任务功能 1、修改按键功能&#xff0c;模拟停车位出入功能 2、当按键按下 获取车位 3、当按键抬起 释放车位 二.API接口 函数原型SemaphoreHandle_t xSemaphoreCreateCounting( ①UBaseType_t uxMaxCount,②UBaseType_t uxInitialCount );功能概述创建计数信号量&#xff0c…

详解空气质量API 使用

引言 空气污染是当今世界面临的一大环境问题&#xff0c;而空气质量监测数据是制定环境政策和公众健康计划的重要依据。通过提供空气质量查询 API&#xff0c;开发人员可以方便地获取中国境内多个城市的空气质量数据&#xff0c;从而更好地监测和管理空气质量。 本文将介绍的…

Redis入门学习笔记【一】

目录 一、redis是什么 二、Redis数据结构 2.1 Redis 的五种基本数据类型 2.1.1String&#xff08;字符串&#xff09; 2.1.2字符串列表&#xff08;lists&#xff09; 2.1.3字符串集合&#xff08;sets&#xff09; 2.1.5哈希&#xff08;hashes&#xff09; 2.2 Red…

设计模式详解-软件设计(五十六)

原创 真题详解(UML图)-软件设计&#xff08;五十五)https://blog.csdn.net/ke1ying/article/details/130311994 创建型、结构型、行为型 抽象工厂&#xff08;Abstruct Factory&#xff09; 提供一个创建系列相关或相互依赖的接口&#xff0c;无须指定他们具体的类。 适用于&…

07-Node.js—包管理工具

目录 1、概念介绍1.1 包是什么1.2 包管理工具1.3 常用的包管理工具 2、npm2.1 npm 的安装2.2 npm 基本使用2.2.1 初始化2.2.2 搜索包2.2.3 下载安装包2.2.4 require 导入 npm 包基本流程 2.3 生产环境与开发环境2.4 生产依赖与开发依赖2.5 全局安装2.5.1 修改 windows 执行策略…