2.28k likes | 2.45k Views
J2EE 平台. 内容. 为什么引入 J2EE ? 什么是 J2EE ? J2EE 的组成. 主机系统或单层结构. 数据访问、表示和业务逻辑在一个应用中 功能紧紧耦合在一起 代码复用、代码可维护性、和代码的修改十分困难。 不是分布式的,不具有可伸缩性。. Fat client. 胖客户端: 表示逻辑 业务逻辑 业务数据模型 通讯. Fat client. 传统的客户 / 服务器:“胖”客户端. 功能集中,不利于更新和维护; 数据模型“紧耦合”在每一客户端 数据库结构改变将导致全体客户端改变 任何一点更新要对每一客户端进行部署
E N D
内容 • 为什么引入J2EE? • 什么是J2EE? • J2EE的组成
主机系统或单层结构 • 数据访问、表示和业务逻辑在一个应用中 • 功能紧紧耦合在一起 • 代码复用、代码可维护性、和代码的修改十分困难。 • 不是分布式的,不具有可伸缩性。
Fat client 胖客户端: 表示逻辑 业务逻辑 业务数据模型 通讯 Fat client 传统的客户/服务器:“胖”客户端 • 功能集中,不利于更新和维护; • 数据模型“紧耦合”在每一客户端 • 数据库结构改变将导致全体客户端改变 • 任何一点更新要对每一客户端进行部署 • 数据库连接是针对每一客户端的 • 伸缩困难 • 原始数据通过网络传递:加重网络负担
构件(component)与中间层开发 • 两个转变: • 计算模式上:网络计算(Network Computing) • 生产模式上:基于构件的开发(Component-based Dev) • 二者的结合: 服务器端中间层构件的开发
在企业级应用开发中的问题 • 分布式 • 可移植 • 面向Web体系 • 可装配 • 满足企业计算要求 • 一致性 • 事务性 • 安全性 • 好的特性 • 可伸缩 • 可扩展 • 易维护
为什么需要J2EE • 分布式、可移植构件的框架 • 简化服务器端中间层构件的设计 • 为构件与应用服务器提供标准API
J2EE • Open and standard based platform for developing, deploying and managing n-tier, Web-enabled, server-centric enterprise applications • 开放的、基于标准的平台,用以开发、部署和管理N层结构、面向Web的,以服务器为中心的企业级应用。
J2EE 1.2中的API与技术 • Java 2 SDK, Standard Edition 1.2 • RMI/ IIOP 1.0 • JDBC™ 2.0 • Java Messaging Service 1.0 • JNDI 1.2 • Servlet 2.2 • JavaServer Pages™ 1.1 • JavaMail 1.1 • JavaBeans™ Activation Framework 1.0 • Enterprise JavaBeans 1.1 • Java Transaction API 1.0
文档资源 • Sun Techdays 文档 • Designing Enterprise Applications with the Java 2 Platform, Enterprise Edition,Nicholas Kassem and the Enterprise Team(jbp-1_0_1b-doc.pdf) • http:// java. sun. com/ j2ee • http:// java. sun. com/ products/ ejb • http:// java. sun. com/ products/ jsp • http:// java. sun. com/ products/ servlet • http:// java. sun. com/ products/ jndi
Database Client 引言: • Java应用不可直接与数据库通信。因为DBMS只能理解SQL语句,而不能理解JAVA语言的语句。 • 当前市场上DBMS产品颇多,JAVA程序应能够和任何类型的数据库通信。 考虑以下二个问题:
一.JDBC的特性: • JDBC的本质就是一些API,针对SQL兼容的关系型数据库提供了一组通用的数据库访问方法。 • 我们将讨论JDBC 2.0 API(最新版本3.0),分为两大部分: a)JDBC 核心API,定义在java.sql.*包中 b)JDBC 扩展包API,定义在javax.sql.*包中
JDBC驱动器 • JDBC如何来解决不同类型数据库厂商的问题。 JDBC 驱动器 Java应用 JDBC API DBMS
Database Java Application JDBC-ODBC Bridge JDBCAPI ODBC Driver ODBC API JDBC驱动器类型: • 类型1-JDBC-ODBC Bridge
Database JavaApplication 具体于 厂商的 API JDBCAPI JDBC驱动器 • 类型2-部分采用java,另一部分采用本地驱动器
类型3-纯的java驱动器 Database Java Application JDBC API JDBC驱动器
二.JDBC 2.0API 2.1) java.sql包中包含由J2SE提供的类和由驱动器厂商实现的接口。 2.1.1) 1)Connection对象-代表与数据库的连接 a)加载数据库驱动器 在jdbc中,用java.lang.Class对象来加载 try{ Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); } catch(Exception e) { System.out.println(e); }
b) 打开连接 JDBC URL:提供了一种标识数据库驱动器方式 protocol:<subprotocol>:<subname> protocol:jdbc为协议,在JDBC中它是唯一的允许协议 subprotocol:子协议用于标识一个数据库驱动器,或者是一个数据库的连接机制名字,由数据库驱动器提供商来选择 subname:子名称的语法具体于驱动器 例如: url=jdbc:odbc:pubs 得到数据库连接 Connection con=DriverManager.getConnection(url,”sa”,””);
try{ Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Stringurl=”jdbc:odbc:pubs”; Connection con=DriverManager.getConnection(url,”sa”,””); } catch(Exception e) { System.out.println(e); }
2)Statement对象-查询数据库 try{ Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); String url=”jdbc:odbc:pubs”; Connection con=DriverManager.getConnection(url,”sa”,””); Statement stat=con.createStatment(); stat.executeQuery(“select * from titles”); } catch(Exception e) { System.out.println(e); }
3)ResultSet对象-封装执行结果 try{Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); String url=”jdbc:odbc:pubs”; Connection con=DriverManager.getConnection(url,”sa”,””); Statement stat=con.createStatment(); ResultSetresult=stat.executeQuery(“select * from titles”); } catch(Exception e) {System.out.println(e);}
为了读取ResultSet中的结果,可用游标在结果集中滚动。getXXX()方法检索ResultSet中的数据为了读取ResultSet中的结果,可用游标在结果集中滚动。getXXX()方法检索ResultSet中的数据 while(result.next()) { System.out.println(result.getString(2)); }
MetaData接口 a)DatabaseMetaData接口-数据库结构信息 b)ResultSetMetaData接口-结果集的结构信息
2.1.2)PreparedStatment 对象--用于发送带有一个或多个输入参数( IN 参数)的 SQL 语句 • 考察: • select * from titles where title_id=? • 首先,创建PreparedStatment对象 • stat=con.prepardStatement(“select * from titles where title_id=?”) • 其次,传递参数 • stat.setXXX(1,”001”); • 另外: 用不同的参数多次执行同一个SQL语句,PreparedStatment对象编译只需一次,效率更高.
2.1.4)事务支持 • JDBC 驱动程序都支持事务 • 下面的方法用于操作,回滚,提交事务: public void setAutoCommit(boolean autoCommit) throws SQLException public void commit() throws SQLException public void rollback() throws SQLException
2.1.5)批量更新 • 允许把多条更新语句(insert,update,delete)在一个请求中提交给数据库。 • 方法: addBatch() executeBatch() • 优点: 大量语句的批量执行可在性能上带来相当大的提高
2.1.6)可滚动的和可更新的结果集 JDBC 2.1提供了更为灵活的访问结果集的方式 • 可滚动的结果集 • 滚动相关性 • 可修改的结果集 (1)更新 updateXXX()方法 (2)删除 deleteRow()方法 (3)插入 result.moveToInsertRow(); result.updateString(1, "100050"); result.updateFloat(2, 1000000.0f); result.insertRow();
创 建 一 个 池 取 得 一 个 连 接 返 回 连 接 2.1.7连接池 连接池 JDBC驱动器 DB JDBC应用程序
应用程序器 的基本框架 JNDI服务 JDBC应用程序 DataSource JDBC驱动器 连接 2.2)JDBC扩展包API • javax.sql.DataSource代替了静态的java.sql.DriverManager,作为创建数据库连接的主要方式 1.绑定 Datasource对象 2.查找 Datasource对象 3.从Datasource中取得连接 4.使用connection 对象访问数据
一 JavaBean 引言 • 1.1 为什么要JavaBean
1.2 bean的定义: Bean是一个基于Sun公司的JavaBean规范的,可在编程工具中被可视化处理的可重用的软件组件. 提示:你可以在软件商店里看到特性齐全的Bean出售,或者在www.gamelan.com和IBM的http://alpaworks.ibm.com发现免费的Beans. eg:图表控件,拼写检查,余额生成
1.3 JavaBean编写过程: • a)三个开发阶段:构造阶段,内建阶段,执行阶段 b) 每个JavaBean包含的3个基本元素: I)属性 II)方法 III)事件 eg:一个流行的图表控件具有: 60个属性 47个事件 14个方法 178页的文档
c)JavaBeans的规格说明 一个Java对象具有以下特性就是一个JavaBean: 定制 持久性 通信 反省 简单的说: 必须有get/set方法 不能有main函数 如果有构造函数,则不能有参数
一个简单的bean: public class Bean1 { private String str; public String getStr() { return str; } public void setStr(String str) { this.str = str; } }
d)JavaBean的类型 • 控件Bean • 容器Bean • 不可见的运行Bean
二 Bean的编程 2.1 编程环境 ----Bean Development Kit(BDK)
Serializable接口 color属性 set/get方法 paint()方法 2.2 创建Bean 1) 构造Bean import java.awt.*; import java.io.Serializable; public class SimpleBean extends Panel implements Serializable { private Color color = Color.green; public Color getColor() { return color; } public void setColor(Color newColor) { color = newColor; repaint(); } public void paint (Graphics g) { g.setColor(color); g.fillRect(20,5,20,30); } public SimpleBean() { setSize(60,40); setBackground(Color.red); } }
2) 测试和编辑Bean • 编译源代码,生成.class文件 • 打包成jar文件 A)创建manifest文件 manifest文件包含所有的类文件以及指出JavaBean. Name: SimpleBean.class Java-Bean: True B)创建jar文件 jar cfm SimpleBean.jar manifest.tmp SimpleBean.class • 装载jar到BDK
稍等一下..... 在此列基础上,增加一个属性logo,怎么做?
定义私有变量logo private String logo; • set/get方法 public String getLogo() { return logo; } public void setLogo(String newLabel) { logo = newLabel; }
2.3 处理JavaBean中的事件 1)自定义事件类 import java.util.*; public class NumEvent extends EventObject { public int num1,num2; public NumEvent(Object o,int num1,int num2) { super(o); this.num1=num1; this.num2=num2; } }
2)监听器(接口) import java.util.* ; public interface NumEnteredListener extends EventListener { public void arithmeticPerformed(NumEvent mec); }
//NumberBean public class NumberBean extends JPanel implements ActionListener { JLabel l1=new JLabel("Enter the First Number: "); JLabel l2=new JLabel("Enter the Second Number:"); JTextField tf1 = new JTextField(10); JTextField tf2 = new JTextField(10); JButton ok = new JButton("Calculate"); boolean addListernered; public NumberBean() { setLayout(new FlowLayout()); add(l1); add(tf1); add(l2); add(tf2); add(ok); ok.addActionListener(this); }
NumEnteredListener mel; //3)注册 public void addNumListener(NumEnteredListener mel) { addListernered=true; this.mel = mel; } //4)移除 public void removeNumListener(NumEnteredListener mel) { addListernered=false; mel=null; }
NumEvent mec; //5)触发 public void fireNumEvent(NumEvent mec) { mel.arithmeticPerformed(mec); } public void actionPerformed(ActionEvent ae) {if (ae.getSource()==ok) { int f1=Integer.parseInt(tf1.getText()); int f2=Integer.parseInt(tf2.getText()); if(addListernered) { mec = new NumEvent(ok,f1,f2); fireNumEvent(mec); } } } }