2002年的J2EE学习笔记

来源:互联网 发布:解放军陆军编制 知乎 编辑:程序博客网 时间:2024/06/05 00:45

J2EE学习笔记

1. JSP

1.1 什么是jsp,它有什么用途

JavaServer Pages技术是在J2EE平台建立包含诸如HTML,DHTML,JHTMLXML等动态Web内容的应用Java技术。JavaServer Pages技术使动态网页内容的生成更加简单但是具有最大的灵活性和能力

 

 

1.2 什么是jsp,它有什么用途

l         HTML(网页)是静态的

l         Jsp是动态的,而且可以既包含静态内容也可以包含动态内容(脚本)

l        JspAsp的相似之处和区别

 

1.3 Jsp是如何工作的

下面描述了一个典型的JSP请求是怎样被处理的:

l         浏览器从服务器请求一个jsp页面(jsp页面文件以.jsp作为后缀)。

l         Apusic web server用一个专门的jsp容器来处理jsp文件

l         jsp容器查找被请求的jsp文件,然后利用JSP 编译器将该文件转换为一个实现了javax.servlet.jsp.JspPage接口的servlet类。jsp 文件只有在需要时才会被编译;一般在第一次被请求或文件被修改后。这样,以前编译的jsp servlet类就可以被重复使用,使得以后的响应更快。

l        产生的JspPage servlet类被调用来处理浏览器请求

l          

1.4 一个简单的例子

简单地循环输出一个字符串

<html>

<head><title>一个简单的例子</title></head>

<body>

<% for (int i = 10; i <= 20; i++) { %>

<p style="font-size: <%=i%>pt">hello</p>

<% } %>

</body>

</html>

 

 

1.5 Jsp指令

编译指令:

包括pageincludetaglib

Page格式

<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class / package.*}, ..." ]
[ session="true / false" ]
[ buffer="none / 8kb / sizekb" ]
[ autoFlush="true / false" ]
[ isThreadSafe="true / false" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ contentType="mimeType [ ;charset=characterSet ]" / "text/html ;

charset=ISO-8859-1" ]
[ isErrorPage="true / false" ]
%>

 

例子:

<%@ page language=java import=java.util.Vector session=true contentType=text/html;charset=GBK errorPage=err.jsp%>

 

Include格式

JSP中包含一个静态的文件,同时解析这个文件中的JSP语句.
<%@ include file=
相对路径或绝对路径 %>

例子<%@ include file=test.jsp %>

 

Taglib格式

定义一个标签库以及其自定义标签的前缀.
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>

例子<%@ taglib uri=WEB-INF/tag.lib" prefix=mytag" %>

 

 

 

 

 

1.6 Jsp标记

Jsp行为标记包括userbean

 

<jsp:usebean>,实例化一个Java Beans

标签要包含几个参数,它们分别说明: 
JavaBean所从属的类 
JavaBean实例的名称 
JavaBean的作用域(生命周期)

例子:

实例化:

<jsp:usebean ID=myBeanInstance” CLASS=com.myPackage.myBeanClass” SCOPE=request />

  设置属性:

<jsp:setProperty NAME="myBeanInstance" PROPERTY="myProperty" VALUE="123"/>

得到属性:

<jsp:getProperty NAME=" myBeanInstance" PROPERTY=" myProperty"/>

<jsp:forward>标记:

重定向一个页面

<jsp:forward page={"relativeURL" | "<%= expression %>"} >
<jsp:param name="parameterName"
         
value="{parameterValue | <%= expression %>}" />
</jsp:forward>

 

 

 

1.7  Jsp内置对象

JSP中包含了一些固有的JAVA对象,可以在JSP页面中使用,其中的每个对象都实现了相关的API,用户不必再声明。

注意:这些对象只能在脚本段或表达式中调用,而不能在一个方法声明中调用,这会导致翻译时间错误,因为页面引用了一个还未定义的变量。

JSP内置对象包括

l         request/response

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息

response表示HttpServletResponse对象,并提供了几个用于设置送回 浏览器的响应的方法

l         Session

session表示一个请求的javax.servlet.http.HttpSession对象,用于对客户对话信息的保存

l         Application

applicaton 表示一个javax.servlet.ServletContext对象,用于在多个客户之间共享资源

l          out

out 对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果

l          pageContext

pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法

l         config

config表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数

 

l         page

page表示从该页面产生的一个servlet实例。它和你的脚本中的this相同

 

 

 

 

1.8 学习jsp的关键

l         分清开发三层结构与桌面应用这两种模式

l         学习有相关HTML知识

l         了解应用服务器的部署规则

 

 

1.9  

2. SERVLET

2.1 什么是SERVLET

  Servlet是是JAVA 2.0中新增的一个全新功能。他是与Applet相对应的,Applet是运行在客户端的浏览器,而Servlet是运行在服务器端的。 JAVA Servlets 是运行在请求/面向请求服务器上的模块,一个servlet可以从一个HTML订单表中获取数据然后用一些商业上的算法来更新公司相应的订单数据库。
   
也就是说:servlet能够象CGI脚本一样扩展WEB服务器功能,但是servlet占用很少密集资源,当一个服务器装载servlet它运行servlet init 方法这个方法不能反复调用,一旦调用就是再装载servlet. 直到服务器调用 destroy 方法卸载 servlet后才能再调用.每个新的CGI要求在服务器上新增一个进程。如果多个用户并发地访问该程序,这些进程将消耗该Web服务器所有的可用资源,并且系统性能降低到极其低下的地步。有很多用CGI脚本编制的一些站点由于访问量剧增,性能迅速下降,这是CGI脚本一个缺点。 同时由于servlet 是用java编写的,因此是跨平台的。实际servlet是电子商务真正的开始

2.2  

2.3     SERVLET的总体结构

    在具体掌握servlet之前,须对java语言有所了解。下面是基于您了解java基础上的,在Servlet  API中最重要的是Servlet interface. 所有servlets implement(执行)这个interface, 方式多种: 或者是直接的,或者通过extending 这个class执行它,如 HttpServlet. 这个Servlet interface  提供安排servlet与客户端联系的方法. Servlet 编写者可以在他们开发 servlet程序时提供更多一些或所有的这样方法.
   
当一个servlet接收来自客户端的调用请求它接收两个对象一个是ServletRequest,另外一个是ServletResponse. 这个ServletRequest class 概括从客户端到服务器之间的联系 ServletResponse class 概括从servlet 返回客户端的联系.
ServletRequest interface 可以获取到这样一些信息如由客户端传送的阐述名称,客户端正在使用的协议产生请求并且接收请求的服务器远端主机名它也提供获取数据流的servlet, ServletInputStream, 这些数据是客户端引用中使用HTTP POST  PUT 方法递交的一个ServletRequest的子类可以让 servlet获取更多的协议特性数据例如: HttpServletRequest 包含获取 HTTP-specific头部信息的方法.  
 ServletResponse  interface 
给出相应客户端的servlet方法它允许servlet 设置内容长度和回应的mime类型并且提供输出流, ServletOutputStream, 通过编写者可以发回相应数据. ServletResponse子类可以给出更多 protocol-specific容量的信息。 例如: HttpServletResponse 包含允许servlet 操作HTTP-specific头部信息的方法
.
  
上面有关classes  interfaces描述构成了一个基本的Servlet框架. HTTP servlets有一些附加的可以提供session-tracking capabilities的方法. servlet编写者可以用这些API在有他人操作时维护servlet与客户端之间的状态.

 

2.4  

2.5 SERVLET与客户端的交互性

  Servlet编写者注意HttpServlet类有几个重要的方法,你可以自己定义方法中内,但是必须使用这些方法名称以使servlet知道你想做什么, 
doGet, 用于处理 GET、有条件的GET 和头部 HEAD请求
doPost, 用户处理 POST 请求
doPut, 用于处理 PUT 请求
doDelete, 用于处理 DELETE请求 
HttpServlet的service方法, 一般地, 当它接收到一个OPTIONS请求时,会调用d
oOptions 方法, 当接收一个TRACE请求是调用doTrace . doOptions缺省执行方式
是自动决定什么样的HTTP被选择并且返回哪个信息. 
在你使用这些方法时,必须带两个参数. 第一个包含来自客户端的数据 HttpServletRequest. 第二个参数包含客户端的响应HttpServletResponse. 在下例中是这样的情况一个HttpServletRequest对象提供到达HTTP 头部数据, 也允许你获取客户端的数据. 怎样获取这些数据取决于HTTP端请求方法.
不管任何HTTP方式, 你可以 getParameterValues 方法, 这个用来返回特定名称的参数值. 对于用 HTTP GET 请求的方式, 这个 getQueryString 方法将会返回一个可以用来解剖分析的. 
对于用HTTP POST, PUT, 和 DELETE请求的方式, 你有两种方法可以选择. 如果是文本数据,你能通过getReader方法用BufferedReader获取 ; 如果是二进制数据, 能通过getReader 方法 ServletInputStream获取.
为了响应客户端, 一个HttpServletResponse对象提供返回数据给用户的两个方法. 你可以用getWriter 方法返回,或者 getOutputStream 方法以输出流返回. 你应该用getWriter返回文本数据,而用getOutputStream返回二进制数据.
在使用Writer 或 OutputStream之前, HTTP 头部应该先被设置. HttpServletResponse内提供这样一个方法,之后可以用writer 或 outputstream 将响应主体部分发回用户. 完成后要关 writer 或 output stream以便让服务器知道响应已经完毕

 

2.6  

2.7 编写简单的Hello World Servlet

lpackage Toone.OA.oaServlets;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class HelloWorld extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
res.setContentType("text/html;charset=GB2312");
PrintWriter pout = new PrintWriter(res.getOutputStream());
pout.println ("<html>");

lpout.println ("<head>“);
pout.println(”<title>“);

lpout.println (”怎样编写Servlet“);
pout.println(”</title>“);

lpout.println (”</head>“);
pout.println (”<body>“);

pout.println (”<center>“);
pout.println (”<br>“);

pout.println (”<br>“);
pout.println (”<h2>“);pout.println(“J2EE
培训——SERVLET”);
pout.println (“<hr>”);
pout.println (“
演讲人:方见华  时间
  2001.11.17 9:30-11:30");
pout.println ("</h2>");pout.println ("<h1>");
pout.println ("<br>");pout.println ("Hello World");
pout.println ("</h1>");pout.println ("</center>");
pout.println("</body>");pout.println ("</html>");
pout.flush ();pout.close ();
}
}

 

 

2.8  

2.9 编写基于表单处理的SERVLET

ackage Toone.OA.oaServlets;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
//import javaBean;

lpublic class Login extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String account,password;
account=req.getParameter ("account");

password=req.getParameter ("password");

res.setContentType("text/html;charset=GB2312");
PrintWriter pout = new PrintWriter(res.getOutputStream());
if(account.equals(“admin”)&&password.equals(“admin”)){

  pout.println(“恭喜您登录成功!”);

}

   else{

   pout.println(“对不起,登录失败!”);

  }  

pout.flush ();

pout.close ();

2.10  

2.11 Servlet相关的API介绍

 

 

3. JDBC

3.1 JDBC简介

3.1.1 JDBCJava DataBase ConnectionJava通用SQL(结构化查询语言)数据库访问框架,带有简单且功能强大的应用程序接口(API)。利用JDBC APIJava开发人员可以在单一的标准化功能库中编码,生成独立于数据库管理系统(DBMS)Java应用系统。

 

3.1.2 JDBC驱动程序分类

l      JDBC/ODBC Bridge

l      Native API Partly Java

l       Net Protocol All

l       JavaNative Protocol All Java

 

3.1.3 使用 JDBC 必须的参数

l       driver 数据库驱动程序

tds :             com.inet.tds.TdsDriver

jdbc-odbc bridge:  sun.jdbc.odbc.JdbcOdbcDriver

Oracle:          oracle.jdbc.driver.OracleDriver

 

l       url 连接路径

tds:

jdbc:inetdae:10.1.22.200:1433?charset=gb2312&database=MyDB

 

jdbc-odbc bridge: jdbc:odbc:toServer

 

Oracle:jdbc:oracle:thin:@10.1.22.134:1521:MyDB

 

 

l       user 用户名称

l       password 密码

 

 

 

3.2 连接数据库的一般过程

3.2.1 装入数据库驱动程序

Class.forName (“com.inet.tds.TdsDriver”);

 

驱动程序装入后,由 DriverManager 获得

 

3.2.2 与访问的数据库建立连接

Connection con=DriverManager.getConnection( “jdbc:odbc:MyDBSource”);

 

 

3.2.3 创建 Statement 以便进行数据库操作

l         用于执行静态SQL语句(存储过程)Statement stmt=con.createStatement();

 

用于执行动态SQL语句(存储过程)

1. PreparedStatement

2. CallableStatement  OUTINOUT

 

 

3.2.4 对数据库进行操作

execute()                      存储函数

executeQuery()                查询

executeUpdate()               更新修改

 

Statement 方法

    String sql = “select * from employee where lastName=/’Huang/’ ”;

    Statement stmt=con.createStatment();

     ResultSet = stmt.executeQuery(sql);

 

PreparedStatement 方法

    String sql = “select * from employee where lastName=?”;

    PreparedStatement prepare = con.prepareStatement(sql);

     prepare.setString(1,”Huang”);

     ResultSet result=prepare.executeQuery();

 

 

3.2.5 处理返回结果

while (queryResult.next()){

 System.out.println(queryResult.getInt("id")+"   "

+queryResult.getString("name")+"   "

+queryResult.getString("department")+"   "

 );

}

 

陷阱:  next()

 

3.2.6 关闭Statement 对象

 

3.2.7 关闭连接

3.2.8 完整的例子

//1.装入数据库驱动程序

Class.forName (DB_DRIVER);

//2.与访问的数据库建立连接

Connection con

       =DriverManager.getConnection(URL,USR_NAME,PASSWORD);

//3.创建 Statement 以便进行数据库操作

Statement stmt=con.createStatement();

//4.对数据库进行操作

result=stmt.executeQuery(sql);

//5.关闭Statement 对象

stmt.close();

//6.关闭连接

con.close();

 

 

3.3 连接池

l        DBManager 拥有唯一的实例

l         数据连接使用完之后,释放回池中,等待下一次使用

l         连接的管理算法由管理程序提供,用户只需关心连接的获得与释放

 

3.4 Apusic 的连接池配置

l        Apusic 服务器提供已准备好的对DBMS的连接池。

l         配置 EJB EntityBean 必须先配置连接池

 

l         配置文件

  APUSIC_HOME/config/datasources.xml

datasources.xml

:

<datasource name="JDBC_test"

     jndi-name="jdbc/JDBCTest"

     driver-class="com.inet.tds.TdsDriver"

     driver-classpath="D:/jdk1.3/lib/tds.jar"

     url="jdbc:inetdae7:10.1.22.134:1433?charset=gb2312&amp;database=tempdb "

     min-spare-connections="5"

     max-spare-connections="30"

     idle-timeout="3000"

  >

    <property name="user" value="tempdbUsr"/>

    <property name="password" value="123456"/>

  </datasource>

程序调用:

//取得InitialContext对象

Context ctx=new InitialContext();

//通过JNDI取得数据源

DataSource datasource=(DataSource)ctx.lookup("jdbc/JDBCTest");

//通过数据源取得数据库连接

Connection con=datasource.getConnection();

//创建 Statement 以便进行数据库操作

Statement stmt=con.createStatement();

//对数据库进行操作

queryResult=stmt.executeQuery(sql);

//关闭Statement 对象

stmt.close();

//关闭连接

con.close();

 

 

 

 

3.5 应用

连接的释放

 

 

4. Session EJB

4.1 EJB的简介

enterprise bean是运行在EJB容器中的javaBean。这个容器是一个控制着enterprise bean,并为它们提供系统级的服务的运行环境。虽然你本身并没有开发这些服务,但你还是可以自由的集中在enterprise bean中的商务方法。EJB容器为enterprise bean提供了如下的服务:

事务管理 、安全性、分布式、 生命周期管理、数据库连接池

4.1.1 事务管理

当用户调用在enterprise bean中的方法时,EJB Container为了管理也介入其中。因为EJB Container管理着事务,你不需在enterprise bean为事务边界编码。控制着分散的事务的代码可能会十分复杂。你可以只是在描述性文档中简单的定义enterprise bean的事务属性,而不需编写和调试复杂的代码。EJB Container读取这份文档,并为你处理enterprise bean的事务。

4.1.2 安全性

EJB Container只允许经授权的用户调用enterprise bean中的方法。每一个用户都属于一个独特的角色,每一个角色都允许去调用对应的特定的方法。你定义的方法和角色都可以从描述符中调用,正因为这种定义的路径,你不需为了强调安全性再去为路径编码。

4.1.3 分布式

EJB Container管理着客户和enterprise bean之间的低级的通信,当一个enterprise被创建后,一个客户就可以象在相同虚拟机中一样调用它的方法。

4.1.4 生命周期管理

一个enterprise bean在它的生命期要经过几个不同的状态。EJB Container创建enterprise bean,使它在一个有着多种实列和活动状态的池中相互移动,最后,把它从中移开。虽然用户调用方法去创建和转移enterprise bean,但是EJB Container在后台执行这些任务。

4.1.5 数据库连接池

  数据库连接是一个代价昂贵的资源。获得数据库连接是耗时的,并且连接数受到限制。为了减少这些问题,EJB Container管理着一个数据库连接池。一个enterprise bean能快速的从池中获得连接,并当它释放掉连接后,可以再次被其他的enterprise bean使用。

4.2 Seesion Bean的介绍

4.2.1 Session Bean的简介

一个session bean 表现了一个在 J2EE服务器内部的客户。客户通过调用session bean 的方法访问远程的服务。Session bean 执行它的客户的服务,通过在服务器的内部执行商业任务来在复杂的事物中隐藏客户。

       Session Bean就像它的名字所表现的一样,一个session bean就类似一次交互的会话。一个session bean不能被共享,它应该只对应一个客户,也就是说,一次交互的会话应该恰好只有一个用户。就像一次交互的会话,一个session bean并不能一直持续。当客户停止时,session bean就表现为中断,并没有与客户维持长时间的联系。

4.2.2 Session Bean的组成

一个Session BeanSession Bean class, Home Interface, Remote Interface组成

4.2.2.1 Session Bean class

Session Bean class必须满足以下要求:

l         它应该实现SessionBean的接口。

l         这个类必须定义为Public不能定义为 abstract or final

l         它必须实现一个或多个 ejbCreate 的方法。

l         它应该实现了业务的方法。

l         它应该包含一个没有参数的构造方法。

  它也不能定义为finalize的方法。

4.2.2.1.1 SessionBean 的接口

SessionBean的接口扩展了Enterprise Bean的一系列接口。SessionBean的接口实现了ejbRemove, ejbActivate, ejbPassivatesetSessionContext 方法 。在Session  Bean class中必须实现这些方法,这些方法是EJB容器用来管理EJB生命周期的。

4.2.2.1.2 ejbCreate 方法

SessionBean是运行在一个EJB的容器中,客户不能直接实例化这个bean。仅仅只有EJB容器能实例化一个ejb EJB容器实例化就是调用ejbCreate方法实现的。

一个session bean可以有一个或多个ejbCreate方法。这些方法必须满足以下条件:

l         这些访问控制的修饰词必须为Public

l         返回的类型必须为Void

l         参数必须是 Java RMI的合法类型。

l         修饰词不能为static or final.

l         抛出 javax.ejb.CreateException异常

4.2.2.1.3 Business Methods

一个session bean的主要目的是针对客户进行一些业务处理。客户端调用远程对象返回的构造方法的中的一些业务方法。在用户看来这些方法像在本地运行,实际上它们是在远程的session bean中运行的

这些业务方法应该与以下规则一致:

l         方法名不能与已有的EJB的体系已定义的名称冲突。举一个例子:你不能命名你的方法为:ejbCreate or ejbActivate

l         控制访问的修饰必须为Public

l         参数和返回类型必须是 Java RMI的合法类型。

l         修饰必须不是Staticfinal

4.2.2.2 Home Interface

一个Home Interface扩展了EJBHome的接口。Home Interface的目的是定义用户可能调用的create方法.

每一个create方法都在Home Interface中与一个在session bean class中的一个ejbCreate方法通信. 

ejbCreatecreate的参数是相似的,但更重要的是它们的不同。关于一个home interface中的create方法定义的规则如下

l         create方法的参数的个数和类型必须与它相联系的ejbCreate方法相一致。

l         create方法的参数和返回类型必须是有效的RMI类型

l         一个create方法返回enterprise bean 远程接口的类型。(但是一个ejbCreate方法返回为void

l         create方法throws包括java.rmi.RemoteException javax.ejb.CreateException.

4.2.2.3 Remote Interface

Remote Interface扩展了(extendjavax.ejb.EJBObject,定义了客户端可能调用的业务方法。在远程接口中定义的方法必须符合以下规则:

l         每一个远程接口的方法必须与在enterprise bean 中的方法实现相一致

l         远程接口的方法的信号(signature)必须与它相连系enterprise bean 中的方法信号一致

l         参数和返回值必须是有效的RMI类型

l         throws 必须包含java.rmi.RemoteException

4.2.3  客户端调用session Bean的过程

l         通过JNDI查找到Home接口

l         通过找到的Home接口创建远程对象

l         客户通过调用远程对象的方法完成相应的任务

     在客户调用远程接口的方法时,容器负责映射远程对方法到具体的代码(Hello-->HelloEJB)。我们在编写EJB组件时,对于Home接口、Remote接口,我们仅仅声明了接口及其方法,并没有实现这两个接口。这两个接口的具体实现,是在部署时由容器完成的。

4.2.4 Session 状态的管理

当你指定一个session bean时,你必须选择两种状态管理模式中的一个:stateful or stateless

4.2.4.1 Stateless Session Beans

Stateless session bean并不为特别的一个客户建立一个会话的状态(state,当一个客户调用一个Stateless Bean的方法时,这个beans的实例变量可能包含一个状态,但仅仅是在调用的过程中。当方法结束时,状态也不会保持。除了调用方法的时候,所有Stateless Bean的实例都是等价的,允许EJB的容器分配一个实例给任何一个客户

因为Stateless session Bean能支持多个用户,它们能为那些要求大量的客户的应用提供了更好的可伸缩性。一个应用对于支持相同的客户数目来说,所需要的Stateless Session Beans远少于Stateful Session Beans.

       有时,EJB容器必须将Stateful Session Beans保存在二级存储器中,但Stateless Session Beans永远不需要。因此,Stateless Session BeansStateful Session Beans有更好的性能。

       一个stateless session home interface必须有一个单独的没有参数的create方法,session bean 类也必须包含一个ejbCreate 的构造方法,同样是没有参数。(仅仅stateful session beans 需要参数,用于创建它们相应的状态。)

4.2.4.2 Stateful Session Beans

Stateful Session Bean可以一对一的维持某个调用客户的状态,并且在不同的方法调用中维持这个状态, 由于对于每一个并发用户,必须有一个对应的Stateful Session Bean。为了提高系统的效率,Stateful Session Bean可以在一定的客户空闲时间后被写入二级存储设备(如硬盘),在客户发出新的调用请求后,再从二级存储设备恢复到内存中

Stateful Session Bean中一般都实例变量,这些变量表现了Session Bean的会话状态

4.2.4.3 怎样选择Stateful Stateless

你应该考虑在以下情况满足时使用stateful session bean:

l         当它被创建时beanstate必须初试化。

l         bean需要掌握客户调用方法后的信息。

l         客户是一个交互的应用。

因为一个session bean的主要目的就是在J2EE服务中表现一个客户,所以你的大部分session beanstateful。然而,有时你可以使用stateless session bean

l         一个session bean 的任务并不是针对一个客户的。举一个例子:你可以使用一个stateless session bean类完成数据库的连接设置数据。

l         当一个用户调用一个方法时,bean不需要掌握用户的信息。

4.2.5 Session Bean的生命周期

l         一个session bean在它的生命周期中有很多阶段。它的生命周期是由ejb 容器控制的,而不是你的应用程序

l         Life Cycle of a Stateful Session Bean

l         Life Cycle of a Stateless Session Bean

4.3 讲解Stateless Session Bean例子

 

4.4 讲解Stateful Session Bean例子

 

4.5 Session BeanApusic 的部署

 

5. Entity EJB的介绍

 一个Entity Bean代表了一个存储机制中的实体,通常是一个数据库。例如,在商业应用中可能会用数据库来保存一个实体对象(比如账号、客户、订单、产品等)。在J2EE服务体系中就用Entity Bean在表示一个业务实体对象。

5.1 Entity Bean的特征

5.1.1 持久性

Entity bean的状态是保存在存储机构中的,因而具有持久性。持久性就意味着实体bean存在于该应用或J2EE服务的整个生命周期中。就像数据库中数据一样,即使我们关闭了应用中的数据库或结束该应用,数据仍然保留在数据库中而不会丢失。

Entity Bean有两种类型的持久性:BMP(bean-managed Persistence)CMPcontainer-managed Persistence)。

Bean-Managed Persistence

BMP型的Entity Bean代码要包含访问数据库的方法。比如要在ejbCreate 中加入sqlinsert语句。 Container-Managed Persistence

CMPEntityBean由容器自动完成数据库操作。当客户端调用ejbCreate方法时,容器会自动产生insert语句。因而这种EntityBean是独立于任何特定的数据库的。

相对BMP型来讲,CMP 有以下优点:

· 代码简单

· 它们的代码独立于数据库,因而在J2EE应用中更便于移植。

各个EntityBean间的关系由容器来管理,而不是有Bean自己来管理。

5.1.2 共享访问

Entity beans 可以为多用户共享访问,这给客户间的交互提供了方便。一般地,由Ejb容器来管理事务功能,你只要指定一些deployment descriptor事务的属性就行了,而不必在boundaries间编码

5.1.3 主键

在数据库中,每一个Entitybean都会有一个特定的键值来识别,这个键值称之为主键。比如,一个customer Bean,我们可以定为顾客号(customer number)。

5.2 Entity EJB的组成

Entity EJBEntity Bean Class, Primary Key Class, Home Interface, Remote Interface组成

5.2.1 Entity Bean Class

要符合以下情况:

l        实现 EntityBean 接口

l        必须是public,非abstract final的。

l        包含零个或多个 ejbCreate ejbPostCreate 方法

l        实现 finder方法( BMP ).

l        实现了商业逻辑

l        包含一个空构造函数

5.2.1.1 EntityBean 接口

EntityBean 接口扩展了EnterpriseBean接口(扩展Serializable接口)。EntityBean 接口声明了许多方法。

ejbActivate()

ejbLoad()

ejbPassivate()

ejbRemove()

ejbStore()

setEntityContext(EntityContext ctx)

unsetEntityContext()

5.2.1.2 ejbCreate 方法

用户激活create方法,由EJB 容器激活相应的ejbCreate 方法来创建一个entityBean实例。一般地,ejbCreate 方法执行以下操作:

l        向数据库插入一条纪录;

l        初始化实例变量;

l        返回主键

一个enterprise bean 可以包含多个ejbCreate 方法。

ejbCreate必须符合以下条件:

l        必须是public.

l        返回一个主键(BMP),在CMP可以返回null

l        参数必须是合法的RM类型

l        方法不是 final or static.

ejbCreate方法中经常会抛出异常 javax.ejb.CreateException或其它异常,例如当参数非法时EjbCreate方法通常抛出异常CreateException,当主键不存在时无法创建实例,ejbCreate 会抛出javax.ejb.DuplicateKeyException 异常

5.2.1.3 ejbPostCreate方法

每一个 ejbCreate方法都有一个对应的一个ejbPostCreate 方法,EJB容器 在调用ejbCreate后激活ejbPostCreate。由ejbPostCreate 方法调用EntityContext接口中的getPrimaryKeygetEJBObject方法。 通常,ejbPostCreate 可为空。

 EjbPostCreate必须符合以下条件:

l        参数的个数个类型与对应ejbCreate 方法相同

l        必须是public、非final static

l        返回类型为空。

l        抛出的违例也是javax.ejb.CreateException等其它异常。

5.2.1.4 ejbRemove方法

用户激活remove方法,由EJB 容器激活ejbRemove方法。

一般ejbRemove方法用来从数据库中删除一条纪录。在方法中一般写deleteSQL

5.2.1.5 ejbLoad ejbStore方法

如果要将实体变量和数据库保持同步,EJB容器会调用ejbLoadejbStore 方法,ejbLoad 方法是从数据库中刷新entity bean实体变量的值,ejbStore 则将变量的值写回数据库。当然用户不一定要调用ejbLoadejbStore

  如果一个商业方法和事务有关,容器将在这个方法执行前激活 ejbLoad ,然后立即调用ejbStore,因而我们不必担心实例变量的刷新问题――因为Ejb容器已经作好了

   一般ejbLoad方法用来从数据库中检索纪录(select

   一般ejbStore方法用来更新数据中的纪录(update

5.2.1.6 Finder 方法

finder 方法的作用是定位entity beans (select)

Finder方法只在BMP中实现,而在CMP是通过定义来完成的。

对应Home Interface的每一个finder方法,entity bean实现的是相应的以ejbFind为前缀的方法。

在一个应用中,至少有一个ejbFindByPrimaryKey,其它的如ejbFindByLastName ejbFindInRange是可选的。 顾名思义, ejbFindByPrimaryKey 方法通过主键来确定一个数据库中的一行

注意:客户并不直接调用ejbFindByPrimaryKey,而是由EJB容器来调用它。

下面列取了BMP entity beanfinder方法的规则:

· The ejbFindByPrimaryKey method must be implemented.

· 前缀必须是ejbFind.

· 必须是public和非final or static.

· 参数类型必须是Primary Key Class

· 参数和返回类型符合RMI.

· 返回类型必须是主键或主键的集合。

Finder方法抛出的违例是javax.ejb.FinderException, 还可以是用户指定的其它违例。如果是返回的单个主键没有找到,则抛出javax.ejb.ObjectNotFoundException ,它是FinderException的子类;如果返回的主键集合没有找到,则抛出违例是FinderException.

5.2.1.7 Business Method

business 方法封装了EntityBean的商业逻辑,通常,business 方法不访问数据库,他允许我们将商业逻辑和数据库的访问隔离开来

business 方法符合以下要求:

· 方法名字不能和EJB构架中定义的冲突,例如不能是ejbCreate ejbActivate

· 必须是public和非final static.

· 参数和返回类型必须符合RMI.

5.2.1.8 ejb方法与SQL对应表

ejb Method    

SQL

ejbCreate

insert

finder

select

ejbLoad

select

ejbStore

update

ejbRemove

delete

 

5.3 Primary Key Class

你可以用部署工具来指定一个主键类。可以指定java.lang.String 作为主键类。通常情况下,主键类必须是java包中能找到的类。在实体Bean中指定主键类是必须的。如果一个数据库的主码是多个域的组合你就必须自己创键一个主码类 

Primare Key Class应该符合以下条件:

· 类的存取修改器是public.

· 所有的域是 public.

· 对于CMP,主键类的变量名必须和bean容器的field一致。

· 有一个缺省的构造器。

· 它必须是serializable.

 

5.3.1 主键的获取

客户通过调用Remote InterfacegetPrimaryKey方法来获取主键。

Account account;

String id = (String)account.getPrimaryKey(); Entity bean 通过调用EntityContext 类的getPrimaryKey 方法获取主键

   EntityContext context;

   String id = (String) context.getPrimaryKey();

5.4 Home Interface

Home接口定义了createfinder方法为用户创建entitybean实例提供了方便

Home Interface的要求:

l         ejb classejbCreate方法的参数数量和类型一致

l         返回值是remote接口

l         抛出异常java.rmi.RemoteException the javax.ejb.CreateException

5.5 Entity EJB的生命周期

 

 

 注:本文是笔者2002年接确J2EE时写的学习笔记,近日整理资料,翻出来贴上来留作纪念。
原创粉丝点击