1 / 228

J2EE 平台

J2EE 平台. 内容. 为什么引入 J2EE ? 什么是 J2EE ? J2EE 的组成. 主机系统或单层结构. 数据访问、表示和业务逻辑在一个应用中 功能紧紧耦合在一起 代码复用、代码可维护性、和代码的修改十分困难。 不是分布式的,不具有可伸缩性。. Fat client. 胖客户端: 表示逻辑 业务逻辑 业务数据模型 通讯. Fat client. 传统的客户 / 服务器:“胖”客户端. 功能集中,不利于更新和维护; 数据模型“紧耦合”在每一客户端 数据库结构改变将导致全体客户端改变 任何一点更新要对每一客户端进行部署

evelina
Download Presentation

J2EE 平台

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. J2EE 平台

  2. 内容 • 为什么引入J2EE? • 什么是J2EE? • J2EE的组成

  3. 主机系统或单层结构 • 数据访问、表示和业务逻辑在一个应用中 • 功能紧紧耦合在一起 • 代码复用、代码可维护性、和代码的修改十分困难。 • 不是分布式的,不具有可伸缩性。

  4. Fat client 胖客户端: 表示逻辑 业务逻辑 业务数据模型 通讯 Fat client 传统的客户/服务器:“胖”客户端 • 功能集中,不利于更新和维护; • 数据模型“紧耦合”在每一客户端 • 数据库结构改变将导致全体客户端改变 • 任何一点更新要对每一客户端进行部署 • 数据库连接是针对每一客户端的 • 伸缩困难 • 原始数据通过网络传递:加重网络负担

  5. 构件(component)与中间层开发 • 两个转变: • 计算模式上:网络计算(Network Computing) • 生产模式上:基于构件的开发(Component-based Dev) • 二者的结合: 服务器端中间层构件的开发

  6. 在企业级应用开发中的问题 • 分布式 • 可移植 • 面向Web体系 • 可装配 • 满足企业计算要求 • 一致性 • 事务性 • 安全性 • 好的特性 • 可伸缩 • 可扩展 • 易维护

  7. 为什么需要J2EE • 分布式、可移植构件的框架 • 简化服务器端中间层构件的设计 • 为构件与应用服务器提供标准API

  8. J2EE • Open and standard based platform for developing, deploying and managing n-tier, Web-enabled, server-centric enterprise applications • 开放的、基于标准的平台,用以开发、部署和管理N层结构、面向Web的,以服务器为中心的企业级应用。

  9. J2EE架构

  10. 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

  11. 文档资源 • 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

  12. 第一章 JDBC

  13. Database Client 引言: • Java应用不可直接与数据库通信。因为DBMS只能理解SQL语句,而不能理解JAVA语言的语句。 • 当前市场上DBMS产品颇多,JAVA程序应能够和任何类型的数据库通信。 考虑以下二个问题:

  14. 一.JDBC的特性: • JDBC的本质就是一些API,针对SQL兼容的关系型数据库提供了一组通用的数据库访问方法。 • 我们将讨论JDBC 2.0 API(最新版本3.0),分为两大部分: a)JDBC 核心API,定义在java.sql.*包中 b)JDBC 扩展包API,定义在javax.sql.*包中

  15. JDBC驱动器 • JDBC如何来解决不同类型数据库厂商的问题。 JDBC 驱动器 Java应用 JDBC API DBMS

  16. Database Java Application JDBC-ODBC Bridge JDBCAPI ODBC Driver ODBC API JDBC驱动器类型: • 类型1-JDBC-ODBC Bridge

  17. Database JavaApplication 具体于 厂商的 API JDBCAPI JDBC驱动器 • 类型2-部分采用java,另一部分采用本地驱动器

  18. 类型3-纯的java驱动器 Database Java Application JDBC API JDBC驱动器

  19. 二.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); }

  20. b) 打开连接 JDBC URL:提供了一种标识数据库驱动器方式 protocol:<subprotocol>:<subname> protocol:jdbc为协议,在JDBC中它是唯一的允许协议 subprotocol:子协议用于标识一个数据库驱动器,或者是一个数据库的连接机制名字,由数据库驱动器提供商来选择 subname:子名称的语法具体于驱动器 例如: url=jdbc:odbc:pubs 得到数据库连接 Connection con=DriverManager.getConnection(url,”sa”,””);

  21. try{ Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Stringurl=”jdbc:odbc:pubs”; Connection con=DriverManager.getConnection(url,”sa”,””); } catch(Exception e) { System.out.println(e); }

  22. 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); }

  23. 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);}

  24. 为了读取ResultSet中的结果,可用游标在结果集中滚动。getXXX()方法检索ResultSet中的数据为了读取ResultSet中的结果,可用游标在结果集中滚动。getXXX()方法检索ResultSet中的数据 while(result.next()) { System.out.println(result.getString(2)); }

  25. MetaData接口 a)DatabaseMetaData接口-数据库结构信息 b)ResultSetMetaData接口-结果集的结构信息

  26. 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对象编译只需一次,效率更高.

  27. 2.1.3)把SQL类型转换成JAVA类型

  28. 2.1.4)事务支持 • JDBC 驱动程序都支持事务 • 下面的方法用于操作,回滚,提交事务: public void setAutoCommit(boolean autoCommit) throws SQLException public void commit() throws SQLException public void rollback() throws SQLException

  29. 2.1.5)批量更新 • 允许把多条更新语句(insert,update,delete)在一个请求中提交给数据库。 • 方法: addBatch() executeBatch() • 优点: 大量语句的批量执行可在性能上带来相当大的提高

  30. 2.1.6)可滚动的和可更新的结果集 JDBC 2.1提供了更为灵活的访问结果集的方式 • 可滚动的结果集 • 滚动相关性 • 可修改的结果集 (1)更新 updateXXX()方法 (2)删除 deleteRow()方法 (3)插入 result.moveToInsertRow(); result.updateString(1, "100050"); result.updateFloat(2, 1000000.0f); result.insertRow();

  31. 建 一 个 池 取 得 一 个 连 接 返 回 连 接 2.1.7连接池 连接池 JDBC驱动器 DB JDBC应用程序

  32. 应用程序器 的基本框架 JNDI服务 JDBC应用程序 DataSource JDBC驱动器 连接 2.2)JDBC扩展包API • javax.sql.DataSource代替了静态的java.sql.DriverManager,作为创建数据库连接的主要方式 1.绑定 Datasource对象 2.查找 Datasource对象 3.从Datasource中取得连接 4.使用connection 对象访问数据

  33. 第二章JavaBean

  34. 一 JavaBean 引言 • 1.1 为什么要JavaBean

  35. 一个计算器的例子:

  36. 1.2 bean的定义: Bean是一个基于Sun公司的JavaBean规范的,可在编程工具中被可视化处理的可重用的软件组件. 提示:你可以在软件商店里看到特性齐全的Bean出售,或者在www.gamelan.com和IBM的http://alpaworks.ibm.com发现免费的Beans. eg:图表控件,拼写检查,余额生成

  37. 1.3 JavaBean编写过程: • a)三个开发阶段:构造阶段,内建阶段,执行阶段 b) 每个JavaBean包含的3个基本元素: I)属性 II)方法 III)事件 eg:一个流行的图表控件具有: 60个属性 47个事件 14个方法 178页的文档

  38. c)JavaBeans的规格说明 一个Java对象具有以下特性就是一个JavaBean: 定制 持久性 通信 反省 简单的说: 必须有get/set方法 不能有main函数 如果有构造函数,则不能有参数

  39. 一个简单的bean: public class Bean1 { private String str; public String getStr() { return str; } public void setStr(String str) { this.str = str; } }

  40. d)JavaBean的类型 • 控件Bean • 容器Bean • 不可见的运行Bean

  41. 二 Bean的编程 2.1 编程环境 ----Bean Development Kit(BDK)

  42. 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); } }

  43. 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

  44. 稍等一下..... 在此列基础上,增加一个属性logo,怎么做?

  45. 定义私有变量logo private String logo; • set/get方法 public String getLogo() { return logo; } public void setLogo(String newLabel) { logo = newLabel; }

  46. 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; } }

  47. 2)监听器(接口) import java.util.* ; public interface NumEnteredListener extends EventListener { public void arithmeticPerformed(NumEvent mec); }

  48. //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); }

  49. NumEnteredListener mel; //3)注册 public void addNumListener(NumEnteredListener mel) { addListernered=true; this.mel = mel; } //4)移除 public void removeNumListener(NumEnteredListener mel) { addListernered=false; mel=null; }

  50. 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); } } } }

More Related