4、按钮事件
事件的定义 4、事件概述 日常生活:电话铃响、门铃响、汽车启动 计算机:鼠标点击、键盘按键、窗口关闭、窗口移动、 窗口最大化、拖动、鼠标经过等
事件类型 典型动作 4、常用事件监听器类 ActionListener 处理按钮、列表双击、单击菜单项目 KeyListener 处理键盘的输入 MouseListener 处理鼠标拖动、移动、单击、按下、释放或者进入、退出组件的事件 ComponetListener 处理组件被隐藏、移动、尺寸调整或者变为不可见的事件 FocusListener 处理组件获得或失去焦点的事件 TextListener 处理文本区域或者文本区域的值的改动 WindowListener 处理窗口激活、失去活动窗口、最小化、最小化、打开、关闭或者退出的事件
4、事件绑定
事件类型 典型触发动作 4、常用事件类 ActionEvent 按钮、列表双击、单击菜单项目 KeyEvent 键盘的输入 MouseEvent 鼠标拖动、移动、单击、按下、释放或者进入、退出组件的事件 ComponentEvent 组件被隐藏、移动、尺寸调整或变为不可见的事件 FocusEvent 组件获得或失去焦点的事件 InputEvent 复选框和列表项单击、控件的选择和可选菜单项的选择事件 TextEvent 文本区域或者文本区域的值的改动 WindowEvent 窗口激活、失去活动窗口、最小化、最小化、打开、关闭或者退出的事件
4、事件机制的几个概念 事件源 描述人机交互中事件的来源 (EventSource) 通常是Java图形包中组件 事 件 事件源产生的交互内容,如“按下鼠标” (ActionEvent) 在 java.awt.event包中定义的类 事件监听器 接收事件并进行处理,由程序员编写 (ActionListener) 对应处理所监听事件源产生的事件 监听器接口 编写“事件监听器”的“规定” – “抽象方法” 必须在监听器类中实现这些方法完成事件处理 监听器注册 将事件监听器对象绑定到事件源,进行监听
4、事件处理 实现事件处理的步骤 创建事件监听器类 创建事件监听器对象 注册事件监听器
4、事件处理例1.代码 设计自己的窗体类 按钮 事件源 注册监听器 主类 监听器类 import java.awt.*; import java.awt.event.*; class ButtonListener implements ActionListener { public void actionPerformed ( ActionEvent e ) { System.out.println ( “我知道你按下按钮啦“ ); } 按钮 窗体 主类 监听器 监听器类 class myButtonFrame extends Frame { Button btn; myButtonFrame(String s) { //构造函数 super(s); this.setSize(200,120); /* 创建按钮*/ btn = new Button("点击"); this.add(btn); // 事件监听器创建和注册 ButtonListener bl = new ButtonListener(); btn.addActionListener(bl); } 设计自己的窗体类 按钮 事件源 注册监听器 public class ActionEventTest { // 主类 public static void main(String args[]){ myButtonFrame frm = new myButtonFrame("ActionEventTest"); frm.show(); // 显示窗体 } 主类
4、内部类事件程序实现
4、Java中的内部类 写法是否正确? 内部类是附属于外部类的实例的,它们只能与外部类的实例一起存在。 内部类的方法可以直接访问外部类的私有变量和方法
4、匿名类的方式实现事件处理
4、匿名类 匿名类的定义 顾名思义就是未被命名的类 匿名类的特征 在程序中只使用(即:被实例化)一次
2019/2/16 Java语言程序设计-数据库编程 教师:段鹏飞
单 词 说 明 本章相关词汇 driver 驱动,驱动程序 connection 连接 manager 管理器 statement 语句 单 词 说 明 driver 驱动,驱动程序 connection 连接 manager 管理器 statement 语句 prepared 预备的,预编译的 result 结果 create 创建,创造 execute 执行 query 查询
通过JDBC访问数据库执行SQL 语句的方法。 主要内容 JDBC的特点,结构,应用模型; JDBC驱动程序的类型; 通过JDBC访问数据库执行SQL 语句的方法。
问题1:应用程序中的SQL语句如何传到数据库中执行 数据库编程 发送 SQL 语句 客户机/服务器 应用程序 数据库 检索查询结果 问题1:应用程序中的SQL语句如何传到数据库中执行 问题2:数据库的执行结果如何返回到应用程序中
解决方案:应用程序和数据库之间必须建立一条通道,提供SQL语句的发送和执行结果的返回 数据库访问技术简介 解决方案:应用程序和数据库之间必须建立一条通道,提供SQL语句的发送和执行结果的返回 建立通道的方式 JDBC:JAVA 数据库连接应用程序接口
当今企业级应用程序大部分采用了客户机/服务器(C/S)模式; JDBC 当今企业级应用程序大部分采用了客户机/服务器(C/S)模式; 客户端机器需要与服务器进行通讯,要操作数据库中的数据,执行SQL(Structured Query Language结构化查询语言)语句以及检索查询结果; 在Java中实现这些活动的技术称作JDBC。
DBMS(DataBase Management System)是指数据库管理系统; 目前DBMS的生产商众多,产品也不尽相同,如: Oracle公司的Oracle系列; Microsoft公司的Access系列和SQL Server系列; Microsoft公司早期的FoxPro; IBM公司的DB2; Sybase公司的Sybase; 还有自由开源的MySQL等等。 这就意味着编程语言要针对不同的DBMS开发不同版本的应用程序,这将是一项非常枯燥的工作。
JDBC直连应用图解 Oracle厂商提供 Java 应用程序 JDBC 驱动 JDBC 驱动 SQL厂商提供 Oracle JDBC API Sql Server JDBC 驱动 SQL厂商提供
JDBC驱动 JDBC驱动是数据库厂商提供的,在数据库编程中,用到哪种数据库就需要在应用程序中添加相应的驱动程序 以MySql数据库为例,MySql提供的JDBC驱动为: 使用前需要其导入应用程序中(演示)
JDBC API可做三件事:与数据库建立连接、执行SQL 语句、处理结果 2 Connection 数据库服务器 客户端 3 Statement ResultSet 4 1 DriverManager DriverManager :依据数据库的不同,管理JDBC驱动 Connection :负责连接数据库并担任传送数据的任务 Statement :由 Connection 产生、负责执行SQL语句 ResultSet:负责保存Statement执行后所产生的查询结果
java.sql包也是Java内置的包,其中包含了一系列用于与数据库进行通信的类和接口; 如果要使用到这些类和接口的话,则必须显式地声明如下语句: import java.sql.*;
java.sql包中的一些接口 接口名称 说 明 Connection Driver Statement PreparedStatement 说 明 Connection 连接对象,用于与数据库取得连接 Driver 用于创建连接(Connection)对象 Statement 语句对象,用于执行SQL语句,并将数据检索到结果集(ResultSet)对象中 PreparedStatement 预编译语句对象,用于执行预编译的SQL语句,执行效率比Statement高 CallableStatement 存储过程语句对象,用于调用执行存储过程 ResultSet 结果集对象,包含执行SQL语句后返回的数据的集合
类 名 称 说 明 java.sql包中的一些类 SQLException DriverManager Date TimeStamp 类 名 称 说 明 SQLException 数据库异常类,是其它JDBC异常类的根类,继承于java.lang.Exception,绝大部分对数据库进行操作的方法都有可能抛出该异常 DriverManager 驱动程序管理类,用于加载和卸载各种驱动程序,并建立与数据库的连接 Date 该类中包含有将SQL日期格式转换成Java日期格式的方法 TimeStamp 表示一个时间戳,能精确到纳秒
JDBC程序访问数据库步骤 导入 java.sql包 附加相应产商提供的驱动 加载并注册驱动程序 创建Connection 对象 开 始 导入 java.sql包 纯Java驱动方式 附加相应产商提供的驱动 加载并注册驱动程序 创建Connection 对象 创建 Statement 对象 关闭ResultSet 对象 使用ResultSet对象 执行SQL语句 关闭Statement对象 关闭Connection对象 结 束
这里以JDBC驱动方式为例,逐步详细地讲解在Java程序中如何操作数据库。 步骤详解1:建立数据源 这里以JDBC驱动方式为例,逐步详细地讲解在Java程序中如何操作数据库。 下载驱动程序包,以mysql为例: 下载地址: http://59.69.101.2/tool/mysql_driver.zip
使用纯Java驱动连接到MySQL 5.0数据库,加载驱动程序应改成如下语句: 步骤详解2:加载驱动程序 加载并注册驱动程序 使用纯Java驱动连接到MySQL 5.0数据库,加载驱动程序应改成如下语句: Class.forName("com.mysql.jdbc.Driver");
使用Class类的forName方法,将驱动程序类加载到JVM(Java虚拟机)中; 步骤详解2:加载驱动程序 使用Class类的forName方法,将驱动程序类加载到JVM(Java虚拟机)中; 如: Class.forName("com.mysql.jdbc.Driver"); 方 法 原 型 说 明 static Class forName(String className) throws ClassNotFoundException 将由className指定完整名称的类加载到JVM中,如果加载失败,将抛出异常,必须捕捉
创建Connection 对象 连接字符串应如下格式: 如: 步骤详解3:获得连接对象 "jdbc:mysql://服务器名或IP:3306/数据库名" 如: Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
成功加载驱动后,必须使用DriverManager类的静态方法getConnection来获得连接对象; 步骤详解3:获得连接对象 成功加载驱动后,必须使用DriverManager类的静态方法getConnection来获得连接对象; 对于使用JDBC桥的连接方式,连接字符串的一般形式是:“jdbc:类型:数据源名称”,如: Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456"); 方 法 原 型 说 明 static Connection getConnection (String url, String user, String password) throws SQLException 参数url是连接字符串,参数user是数据库用户名,参数password是登录口令,成功连接到数据库返回Connection对象,连接失败则抛出SQLException异常,必须捕捉
Statement sta = con.createStatement(); 一旦成功连接到数据库,获得Connection对象后,必须通过Connection对象的createStatement方法来创建语句对象,才可以执行SQL语句; 如: Statement sta = con.createStatement(); 方 法 原 型 说 明 Statement createStatement() throws SQLException 成功创建返回Statement对象,否则抛出SQLException异常,必须捕捉
使用语句对象来执行SQL语句,有两种情况: 一种是执行DELETE、UPDATE和INSERT之类的数据库操作语句(DML),这样的语句没有数据结果返回,使用Statement对象的executeUpdate方法执行; 如: sta.executeUpdate("INSERT INTO friends (name, class, age) VALUES ('Tom','m1701',17)"); 方 法 原 型 说 明 int executeUpdate(String sql) throws SQLException 参数sql是要执行的SQL语句,执行成功返回受影响的行数,执行失败则抛出SQLException异常,必须捕捉
步骤详解5:执行SQL语句(续) 另一种是执行SELECT这样的数据查询语句(DQL),这样的语句将从数据库中获得所需的数据,使用Statement对象的executeQuery 方法执行; 如: ResultSet rs = sta.executeQuery("SELECT * FROM friends"); 方 法 原 型 说 明 ResultSet executeQuery(String sql) throws SQLException 参数sql是要执行的SQL语句,查询成功返回包含有结果数据的ResultSet对象,否则抛出SQLException异常,必须捕捉
当对数据库的操作结束后,应当将所有已经被打开的资源关闭,否则将会造成资源泄漏; 步骤详解6:关闭资源 当对数据库的操作结束后,应当将所有已经被打开的资源关闭,否则将会造成资源泄漏; Connection对象、Statement对象和ResultSet对象都有执行关闭的close方法; 函数原型都是:void close() throws SQLException 如: rs.close(); //关闭ResultSet对象 sta.close(); //关闭Statement对象 con.close(); //关闭Connection对象 有可能抛出SQLException异常,必须捕捉; 请注意关闭的顺序,最后打开的资源最先关闭,最先打开的资源最后关闭。
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo { public static void main(String[] args) { String strCon = "jdbc:mysql://127.0.0.1:3306/test"; //连接字符串 String strUser = "root"; //数据库用户名 String strPwd = "root"; //口令 System.out.println("正在连接数据库..."); try { //监控异常 Class.forName("com.mysql.jdbc.Driver"); //加载驱动程序 Connection con; //获得连接对象 con = DriverManager.getConnection(strCon, strUser, strPwd); System.out.println("成功连接到数据库。"); Statement sta = con.createStatement(); //创建语句对象 //执行SQL语句 String strSql = "DELETE FROM Friends WHERE [Name] = '郑六'"; int count = sta.executeUpdate(strSql); System.out.println("成功删除" + count + "行数据。"); sta.close(); con.close(); //关闭所有已经打开的资源 } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); } } }
操作结果集 使用Statement对象的executeQuery方法成功执行SELECT语句后,将返回一个包含有结果数据的ResultSet对象,要从该对象中获取数据,将使用到如下方法: 方 法 原 型 说 明 boolean next() throws SQLException 将结果集游标往下移动一行,如果已经到达结果集最后,将会返回false,有可能抛异常,必须捕捉 X getX(String columnName) 获得某个字段的值,X是指具体的数据类型,视数据库表中字段的具体情况而定,该方法有一组,并且每个都有两种重载方法,一种是以字段名称为参数,另一种是以字段索引为参数(字段索引从1开始),有可能抛异常,必须捕捉 X getX(int columnIndex)
操作结果集示例 try { String strCon = "jdbc:odbc:MyODBC"; System.out.println("正在连接数据库..."); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con; con = DriverManager.getConnection(strCon, "sa", ""); System.out.println("成功连接到数据库。"); Statement sta = con.createStatement(); ResultSet rs = sta.executeQuery("SELECT * FROM Friends"); System.out.println("查询到数据如下:"); while (rs.next()) { //循环将结果集游标往下移动,到达末尾返回false //根据字段名称获得各个字段的值 System.out.print(rs.getString("Name") + "\t"); //获得字符串 System.out.print(rs.getString("Address") + "\t"); //获得字符串 System.out.print(rs.getInt("Telephone") + "\t"); //获得整数 System.out.print(rs.getDate("HireDate") + "\t"); //获得日期型数据 System.out.println(rs.getFloat("Salary")); //获得浮点型数据 } rs.close(); sta.close(); con.close(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); }
Sql语句 select * from [table] where id=3; insert into [table] (id, uname, psw) values (1, 'abc', '123'); update [table] set uname='abc' where id=3; delete from [table] where id=3;
总结 JDBC是使用Java程序操作数据库的技术; 使用 Class类的forName 方法可以将驱动程序加载到 Java 解释器中; 使用DriverManager类的getConnection方法获得Connection对象,从而建立与数据库的连接; 使用Connection对象的createStatement方法创建语句对象,以便执行SQL语句; 使用Statement对象的executeQuery或executeUpdate方法执行SQL语句,并使用ResultSet对象来操作结果数据; PreparedStatement接口允许创建预编译的SQL语句,并使得在后续阶段可以指定语句的参数。
2019/2/16 Java语言程序设计-网络编程 教师:段鹏飞
主要内容 使用URL类访问网络资源 基于Socket的客户和服务器编程
1 URL类 URL(Uniform Resource Locator)是统一资源定位器的简写。它表示Internet上某一资源的地址,这些资源包括Web网页、文本文件、图形(像)文件和声频片段等。通过URL可以访问Internet和WWW。浏览器通过解析给定的URL可以在网络上查找相应的文件或资源。
1 URL的组成和URL类
URL myURL = new URL(“http://www.whut.edu.cn”); import java.net.* Java将URL封装成URL类,通过构造方法可以实例化一个URL对象。 public URL(String spec) public URL( URL url, String file) public URL(String protocol, String host, String file) public URL(String protocol, String host, int port, String file) URL myURL = new URL(“http://www.whut.edu.cn”); URL mydoc = new URL(myURL, “index.html”); URL myURL = new URL(“http”, “www.sohu.com”, “index.html”); URL myURL = new URL(“http”, “www.sohu.com”, 80,“index.html”);
例1 获取URL对象属性 the Protocol: http the hostname: www.webmeteor.cn the port: -1 the file: /index.htm the ext: http://www.webmeteor.cn/index.htm http://www.webmeteor.cn/index.htm
1 使用URL类读取WWW信息 通过openStream()与指定的URL建立连接并返回一个InputStream类的对象,然后从这一连接中读取数据。 常用的读取网络资源数据的步骤如下: 创建URL类的实例对象; 通过URL类的实例对象的openStream方法建立连接; 读取数据; 关闭数据流;
例2 用url.openStream()方法读取WWW数据
2 Socket通信 预备知识 Socket TCP UDP 端口
2 Socket通信 预备知识 Socket是网络上的两个程序通过一个双向的通信连接实现数据交换的通道。或者说网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,可以说Socket是面向客户/服务器模型设计的。Socket通信机制提供了两种通讯方式:有联接(TCP)和无联接(UDP)方式,分别面向不同的应用需求。 TCP是以连接为基础的流式协议,通信前,首先要建立连接,然后才能通信。因此,能保证同步、准确地进行通信。如果应用程序需要可靠的点对点通信,一般采用TCP这种协议。比如:HTTP,ftp,telnet等应用程序,确保其可靠性对于程序运行是非常关键的。
2 Socket通信 UDP是一种无连接的协议,其系统开销比无联接方式小,但通信链路提供了不可靠的数据报服务,每个数据报都是一个独立的信息,不能保证信源所传输的数据一定能够到达信宿。在该方式下,通信双方不必创建一个联接过程和建立一条通讯链路,网络通信操作在不同的主机和进程之间转发进行。 端口: 数据通过网络到达一台主机(或准确的说是主机的网卡)是通过IP地址实现的。但当该主机运行多个程序时如何识别数据是属于哪个程序的呢? 这就是端口。一个端口只能绑定一个应用程序。通过TCP/UDP通信的应用程序必须知道对方的IP地址和端口号才能通信。端口号可取从0-65535,其中,0-1023为保留端口,提供给众所周知的一些服务。
2 UDP UDP仅在想发送时才发送,可将对方作为目标发送数据包 主机A 主机B
2 UDP 主机A 主机B 即使因网络混杂,产生数据包丢失现象,也不进行特别处理。
可与对方的主机进行通信,确认是否接收到对方的连接 2 TCP三次握手 可与对方的主机进行通信,确认是否接收到对方的连接 SYN(请求建立连接) 主机B 主机A SYN+ACK(确认SYN响应和连接请求) Ack(确认SYN响应) A:你瞅啥? B:瞅你咋地? A:来咱俩唠唠。 然后就唠上了... A:你能听到我说吗? B:能,我说你能听到吧? A:嗯,开始聊天吧。 A:How are you? B:Fine, and you? A:Fine.
2 TCP通信 通过顺序号与确认响应号来确认数据是否到达.确认响应后,才通知下一个应当发送的顺序号。 顺序号=3001 主机B 主机A 确认响应序号=4001 顺序号=4001 确认响应序号=5001
2 Socket应用 客户端与服务器端的实现 服务器端 客户端
对客户端对Socket进行读写-实例 客户端 服务器端 2 Socket应用 Localhost Socket OutputStream InputStream me.whut.edu.cn ServerSocket InputStream OutputStream 客户端 服务器端
2 Socket通信的一般过程 使用Socket进行客户/服务器通信程序设计的一般过程是这样的: Server端listen(监听)某个端口是否有连接请求, Client端向Server端发出connect(连接)请求, Server端向Client端发回Accept(接受)消息。 一个连接就建立好了,之后客户端、服务器端都可以用send()、write()等方法与对方通信。
2 Socket通信的一般过程 对于一个功能齐全的Socket的工作过程包含以下四个基本步骤: 创建Socket; 打开连接到Socket的输入输出流; 按照一定的协议对Socket进行读/写操作; 关闭Socket。
8.5 Socket . 8.5 Socket 定义数据成员 定义数据成员 1111 创建Socket实例 创建服务器(端口号) waiting for user 127.0.0.1 1111 服务器等待 网络连接 建立socket流 读socket流 (接收并显示) 建立socket流 connetcting client... login: 向用户发出一个字符串 送用户名给 服务器 java 读客户 端信息 User :java 读socket流 Login successful 提示用户登录成功 关闭流
Socket应用 me.whut.edu.cn ServerSocket Localhost Socket OutputStream InputStream Socket应用 ServerSocket s = null; String hello = “Hello World!”; try { s = new ServerSocket(5432); } catch(IOException e) { System.out.println(e); System.exit(1); } while(true) { Socket cs = s.accept(); OutputStream out = cs.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); dos.writeUTF(hello); out.close(); cs.close(); } catch(IOException e) { System.out.println(e); } 监听端口 接收连接 打开输出流 写入输出流 关闭输出流 关闭连接
对客户端对Socket进行读写-实例 Socket应用 me.whut.edu.cn ServerSocket Localhost OutputStream InputStream Socket应用 对客户端对Socket进行读写-实例 import java.net.*; import java.io.*; public class SimpleClient { public static void main(String args[]) { Socket s = new Socket(“me.whut.edu.cn”, 5432); InputStream in = s.getInputStream(); DataInputStream dis = new DataInputStream(in); String st = dis.readUTF(); System.out.println(st); in.close(); s.close(); } 建立连接 打开输入流 读取输入流 关闭输入流 关闭连接
java.net.Socket类 2 Socket编程 表示TCP连接的客户方(Client),和谁连接 Socket对象包括两个流 指定对方的IP地址和端口号 public Socket(String host, int port) throws UnknownHostException, IOException Socket对象包括两个流 Socket代表了TCP所定义的双向通信连接的一个端点 输入流(读取通过网络进来的数据) public InputStream getInputStream() throws IOException 输出流(将数据写入输出流中,并通过网络发送) public OutputStream getOutputStream() throws IOException 操作步骤 先建立连接 进行流的读写操作
java.net.ServerSocket类 TCP连接的服务器方(Server),监听端口 等待自客户端发来的连接 public ServerSocket(int port) throws IOException 接收连接请求 public Socket accept() throws IOException Listens for a connection to be made to this socket and accepts it. The method blocks(阻塞) until a connection is made 服务器端通过所接收到的Socket对象和客户端通信 Socket代表了TCP所定义的双向通信连接的一个端点 操作步骤 监听端口 接收连接 进行流的读写操作
2 创建Socket 创建客户端Socket可以通过Socket的构造方法,介绍如下: public Socket(String host,int port) public Socket(InetAddress address,int port) // 用该方法创建一个与指定远程主机及其端口建立连接; public Socket(String host,Int port,boolean stream) // stream指明Socket是流式Socket还是数据报式Socket public socket(InetAddress address,Int port,boolean stream) Serversocket的构造方法为: public Serversocket(int port) //指定端口号来创建Serversocket对象,该端口为端主机的端口; public Serversocket(int port,int count) //用指定的端口号创建Serversocket对象,如果该端的端口正在使用,只等待count毫秒。
2 打开输入/输出流 public Inputstream getInputstream( ) //得到 Socket建立的输入流 pubic Outputstream getoutputstream( ) //得到 Socket建立的输出流 Socket对象的其他方法: public void close() public InetAddress getlnetAddress() //得到远程主机 IP地址的 InetAddress对象 public int getLocalPort() //得到与远程机连接的本地机的端口号
2 Serversocket对象的其他方法 public Socket accept() //获取与客户端连接的 Socket对象 //accept()为一个阻塞性方法,即该方法被调用后,将等待客户的请求,直到有一个客户启动并请求连接到相同的端口,然后accept()返回一个对应于客户的Socket。 public void close() public InetAddrss getInetAddress() // 得到与客户端相连的 InetAddress对象 public int getLocalPort() // 得到服务器在监听的端口号
多线程的服务器实现 2 Socket应用 为每个客户的连接(Socket)分配一个线程,让其独立处理 两种实现方式 作为java.lang.Thread类的子类 实现java.lang.Runnable接口 Client 1 Socket Port 7 me.whut.edu.cn ServerSocket 1 3 2 1 Thread 1 2 Client n Socket 3 Thread n
多线程的服务器实现-实例 2 Socket应用 ServerSocket s = new ServerSocket(5432); boolean listening = true; while (listening) new ServerThread(s.accept()).start(); s.close(); class ServerThread extends Thread { … … public void run() { }