• 1. J2EE 平台
  • 2. 内容为什么引入J2EE? 什么是J2EE? J2EE的组成
  • 3. 主机系统或单层结构数据访问、表示和业务逻辑在一个应用中 功能紧紧耦合在一起 代码复用、代码可维护性、和代码的修改十分困难。 不是分布式的,不具有可伸缩性。
  • 4. 传统的客户/服务器:“胖”客户端功能集中,不利于更新和维护; 数据模型“紧耦合”在每一客户端 数据库结构改变将导致全体客户端改变 任何一点更新要对每一客户端进行部署 数据库连接是针对每一客户端的 伸缩困难 原始数据通过网络传递:加重网络负担胖客户端: 表示逻辑 业务逻辑 业务数据模型 通讯Fat clientFat client
  • 5. 构件(component)与中间层开发两个转变: 计算模式上:网络计算(Network Computing) 生产模式上:基于构件的开发(Component-based Dev) 二者的结合: 服务器端中间层构件的开发
  • 6. 在企业级应用开发中的问题分布式 可移植 面向Web体系 可装配 满足企业计算要求 一致性 事务性 安全性 好的特性 可伸缩 可扩展 易维护
  • 7. 为什么需要J2EE分布式、可移植构件的框架 简化服务器端中间层构件的设计 为构件与应用服务器提供标准API
  • 8. J2EEOpen 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. 引言:Java应用不可直接与数据库通信。因为DBMS只能理解SQL语句,而不能理解JAVA语言的语句。 当前市场上DBMS产品颇多,JAVA程序应能够和任何类型的数据库通信。考虑以下二个问题:ClientDatabase
  • 14. JDBC的本质就是一些API,针对SQL兼容的关系型数据库提供了一组通用的数据库访问方法。 我们将讨论JDBC 2.0 API(最新版本3.0),分为两大部分: a)JDBC 核心API,定义在java.sql.*包中 b)JDBC 扩展包API,定义在javax.sql.*包中一.JDBC的特性:
  • 15. JDBC驱动器JDBC如何来解决不同类型数据库厂商的问题。Java应用JDBC 驱动器JDBC APIDBMS
  • 16. 类型1-JDBC-ODBC BridgeJava ApplicationJDBC APIJDBC-ODBC BridgeDatabaseODBC APIODBC DriverJDBC驱动器类型:
  • 17. 类型2-部分采用java,另一部分采用本地驱动器DatabaseJava ApplicationJDBC APIJDBC驱动器具体于 厂商的 API
  • 18. 类型3-纯的java驱动器DatabaseJava ApplicationJDBC APIJDBC驱动器
  • 19. 二.JDBC 2.0 API2.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:: protocol:jdbc为协议,在JDBC中它是唯一的允许协议 subprotocol:子协议用于标识一个数据库驱动器,或者是一个数据库的连接机制名字,由数据库驱动器提供商来选择 subname:子名称的语法具体于驱动器 例如: url=jdbc:odbc:pubs 得到数据库连接 Connection con=DriverManager.getConnection(url,”sa”,””);
  • 21. try{ Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); String url=”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(); ResultSet result=stat.executeQuery(“select * from titles”); } catch(Exception e) {System.out.println(e);}
  • 24. 为了读取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类型JDBC类型SQL类型Java类型ARRAYARRAYJava.sql.ArrayBIGINTBIGINTLongBLOBBLOBJava.sql.BlobCLOBCLOBJava.sql.ClobDATEDATEJava.sql.DateFLOATFLOATDoubleJAVA_OBJECT没有映射ObjectVARCHARVARCHARStringNULLNULLNULLTIMETIMEJava.sql.Time
  • 28. 2.1.4)事务支持JDBC 驱动程序都支持事务 下面的方法用于操作,回滚,提交事务: public void setAutoCommit(boolean autoCommit) throws SQLException public void commit() throws SQLException public void rollback() throws SQLException
  • 29. 允许把多条更新语句(insert,update,delete)在一个请求中提交给数据库。 方法: addBatch() executeBatch() 优点: 大量语句的批量执行可在性能上带来相当大的提高 2.1.5)批量更新
  • 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连接池DBJDBC驱动器JDBC应用程序连接池创 建 一 个 池取 得 一 个 连 接返 回 连 接
  • 32. 2.2)JDBC 扩展包APIjavax.sql.DataSource代替了静态的java.sql.DriverManager,作为创建数据库连接的主要方式应用程序器 的基本框架JNDI服务JDBC应用程序连接JDBC驱动器DataSource1.绑定 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. a)三个开发阶段:构造阶段,内建阶段,执行阶段 b) 每个JavaBean包含的3个基本元素: I)属性 II)方法 III)事件 eg:一个流行的图表控件具有: 60个属性 47个事件 14个方法 178页的文档 1.3 JavaBean编写过程:
  • 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. 2.2 创建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); } } Serializable接口 color属性 set/get方法 paint()方法1) 构造Bean
  • 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); } } } }
  • 51. import java.awt.* ; import java.awt.event.* ; import javax.swing.*; //消费者 public class ArithmeticPerformer extends JFrame implements NumEnteredListener { NumberBean meb; public ArithmeticPerformer() { super("Arithmetic Calculations"); meb = new NumberBean(); getContentPane().add(meb); meb.addNumListener(this); }
  • 52. public void arithmeticPerformed(NumEvent mec) { int result=mec.num1*mec.num2; String temp="The result of adding the numbers is: "+String.valueOf(result); JOptionPane.showMessageDialog(this,temp); } public static void main(String a[]) { ArithmeticPerformer mec = new ArithmeticPerformer(); mec.setSize(300, 300); mec.setVisible(true); } }
  • 53. 2.4 Bean的属性一般属性 indexed属性 --设置或访问数组属性 Bound属性 --值变化通知给其他beans的Bean属性 Constrained属性 --阻止别的bean值属性值变动的属性
  • 54. Bound属性 要实现一个关联属性,必须实现两个机制 1)无论属性值何时变化,Bean必须向所有注册监听器发送一个PropertyChange事件 2)相关的监听器自我注册,实现方法: public void addPropertyChangeListener(PropertyChangeListener listener) public void removePropertyChangeListener(PropertyChangeListener listener) Java.Bean包中的PropertyChangeSupport管理着监听器
  • 55. Constraint属性 要更新限制属性值,Bean使用以下两步: 1)把变化属性值的意图通知给所有可否决变化监听器 使用VetoableChangeSupport类的fireVetoableChange方法 2)如果所有可否决变化监听器都没有抛出异常,那么就更新属性值 注意:直到所有注册的可否决变化监听器都同意后才变化属性值
  • 56. 2.5 定制Bean属性提供Bean信息(方法,属性,事件) BeanInfo 接口 SimpleBeanInfo 类 定制属性编辑器 PropertyEditor 接口 PropertyEditorSupport 类
  • 57. 反省是一个过程,考察bean的结构,并确定bean所支持的属性,方法,事件 Java.bean.Introspector类 public static BeanInfo getBeanInfo(Class beanClass) throws IntrospectionException Java.bean.BeanInfo接口2.6 反省
  • 58. 第三章 Javascipt
  • 59. (本页无文本内容)
  • 60. 2.Javascript的特点 事件驱动 平台独立 --Netscape 2.0,IE3.0 基于对象 --内置对象,但不支持继承 大小写敏感
  • 61. JavaJavascript程序设计语言脚本语言JVM浏览器解释执行OOPOBJava与javascript是完全不同的
  • 62. 不同版本的 Netscape 浏览器所支持的不同版本的 JavaScript: JavaScript - Netscape 2.0 JavaScript1.1 - Netscape 3.0 JavaScript1.2 - Netscape 4.0
  • 63. 3.HTML中嵌套Javascript

  • 64. 二 Javascript的基本构成1.数据类型和变量 JavaScript 有六种数据类型。主要的类型有 number、string、object 、 Boolean 类型、null 和 undefined。 JavaScript是一种对数据类型变量要求不太严格的语言,所以不必声明每一个变量的类型,但在使用变量之前先进行声明是一种好的习惯。可以使用 var 语句来进行变量声明。 如:var men = true; // men 中存储的值为 Boolean 类型
  • 65. 2 语句 条件和分支语句:if...else,switch 循环语句:for, for...in,while,break,continue。 对象操作语句:with,this,new。  with语句的语法如下:    with (对象名称){      执行语句          }  注释语句://,/*...*/
  • 66. 3 函数 Function 函数名 (参数,变元){ 函数体;. Return 表达式; } 说明: ·函数由关键字Function定义。 ·函数名:定义自己函数的名字。 ·参数表,是传递给函数使用或操作的值,其值可以是常量 ,变量或其它表达式。
  • 67. 4 事件驱动及事件处理 a)基本概念 采用事件驱动。它是在图形界面的下,使得一切输入变化简单化。通常鼠标或热键的动作我们称之为事件,而由鼠标或热键引发的一连串程序的动作,称之为事件驱动。而对事件进行处理程序或函数,我们称之为事件处理程序 b)事件处理程序 在javascript中对象事件的处理通常由函数(Function)担任。 c)事件驱动 javascript事件驱动中的事件是通过鼠标或热键的动作引发的
  • 68.
  • 69. 三 基于对象的 Javascript用户自定义对象 javascript内置对象 浏览器对象
  • 70. 1.用户自定义对象 Javascript中的对象看成是属性和方法的集合 【构造对象函数】 function Product(name, num, price, shipping, quantity) { this.name = name; this.catalogNumber = num; this.price = price; this.shippingCost = shipping; this.quantity = quantity; } this,它指向被创建的对象 var item1 = new Product("blender", "9003-2", 24.95, 2.50, 2);
  • 71. 【定义方法】 function Product(name, num, price, shipping, quantity) { this.name = name; this.catalogNumber = num; this.price = price; this.shippingCost = shipping; this.quantity = quantity; this.totalCost = totalCost; } function totalCost() { return ((this.price + this.shippingCost) * this.quantity); } 使用该方法: var total = item1.totalCost();
  • 72. JavaScript 中,对象和数组是一样处理的。可以按名称来引用一个对象的任何成员(属性和方法), 也可以按其数组下标索引来引用。JavaScript 中下标的是从 0 开始编号的,也可以用其名称来引用下标。 myobj = someobj.width; myobj = someobj[3]; // [3] 是 "width" 的索引。 myobj = someobj["width"];
  • 73. 2.JavaScript的内置对象  a)String  b)Math Math对象可以用来处理各种数学运算。其中既定义了一些常用的数学常数,也定义了很多实现从三角到代数各种运算的方法。  C)Date JavaScript内置的Date对象可以用来处理所有有关日期与时间的操作。 Date对象定义的方法: mydate=new Date(); d)Array 数组定义的方法: myarray=new Array() 或 myarray=new Array(7)
  • 74. 3.浏览器对象  navigator navigator对象提供关于整个浏览器环境的信息,比如浏览器的商标和版本 Window 代表了当前运行的脚本所嵌入的HTML文档所在的窗口或者Frame。Window对象包含了Frame的列表、历史记录列表、Document对象和Location对象。
  • 75. 第四章 Servlet
  • 76. 一 Servlet引言1.Servlet的需要检索信息 Servlet是部署在java的web服务器上的java程序,以扩展和增强web功能
  • 77. 2.servlet的特征 可移植的 可扩展的 持久的 健壮的
  • 78. (本页无文本内容)
  • 79. 二 java.servlet包 Servlet接口 提供创建servlet一般框架 public void init(ServletConfig config) throws ServletException public ServletConfig getServletConfig() public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException public java.lang.String getServletInfo() public void destroy()
  • 80. servlet的生命周期
  • 81. Servlet 类(1)
  • 82. Servlet 类(2)GenericServlet,用于创建可与任何协议一起使用的servlet
  • 83. (本页无文本内容)
  • 84. 创建servlet import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class HitCountServlet extends HttpServlet{ static int count; public void init(ServletConfig config) throws ServletException { super.init(config) ; count=1; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); count++; PrintWriter out = response.getWriter(); out.println(""); out.println("HitCountServlet"); out.println(""); out.println("

    You are user number "+String.valueOf(count)+ " visting out Web site.

    "); out.println(""); } public String getServelet() { return "BasicServlet information"; } }
  • 85. 部署servlet Web包容器 --控制servlet的生命周期 Web服务器 Web 浏览器Web 服务器http请求http应答J2EE WEB包容器Servlet应用程序Servlet应用程序
  • 86. 稍等一下: 如果servlet请求方法为post,应该怎么做?
  • 87. (本页无文本内容)
  • 88. servlet实例的个数及因此引发的问题 我们在实现自己的serlvet时需要考虑多线程的问题,一般而言,servlet无状态(不要定义任何属性,只能定义一些常量) public class SomeHttpServlet extends HttpServlet { HttpSession session; ... } 这样的servlet在使用中一定会出现问题
  • 89. 三 servlet会话http是一种无状态的协议 Cookies URL重写 隐藏表单 HttpSession接口 SSL会话
  • 90. 1.Cookie Cookie的定义: Cookie是一种服务器发送给客户的片断信息,存储在客户环境中,并且在客户所有的对服务器的请求中都要发回它 服务器按照这种形式发送Cookie: Set-Cookie:NAME=VALUE;Comment=COMMENT;Domain=域名;Max-age=SECONDS;Path=路径;Version=1*DIGIT
  • 91. Servlet的Cookie API (1)创建Cookie new Cookie(name,value) (2)读取和设置Cookie值 getComment/setComment getMaxAge/setMaxAge getPath/setPath --获取/设置Cookie适用的路径 例如,someCookie.setPath(“/”),此时服务器上的所有页面都可以接收到该Cookie。 (3)在应答头中设置Cookie Cookie可以通过HttpServletResponse的addCookie方法加入到SetCookie应答头 (4)从客户端读入Cookie Servlet调用request.getCookies()
  • 92. 优点: 实现容易 浏览器关闭时信息持久 缺点: 用户经常因为安全原因关闭cookie
  • 93. 2.URL重写 URL重写的时候包含会话信息 优点:a)用户信息匿名 b)被广泛支持 缺点:a)必须重写所有相应的URL b)浏览器关闭时信息 方法: public java.lang.String encodeRedirectURL(java.lang.String url) 3.隐藏表单 Serlvt规范中不使用这种方法
  • 94. (本页无文本内容)
  • 95. 会话对象驻留在服务器端 每个用户对应于一个HttpSession对象 会话对象类似于hashtable 查看当前请求的会话对象 HttpSession session = request.getSession(true); 查看和会话有关的信息 getAttribute("cartItem") 在会话对象中保存数据 setAttribute("cartItem", cart)
  • 96. 5.安全套接字层会话(SSL) SSL是一种运行在TCP/IP之上的加密技术,是用在HTTPS协议中的技术。 加密连接 服务器和客户可以产生--“会话密钥”,它是一种用于加密和解密消息的对称的密钥
  • 97. 四.Servlet之间通信别名Servlet AServlet BServlet C客户 (浏览器)1.RequestDispatcher接口 2.Servlet上下文
  • 98. 第五章 JSP
  • 99. 一 介绍JSPServlet能帮助我们作很多事,但是: --使用println()方法产生HTML --维护HTML页面 JSP定义 a)基于文本的文档,返回给客户浏览器动态内容 b)包含HTML,XML,java代码和JSP tags,能访问JavaBean JSP的优势 把静态和动态内容分离 支持软件组件重用 源代码变化时自动重编译 平台独立
  • 100. 特色ASPJSP可以在各种server上使用否,(主要是IIS)是(Apache,IIS,Netscape)可应用在多种平台上否是跨平台的重用组件是(COM)是(JavaBean,EJB)开发规格与其他厂商合作否是(Weblogic, IBM,Oracle,Netscape)与数据库连接ODBC,ADOJDBC定位Microsoft产品Java规格书ASP与JSPServlet与JSP Servlet在服务器上执行和解释浏览器的请求,把动态的内容混合静态的内容以产生HTML JSP,把静态和动态内容分离几种技术的比较
  • 101. JSP工作原理JSP文件以.jsp扩展形式存储在服务器上 JSP包容器(也叫JSP引擎)第一次加载JSP时,编译并加载到serlet容器中 从客户来的后续请求都由这个servlet处理
  • 102. (本页无文本内容)
  • 103. JSP的生命周期
  • 104. 第一个JSP页面: <% java.util.Date date=new java.util.Date();%>

    今天是:<%= date %>

  • 105. (本页无文本内容)
  • 106. 二 创建JSP页面1 JSP基础知识 directive (指令) JSP scripting (脚本) action (动作) Template data :除JSP语法外,JSP引擎 不能解读的东西
  • 107. 1)在JSP中使用的directive(指令)主要有三个: page指令(定义页面属性) include指令(指出编译JSP页面是要插入的文件) 在JSP的任何地方,以任何顺序,一个页面可以包含任意数量的page指令 taglib指令
  • 108. 2)Scripting(脚本)包括三种类型 <%!declaraction %> <% scriptlet %> <%= expression %>
  • 109. 3)action(动作) 标准的动作类型有: :请求被传送到另外的JSP或servlet上 调用javabean的动作
  • 110. Eg:
  • 111. 标签要包含几个参数,它们分别说明: 该JavaBean所从属的类 该JavaBean实例的名称 该JavaBean的作用域(生命周期) Eg:  

    Counter:

  • 112. 对象的范围
  • 113. 2.JSP隐含对象 request 客户端请求,包括从GET/POST请求传递过来的参数 response 网页传回客户端的反应 pageContext 在此管理网页属性 session 与请求关联的会话 application 代码片段的运行环境 out 传送响应的输出流 config 代码片段配置对象 page JSP网页本身 exception 有错的网页中未被捕获的例外
  • 114. 关于同步<%@ page isThreadSafe="true" %>
  • 115. 三 JSP客户标签
  • 116. 企业级应用特点及需求 特点 --涉及外部资源多 --事务密集 --跨越intranet和internet 需求 --高可用性 --安全性 --可扩展性
  • 117. 什么时候使用tags
  • 118. 标准动作tags
  • 119. 客户动作 a)扩展功能 b)一致性 c)封装 --重用 --维护 d)分离JSP页面的内容和行为 --代码开发者创建tag --页面开发者开发内容
  • 120. 使用标签库标签库的类型 简单标识 带属性的标识 带body的标识
  • 121. Attribute Type Conversion on String Value boolean or Boolean java.lang.Boolean.valueOf(String byte or Byte java.lang.Byte.valueOf(String) char or Character java.lang.Character.valueOf(String) double or Double java.lang.Double.valueOf(String) int or Integer java.lang.Integer.valueOf(String) float or Float java.lang.Float.valueOf(String) long or Long java.lang.Long.valueOf(String)
  • 122. Tags的实现 标识句柄类 标识库描述文件 Jsp文件
  • 123. Tags工作方式
  • 124. JSP在javax.servlet.jsp.tagext 中定义了tag,bodyTag,我们可以直接或间接引用这些接口类型可继承的基类可重载的方法简单标识TagSupportdoStartTag doEndTag release带属性标识TagSupport doStartTag doEndTag Set/get Attribute release带标识体标识 (不对标识体处理) TagSupport doStartTag doEndTag release 带标识体标识 (对标识体处理)BodyTagSupportdoStartTag doEndTag Release doInitBody doafterBody
  • 125. (本页无文本内容)
  • 126. import java.io.IOException; import java.util.Date; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class TestTag extends TagSupport { public int doStartTag() throws JspTagException { return EVAL_BODY_INCLUDE; } public int doEndTag() throws JspTagException { String dateString=new Date().toString(); try { pageContext.getOut().write("Hello everybody
    "); pageContext.getOut().write("Date: " + dateString + "

    "); } catch(IOException ee) { throw new JspTagException("Error encountered"); } return EVAL_PAGE; } }

  • 127. JSP文件中使用tag<%@ page import="TestTag" %> <%@ taglib uri="TestTaglib.tld" prefix="first" %> Using custom tags Hello, Welcome!
  • 128. TLD文件 1.0 1.1 first Example of a tag welcome TestTag JSP An example
  • 129. (本页无文本内容)
  • 130. (本页无文本内容)
  • 131. 总结Tag是jsp1.1版本之后的重要特征 标准的tag库被广泛应用 客户标签 使得: –分离JSP页面的内容和行为 – 封装动作以重用 – 创建客户标识语言 • 组件化表示层
  • 132. JSP设计基础 我们的目标是,在WEB应用程序设计中,必须分离应用逻辑和表示。针对JSP设计有两种这样途径: 以JSP为中心,请求被直接发送给JSP页面 以servlet为中心 Tips: 1)JSP设计关键在于包含尽可能少的”java”成分 2)形成输出模板(表示组件)
  • 133. 以页面为中心
  • 134. 以servlet为中心
  • 135. 以页面为中心的例子
  • 136. 以servlet为中心的例子
  • 137. 第六章 RMI
  • 138. 内容分布式应用 RMI的概念与示例 总结和参考文献
  • 139. 一 分布式 对于绝大多数传统的(非分布式)Java 编程,构成程序的所有对象都在同一台机器上,并在同一个进程或 JVM 中出现。 ObjectObject
  • 140. 分布式编程有哪些不同之处 在分布式计算中,程序模块可以在同一台机器的不同进程中,也可以在不同机器中
  • 141. 三层分布式对象架构客户端:业务数据模型与UI分开,更“瘦” 业务逻辑在中间层,成为“对象服务”。 中间层可以处理多客户端,通过:连接池,多线程,对象一致性处理 数据库服务器端只作数据处理 分布式计算用来利用多个系统的组合计算能力,以便比在单个系统上更有效或更快地解决问题
  • 142. 为什么 Java 平台适合分布式对象编程 因为以下几点原因,所以 Java 平台是分布式编程的理想工具: Java 平台为所有平台实现定义了基本类型(如整数和浮点)的一致大小和格式,还定义了字节排列假设。这意味着,由于传送机制在与另一方交谈时不必进行转换或调整,因此能使该机制变得极其简单。这也有性能方面的优势 主要的 Java 分布式编程 API — RMI,是该语言标准版的一部分 Java RMI 接口的使用相当简便 Java 参数可以按引用(远程)或按值(序列化)传递。 Java 平台的普及以及把它当作许多编程课程中的教学语言,这些都意味着对于该环境有广泛的编程技巧资源可供使用 最后,Java 平台还支持许多用于分布式编程的其它技术,如套接字编程模型
  • 143. 远程方法调用--RMIRMI是一种使用TCP/IP套接字方式的分布式系统
  • 144. RMI应用的构件RMI服务器 RMI客户端 RMI注册表
  • 145. 开发RMI应用1.定义远程接口--远程接口类 import java.rmi.*; public interface rmiHello extends java.rmi.Remote { String fn() throws RemoteException; }
  • 146. 2.实现服务器远程方法—服务器类 import java.rmi.*; import java.rmi.server.*; public class rmiHelloImpl extends UnicastRemoteObject implements rmiHello { public rmiHelloImpl() throws RemoteException { super(); } public String fn() { return "Hello RMI"; } } 创建 rmiHelloImpl类的stub和skeleton: 提示符: rmic rmiHelloImpl
  • 147. 3.RMI注册表 import java.io.*; import java.rmi.*; import java.rmi.server.*; public class Server { public static void main(String s[]) { try{ //创建与安装安全管理程序 System.setSecurityManager(new RMISecurityManager()); //实例化远程对象 rmiHelloImpl o=new rmiHelloImpl(); //远程对象注册到RMI注册表 Naming.rebind("rmi://localhost/rmiHello",o); } catch(Exception e) { System.out.print(e); } } }
  • 148. 启动 RMI 注册表 start rmiregistry 运行服务器程序 java Server
  • 149. 4.创建RMI客户 import java.rmi.*; public class client { public static void main(String s[]) { try{ rmiHello server=(rmiHello)Naming.lookup("rmi://localhost/rmiHello"); System.out.print(server.fn()); } catch(Exception e) { System.out.print(e); } } } 运行客户端: java client
  • 150. 典型 RMI 应用程序的部署
  • 151. 文章、教程及其它在线参考资料 Damian Hagge 的“RMI-IIOP in the enterprise: An introduction to running RMI over IIOP”(developerWorks,2002 年 3 月)简要介绍了 RMI-IIOP,还向您展示了如何构建和运行一个简单的基于 Java 技术的 RMI-IIOP 客户机/服务器应用程序。 “RMI-IIOP Programmer's Guide”教您如何编写可以利用 IIOP 来访问远程对象的 Java RMI 程序。RMI-IIOP frequently asked questions 也有助于您的理解。 Dave Bartlett 所写的由两篇文章组成的“IDL-to-Java mapping”第一部分(developerWorks,2000 年 10 月)和第二部分(developerWorks,2000 年 11 月)描述了如何将离散的组件接口定义转换成 Java 元素。 developerWorks 图书馆提供了关于 alternative client/server implementation techniques 及其定义的简明摘要(2001 年 6 月)。 有关对 Java RMI 的深入讨论及对 CORBA 的一点探讨,请参阅由 O'Reilly 于 2002 年出版的、William Grosso 所著的 Java RMI。 另一本 RMI 的实用参考大全是 Addison-Wesley 2001 年出版的、由 Esmond Pitt 与 Kathleen McNiff 合著的 Java.rmi: The Remote Method Invocation Guide。
  • 152. CORBA(Common Object Request Broker)CORBA简介 是分布式应用开发框架,由OMG开发 常见错误概念 CORBA并不是一种编程语言,而是一个规范 不是特定厂家的产品 使用CORBA的好处 -语言独立性 -位置透明性 -支持异构网络 -互操作性
  • 153. 第七章 Enterprise Java Bean
  • 154. 内容EJB—J2EE的基石 EJB的容器和服务器 EJB的分类 会话bean 实体bean EJB的三个关键构件 EJB的实现与部署
  • 155. N层计算模式的引入从1层到N层,得到的改进: 每一层可以被单独改变,而无需其它层的改变 降低了部署与维护的开销 资源(如连接)可以被缓冲和重复利用 提高了灵活性、可伸缩性,并使性能提高成为可能 瘦客户端的引入使Internet接入方便,而计算被集中至服务器端 仍然存在的问题: 对企业级应用开发人员的要求太高:熟悉分布式协议,进行一致性事务处理,负载平衡,安全……
  • 156. 软件构件 “软件构件是实现良定义的接口及明确说明的上下文相关性。一个软件构件可以被独立部署且服务于第三方所做的组合.”
  • 157. 应用服务器应用服务器可以为服务器端构件提供: 一致性,事务处理与负载平衡 从而简化了编程工作但在J2EE之前,这些API是应用服务器相关的!
  • 158. 容器和构件容器处理构件处理 一致性 安全性 可获得性 可伸缩性 事务性 分布性 生命周期管理 (持久性)表示 JSP, Servlet, Applet 业务逻辑 EJB 数据访问逻辑 EJB
  • 159. EJB—J2EE的基石Enterprise JavaBeans(EJB) 是: Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。 EJB容器是: 一个管理一个或多个EJB类/实例的抽象。它通过规范中定义的接口使EJB类访问所需的服务。容器厂商也可以在容器或服务器中提供额外服务的接口。 EJB服务器是: 管理EJB容器的高端进程或应用程序,并提供对系统服务的访问。EJB服务器也可以提供厂商自己的特性,如优化的数据库访问接口,对其他服务(如CORBA服务)的访问。一个EJB服务器必须提供对可访问JNDI的名字服务和事务服务支持。
  • 160. EJB 服务器和容器
  • 161. EJB 容器的责任
  • 162. EJB的分类Entity Bean Container-Managed Persistence Entity Bean Bean-Managed Persistence Entity Bean Session Bean - Stateful Session Bean - Stateless Session Bean Message Driven Bean Enterprise Bean
  • 163. 例子:客户查询帐户业务 SessionBean EntityBean帐户信息 余额 SessionBeanclient业务过程业务数据
  • 164. 会话Bean?实体Bean?会话bean 表示一个业务过程 每一客户一个实例 Short-lived:与客户生命同步 暂态的 服务器崩溃后丢失 可以是事务性的实体bean 表示业务数据 在多个客户间共享实例 Long-lived:与数据库中数据同步 持久的 服务器崩溃后可重构 总是事务性的
  • 165. 会话bean(Session Bean)相对生命较短(一般与客户同步) 在EJB服务器崩溃时被删除 不表示数据库中的数据,但可以访问数据 作为一个客户的代表执行功能 可以加入事务
  • 166. 会话bean(Session Bean)会话bean经常用于涉及多个实体bean的业务处理和控制逻辑。SessionEntityEntityEntity
  • 167. 何时使用会话Bean使用会话bean 对针对于某一客户的处理或控制对象建模 对工作流、任务和管理活动等建模(如订房、购物车等) 协调多个实体bean,控制实体bean之间的交互 将业务应用逻辑从客户端转移到服务器端
  • 168. 第一个EJB作为Bean的开发者,主要关注于三个构件: EJBHome 接口(扩展javax.ejb.EJBHome接口):定义了创建、查找EJB的方法。 EJBObject接口(扩展javax.ejb.EJBObject接口):定义了在bean中实现的业务逻辑方法。 Bean实现类(实现javax.ejb.EntityBean/SessionBean):实现业务逻辑。
  • 169. 会话Bean的实现—创建Home接口一般情况下,习惯将主接口的命名规则规定为Home,所以我们把这个主接口类起名为HelloHome public interface HelloHome extends javax.ejb.EJBHome { public Hello create() throws java.rmi.RemoteException, javax.ejb.CreateException; }<> HelloHome Create()<> EJBHomeextends
  • 170. 会话Bean的实现—创建远程接口// business methods public interface Hello extends javax.ejb.EJBObject { public String getHello() throws java.rmi.RemoteException; } <> Hello getHello()<> EJBObjectextends
  • 171. EJB的实现—HelloBean的实现import javax.ejb.*; public class HelloEJB implements SessionBean{ public void ejbCreate(){} public void ejbRemove(){} public void ejbActivate(){} public void ejbPassivate(){} public void setSessionContext(SessionContext ctx){} public String getHello() { return new String(“Hello,EJB”); } }
  • 172. 从客户端看的EJB视图clientGluecontainerserverEJBObjectBeanEJBHomeCreateBusiness Method
  • 173. EJB部署部署到application server上 JNDI(Java命名和目录接口) a)命名服务:为给定的数据提供创建标准名字的服务 b)目录服务:是命名服务,包括描述由名字引用的对象的元数据.(电话簿,DNS)
  • 174. 一个EJB 组件是没有任何运行界面的,所有组件的实例都被容器所管理,为了测试 这个Bean组件,需要写一段测试程序 import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import javax.ejb.*; import javax.naming.InitialContext; public class HelloServlet extends HttpServlet{ public void service(HttpServletRequest req, HttpServletResponse res) throws IOException { res.setContenType("text/html"); PrintWriter out =res.getWriter(); out.println("the first EJB");
  • 175. try{ InitialContext ctx=new InitialContext(); Object objRef = ctx.lookup("java:comp/env/ejb/Hello"); //主接口 HelloHome home=(HelloHome)javax.rmi.PortableRemoteObject.narrow( objRef,HelloHome.class); //组件接口 Hello bean =home.create(); out.println(bean.getHello()); } catch(Exception e){} } out.println(""); }}
  • 176. 稍等一下:Home Objects,EJB Objects,Bean实例有何区别?
  • 177. 两种类型的会话bean无状态(Stateless)bean 表达一个无状态的服务(如列表,mail) 不存储用户相关信息,进行对请求的响应 暂态的 可用来构造响应频繁而简单的访问的bean池 有状态(Stateful)bean 维护客户状态
  • 178. 开发会话Bean—无状态SessionBean 什么是无状态Session Bean? 无状态Session Bean 每次调用只对客户提供业务逻辑,但不保存客户端的任何数据状态但并不意味着stateless 类型的Bean 没有状态,而是这些状态被保持在客户端,容器不负责管理.
  • 179. 无状态会话Bean生命周期无状态Session Bean 有两种状态:存在或不存在。
  • 180. 编写一个stateless会话beanHome接口 负责控制一个Bean 的生命周期(生成、删除、查找Bean) import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface StatelessDateHome extends EJBHome{ public StatelessDate create() throws RemoteException,CreateException; }
  • 181. 开发组件接口(StatelessDate.java): 当远程用户调用主接口类生成方法(create())时,客户要得到一个组件的远程引用,为这个Bean 的所有方法提供一个接口类 import javax.ejb.EJBObject; import java.rmi.RemoteException; import java.util.Date; public interface StatelessDate extends EJBObject{ public int getDayInRange(Date lowerLimitDate,Date upperLimitDate) throws RemoteException; public int getDayForOlympic() throws RemoteException; }
  • 182. 开发Bean实现类(StatelessDateEJB.java) 包含了业务逻辑的所有详细设计细节 import javax.ejb.*; import java.util.Date; public class StatelessDateEJB implements SessionBean{ public void ejbCreate(){} public void ejbRemove(){} public void ejbActivate(){} public void ejbPassivate(){} public void setSessionContext(SessionContext ctx){}
  • 183. //计算两个日期之间相隔的天数 public int getDayInRange(Date lowerLimitDate,Date upperLimitDate) throws Exception{ long upperTime,lowerTime; upperTime=upperLimitDate.getTime(); lowerTime=lowerLimitDate.getTime(); if(upperTime
  • 184. 部署到应用服务器上,并测试
  • 185. 开发会话Bean—有状态SessionBean什么是有状态Session Bean? 有状态会话Bean(Stateful Session Bean)就是在客户引用期间维护Bean中的所有实例数据的状态值,这些数据在引用期间可以被其他方法所引用,其他客户不会共享同一个Session Bean的实例 典型的有状态会话bean:购物车
  • 186. 有状态Session Bean寿命周期有状态会话Bean有四种状态: 不存在 方法现成 事务中方法现成 钝化
  • 187. 编写一个有状态Session Bean程序开发Home接口 import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; public interface StatefulAccountHome extends EJBHome{ public StatefulAccount create(double fund) throwsRemoteException,CreateException; }
  • 188. 开发组件接口 import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface StatefulAccount extends EJBObject{ public void addFunds(double fund) throws RemoteException; public void removeFunds(double fund) throws RemoteException; public double getBalance() throws RemoteException; }
  • 189. 开发Bean实现类 import javax.ejb.*; public class StatefulAccountEJB implements SessionBean{ public void ejbCreate(double fund)throws CreateException{ if (fund<0) throw new Exception("Invalid fund"); this.fundBalance=fund; } public void ejbRemove(){} public void ejbActivate(){} public void ejbPassivate(){} public void setSessionContext(SessionContext ctx){} //实例变量,有状态的会话bean 将在组件池中维护这个实例的值 private double fundBalance;
  • 190. //向基金帐户增加基金 public void addFunds(double fund)throws Exception{ if (fund<0) throw new Exception("Invalid fund"); this.fundBalance+=fund;} //从基金帐户撤除部分基金 public void removeFunds(double fund)throws Exception{ if(fund<0) throw new Exception("Invalid fund"); if(this.fundBalance
  • 191. 部署到application server上 开发测试程序 实体bean(Entity Bean) 实体(entity) bean用来代表底层的对象,最常用的是用Entity Bean映射关系数据库中的记录。在一个Entity Bean中,关系型数据库的字段可以被一对一的映射到一个Entity Bean中,而表与表之间的关系就可以看成是Entity Bean之间的关系。一个Entity Bean 的实例可能会对应表中一个特定的行记录描述或者对于一个查询结果 业务数据模型 在持久存储中业务实体的对象视图 提供访问和操作数据的对象封装 支持多用户共享的数据
  • 192. 实体bean的持久性Bean-Managed Persistence(自管理的持久性) 优点: 开发者有完全的控制 无需复杂的提供商支持 缺点: 编码复杂 在改变时需要重新编码和部署 影响可移植性 Container-Managed Persistence(容器管理的持久性) 优点: 提供商解决,可能会有更好的缓冲和性能 在部署描述符中进行改变即可 可移植性好 缺点: 对容器提供商的工具依赖性强 可能不易反映复杂的数据关系
  • 193. EJB的事务处理EJB服务器的概念使平台提供商可以在可伸缩的、可靠的、分布的事务服务方面提供增值服务。 事务提供一个“all-all-nothing”的简单模型来管理工作,即所有对象成功更新,所有工作成功提交,或者一个对象失败而整个工作回滚。 bean的客户可以以两种方式驱动事务: 在“部署描述符”中声明“公布的事务”(declarative transactions) 使用用户事务API(JTA)来驱动事务
  • 194. EntityBean的状态 Entity Bean 的寿命将超过创建它的客户端寿命,尽管客户在调用完一个Entity Bean释放其资源后,Entity Bean的实例本身仍然存在于组件池中,与映射的数据库记录保持持久性
  • 195. Entity Bean的生命周期
  • 196. 开发CMPEJB结构的一个重要优点是EJB容器可以自动的为Entity Bean提供各种有用的功能,负责实例的生成、装入、寻找、更新、删除等. Bean 开发者不用编写一行对数据库操作的代码就可以完成对数据库的基本操作
  • 197. CMP Bean如何连接到数据库? --JDNI CMP Bean如何映射一个数据表? --在设计一个CMP Bean时,Bean被固定映射一个实体表,表中的每个指定字段被映射成bean 的一个public型类变量 CMP Bean主键如何理解? --只有Entity Bean 有主键,每个Entity Bean的实例代表一行记录,所以就必须有一个主键来标识这个对象,以能够对其进行持久性操作
  • 198. (本页无文本内容)
  • 199. 开发Home接口 import java.util.Collection; import java.rmi.RemoteException; import javax.ejb.*; public interface Cmp1BookHome extends EJBHome{ public Cmp1Book create(String bookid,String bookname,double bookprice) throws RemoteException; //按主键[bookid 字段]查找对象 public Cmp1Book findByPrimaryKey(String bookid) throws FinderException,RemoteException; //查找定价符合范围内的图书,将结果放到Collection 中 public Collection findInPrice(double lowerLimitPrice,double upperLimitPrice) throws FinderException,RemoteException;}
  • 200. 开发组件接口 import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Cmp1Book extends EJBObject{ public void setBookName(String bookname) throws RemoteException; public void setBookPrice(double bookprice) throws RemoteException; public String getBookName() throws RemoteException; public double getBookPrice() throws RemoteException; }
  • 201. 开发bean实现类 import java.util.*; import javax.ejb.*; public class Cmp1BookEJB implements EntityBean{ public void ejbPostCreate(String bookid,String bookname,double bookprice){} public void ejbLoad(){} public void ejbStore(){} public void ejbRemove(){} public void unsetEntityContext(){} public void setEntityContext(EntityContext context){} public void ejbActivate(){} public void ejbPassivate(){} public String bookid; //映射bookid 字段 public String bookname; //映射bookname 字段 public double bookprice; //映射bookprice 字段 public void setBookName(String bookname){ this.bookname=bookname;}
  • 202. public void setBookPrice(double bookprice){ this.bookprice=bookprice;} public String getBookName(){ return this.bookname;} public double getBookPrice(){ return this.bookprice;} public String ejbCreate(String bookid,String bookname,double bookprice) throws CreateException{ if(bookid==null) throw new CreateException("The bookid is required"); this.bookid=bookid; this.bookname=bookname; this.bookprice=bookprice; return null;} }
  • 203. (本页无文本内容)
  • 204. 开发BMPBMP Bean 要求所有的数据库操作都要由Bean实例完成
  • 205. BMP Bean 要求所有的数据库操作都要由Bean实例完成
  • 206. 从客户端看的EJB视图clientGluecontainerserverEJBObjectBeanEJBHomeCreate, findBusiness Method
  • 207. BMP映射表之间关系One-to-One Relationships One-to-Many Relationships Many-to-Many Relationships
  • 208. (本页无文本内容)
  • 209. (本页无文本内容)
  • 210. (本页无文本内容)
  • 211. (本页无文本内容)
  • 212. j2ee的安全1. 基于容器的安全 组件的安全是由他们各自的容器来负责的,这种安全逻辑和业务逻辑相对独立的架构,使得企业级应用系统有更好的灵活性和扩展性。 声明性的安全性 可编程的安全性 isCallerInRole (EJBContext) getCallerPrincipal (EJBContext) isUserInRole (HttpServletRequest) getUserPrincipal (HttpServletRequest)
  • 213. 声明还是编程声明授权使EJB只关注业务逻辑 编程授权比较灵活 Eg:处理银行帐户,经理的职权只能$1000之下,对于这种具体的bean实例,声明无法处理
  • 214. 2.J2ee的验证模型 验证 授权 --角色 --用户和组 --访问控制 --映射
  • 215. JavaBeanServletJSPEJB组件目的通用组件体系结构实现 请求/应答结构生成 动态内容封装 商务逻辑运行等级任意:客户端(swing组件)或者服务器端(用于JSP页面)服务器服务器服务器典型服务Java库生命周期服务,请求/应答所有的servlet服务、脚本、标记扩展、应答缓存持久化、事务与安全性、连接池、生命周期服务
  • 216. 回顾J2EE架构
  • 217. J2EE应用的形式
  • 218. 几点体会1. 清晰、统一的概念 2. 标准的接口,屏蔽底层的实现(JDBC,EJB…Java) 3. 实现方式的多样化——trade-off与充分的选择权 CMP,BMP JTA, 4. 标准 vs. 扩展(语义的可理解性与可表达性)
  • 219. JDOJava 数据对象(Java Data Objects (JDO))是 Sun Microsystems 的一项新技术 Sun Microsystems 的 Java 数据对象(JDO)规范的目标是向 Java 程序员提供面向对象持久数据急需的轻量级的视图。
  • 220. 从较高层次的观点而言,使用 JDO 构建的应用程序由下列组件构成: 应用程序本身,它必须遵从 JDO 及其 API 一组业务对象,由以下两个类型构成: 瞬态业务对象,是不可持久存储的典型类 持久业务对象,是通过持久性管理器进行访问的类,它实现 JDO 的 PersistenceCapable 接口 持久性管理器,应用程序用来访问查询和事务 底层数据存储,持久性管理器用来对数据存储提供持久性和操作 类元数据,是描述持久类的关系和内容以及数据存储本身的 XML 文件
  • 221. (本页无文本内容)
  • 222. 用于开发和部署的工具 JDO 的开发工具使用类元数据来增强进行持久存储的类,并构建支持那些类的表模式 下图说明了 JDO 工具、数据库、类元数据以及可进行持久存储的业务对象之间的关系。
  • 223. 软件需求 真正利用 JDO 规范,除 Java 2 平台软件以外,您还需要用到一个大小适中的软件栈。首先,您需要 JDO 实现,它通常与 JDO 规范上的 JDO 接口捆绑在一起。您还需要支持它的关系数据库和 JDBC 驱动程序。
  • 224. 开发过程 用 JDO 进行开发的过程在许多方面类似于用 EJB CMP 进行开发的过程,只不过它更轻量级一些。JDO 开发过程基本上有四部分: 创建对象 定义对象持久性 创建应用程序 部署应用程序
  • 225. 第一步是构建源代码(.java 文件)。理论上,我们在这一步构建的对象源不必具有持久性。 下一步是确定什么类需要持久性。 类增强使构建过程与现有 IDE 集成很困难。它也是用 JDO 进行开发的最有争议的方面。修改 .class 文件是一种需好好研究的巧妙形式,而且已开发了工具来协助直接进行类的修改。尽管如此,要让您理解涉及创建与源代码并不对应的 .class 文件的过程,仍很困难。如果您使用诸如 Ant 那样的构建工具,那么它会在幕后为您无缝地完成一切操作。 下一步是使用已增强的 .class 文件和 JDO 接口来构建应用程序对象。尽管持久性对象不使用 JDO API 和实现,但应用程序对象将使用 JDO API 来控制持久对象的持久性、事务以及查询机制。在应用程序中,要与之打交道的主要部分是与特定数据源相关联的 PersistenceManager。 在构建应用程序时,我们还使用实际的数据库模式。通常,JDO 实现包含一个工具,它从前几步中创建的元数据和已增强的类文件中自动创建数据库模式。
  • 226. 设计模式
  • 227. Web应用程序的四种基本体系结构 基本HTML 包含JSP和servlet HTML Servlet和JavaBean组件的JSP页面 Servlet,JSP页面,JavaBean和EJB
  • 228. (本页无文本内容)