分布式系统复习题(chen).doc_第1页
分布式系统复习题(chen).doc_第2页
分布式系统复习题(chen).doc_第3页
分布式系统复习题(chen).doc_第4页
分布式系统复习题(chen).doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

分布式系统练习题(J2EE)题型:判断(10)、简答(5)、编程(4)、主观题(3)一、简答题1 简述远程方法调用(Remote Method Invocation,RMI)的基本通信原理。答::远程方法调用(RMI)的基本通信原理:客户端与服务器端内在通过套接字通信。服务器端1、创建远程服务对象2、接收请求、执行并返回结果(Skeleton)1)解码(读取)远程方法的参数;2)调用实际远程对象实现的方法;3)将结果(返回值或异常)返回给调用程序。客户端1、建立与服务器的连接2、发送请求、接收返回结果(Stub)1)初始化连接;2)编码并发送参数;3)等待方法调用结果;4)解码(读取)返回值或返回的异常;5)将值返回给调用程序。2 简述远程方法调用(Remote Method Invocation,RMI)的编程模型(主要编程步骤)。答:远程方法调用(RMI)的编程步骤: 1)定义远程接口;2)定义远程对象/服务;3)定义客户应用,并与远程对象通信;4)调用远程方法(参数及返回值)。3 简述BMP实体Bean与CMP实体Bean的优缺点。答:1、编程方面CMP比BMP简单BMP需要通过Bean代码实现数据库的操作;CMP则只需要做相关的映射就可以了。2、功能方面BMP比CMP强大CMP一般用于单表操作;BMP则可用于单表和多表操作。4 简述EJB2.1规范中实体Bean的finder方法在容器中的工作机制(要求阐述客户端调用finder方法时EJB容器调用Bean方法的过程)。答:EJB2.1规范中实体Bean的finder方法在容器中的工作机制(容器调用机制)1.create(1)ejbCreate,若返回异常,则结束,否则转2(2)ejbActivate(3)ejbPostCreate(4)ejbStore(5)返回结果2.find.(1)ejbFind.,若返回异常,则结束,否则转2(2)对(1)返回的结果集,逐个处理(3-5)(3)若对象已经存在于容器内存中,则直接使用,否则转4(4)从Pool中取一个空闲对象,调用ejbActivate与主键值关联(5)调用ejbLoad方法(6)返回结果5 简述无状态会话Bean的生命周期(图示或文字描述均可)。答:无状态会话Bean的生命周期如下图所示:6 简述有状态会话Bean的生命周期(图示或文字描述均可)。答:有状态会话Bean的生命周期如下图所示:7 简述EJB 2.1规范实体Bean的生命周期(图示或文字描述均可)。答:实体Bean的生命周期如下图所示:8 简述EJB 2.1规范中会话Bean的远程接口、Home接口和Bean实现类的作用。答:1、远程接口的作用:定义客户机可以调用的商业方法。2、Home接口的作用:定义客户机可调用的Create上客户机实例化所需的对象EJB。3、Bean实现类的作用:Bean具体实现的功能。二、编程题1使用EJB2.1规范编写一个无状态会话Bean,实现Fibonacci 数列第n项的求解(要求使用非递归方法实现)。已知Remote接口和Home接口代码如下:/*Remote接口代码*/import java.rmi.RemoteException;import javax.ejb.EJBObject;public interface Fibonacci extends EJBObject/获取Fibonacci数列第n项的值(n的索引从1开始) public long getFibonacciItem(int n) throws RemoteException;/*Home接口代码*/import java.rmi.RemoteException;import javax.ejb.*;public interface FibonacciHome extends EJBHomepublic Fibonacci create() throws RemoteException,CreateException;/*EJB实现类代码*/import javax.ejb.SessionBean;import javax.ejb.SessionContext;import javax.ejb.CreateException;public class FibonacciEJB implements SessionBean SessionContext sessionContext; /远程接口的方法 public long getFibonacciItem(int n) long ff;if (n=1)ff= 1;elseint x,a=0,b=l;for(int i=2;i2时当前项为前两项之和。2使用EJB2.1规范编写一个无状态会话Bean,实现从1到n所有被3整除,但不被7整除的整数求和(n由参数传入)。已知Remote接口和Home接口代码如下:/*Remote接口代码*/import java.rmi.RemoteException;import javax.ejb.EJBObject;public interface Sum extends EJBObject /求解从1到n的所有被3整除,但不被7整除的整数这和public long getSum(int n) throws RemoteException;/*Home接口代码*/import java.rmi.RemoteException;import javax.ejb.*;public interface SumHome extends EJBHomepublic Sum create() throws RemoteException,CreateException;/*EJB实现类代码*/import javax.ejb.SessionBean;import javax.ejb.SessionContext;import javax.ejb.CreateException;public class SumEJB implements SessionBean SessionContext sessionContext; /远程接口的方法 public long getSum(int n) int i;long sum = 0;for(i=1;i0)累加 long sum(long n) throws java.rmi.RemoteException;RMI服务端:import java.rmi.*;public class SumService extends java.rmi.server.UnicastRemoteObject implements SumRemote public SumService() throws RemoteException /实现从1到n(n0)累加 public long sum(long n) long ff=0;int I;for (I=1;I0)累加 public long sum(long n) long ff=0;int I;for (I=1;I=n,I+)ff+=I;Return ff; public static void main(String args)trySumRemote obj=new SumServer();Context ic=new InitialContext();ic.rebind(SumServer,obj);System.out.println(Service OK!);catch(Exception ex)ex.printStackTrace();RMI-IIOP客户端:import java.rmi.*;import javax.rmi.*;import javax.naming.*;public class SumClientpublic static void main(String args)tryContext ic=new InitialContext();Object obj=ic.lookup(“SumServer”);SumRemote remoteObj=(SumRemote)PortableRemoteObject.narrow(Obj,SumRemote.class);System.out.println(remoteObj.sum(100);catch(Exception ex)ex.printStackTrace();4已知部署在JBOSS中的消息驱动Bean源码如下:import javax.ejb.*;import javax.jms.*;MessageDriven(mappedName = jms/QueueMDB, activationConfig = ActivationConfigProperty(propertyName = acknowledgeMode, propertyValue = Auto-acknowledge),ActivationConfigProperty(propertyName = destinationType, propertyValue = javax.jms.Queue),ActivationConfigProperty(propertyName = destination,propertyValue=queue/queueMDB)public class QueueMDB implements MessageListener public void onMessage(Message msg) System.out.println(msg);JSP客户端源码如下: base href= My JSP test.jsp starting page This is my JSP page. 请编写一个JSP客户端,向该MDB发送一个文本消息,消息内容自定。5已知部署在JBOSS中的消息驱动Bean源码如下:import javax.ejb.*;import javax.jms.*;MessageDriven(mappedName = jms/TopicMDB, activationConfig = ActivationConfigProperty(propertyName = acknowledgeMode, propertyValue = Auto-acknowledge),ActivationConfigProperty(propertyName = destinationType, propertyValue = javax.jms.Topic),ActivationConfigProperty(propertyName = destination,propertyValue=topic/myTopicMDB)public class TopicMDB implements MessageListener public void onMessage(Message msg) System.out.println(msg);JSP客户端源码如下: base href= My JSP test.jsp starting page This is my JSP page. 请编写一个JSP客户端,向该MDB发送一个文本消息,消息内容自定。6使用EJB 2.1规范编写BMP实体Bean,对Users表操作,实现如下功能:(1)用户记录的插入;(2)用户记录的获取;(3)查找在某一年龄区间的用户列表。后台数据库为Pubs,表为Users(cUser char(20) primary key, iAge int, eMail char(30),分别表示用户名、年龄、电子邮箱。Pubs对应的ODBC数据源为Pubs。部分代码已经编写如下,请编写EJB实现类完善该EJB。/*Remote接口*/import java.rmi.RemoteException;import javax.ejb.EJBObject;public interface User extends EJBObject public String getUser() throws RemoteException; /获取用户名 public int getAge() throws RemoteException; /获取年龄 public String getEMail() throws RemoteException; /获取电子邮箱 public void setAge(int age) throws RemoteException; /设置年龄 public void setEMail(String email) throws RemoteException; /设置电子邮箱/*Home接口*/import java.rmi.RemoteException;import javax.ejb.*;import java.util.*;public interface UserHome extends EJBHome public User create(String user, int age, String email) throws RemoteException,CreateException; public User findByPrimaryKey(String priKey) throws RemoteException,FinderException; /查找年龄在fromAge与toAge之间的用户列表 public Collection findInAge(int fromAge, int toAge) throws RemoteException,FinderException;/*EJB实现类*/import javax.ejb.EntityBean;import javax.ejb.EntityContext;import javax.ejb.CreateException;import javax.ejb.RemoveException;import javax.ejb.FinderException;import java.sql.*;import javax.ejb.*;public class UserBean implements EntityBean EntityContext entityContext; String cUser; int iAge; String eMail; Connection conn=null; /ejbCreate()方法必须返回主键值(不同于会话Bean,会话Bean一般没有返回值) public String ejbCreate(String user,int age,String email) throws CreateException cUser= user;setAge(age);setEMail(email); try/插入到数据库(创建新记录)/(1)用户记录的插入 String insertStatement=insert into Users values ( ? , ? , ? ); PreparedStatement prepStmt = conn.prepareStatement(insertStatement); prepStmt.setString(1, user); prepStmt.setInt(2, age); prepStmt.setString(3, email); int ans = prepStmt.executeUpdate(); prepStmt.close(); if (ans = 0) throw new EJBException(ejbCreate: Could not Create!); catch (Exception ex) throw new EJBException(ejbCreate: + ex.getMessage(); return this.cUser; /这里必须返回主键值 /ejbPostCreate()参数必须与ejbCreate()相同,但返回值必须是void(即无返回值) /ejbPostCreate()在容器中是在ejbCreate()调用之后由容器自动调用 public void ejbPostCreate(String user,int age,String email) throws CreateException /通过主键值查找记录或数据(这个方法和create()一样,对于实体Bean来说是必需的)/(2)用户记录的获取 public String ejbFindByPrimaryKey(String priKey) throws FinderException try String sQuery=select cUser from Users where cUser=?; PreparedStatement pstate = conn.prepareStatement(sQuery); pstate.setString(1, priKey); ResultSet result = pstate.executeQuery(); boolean ans = result.next(); pstate.close(); if (ans) return priKey; /这里也必须返回主键值(实际从数据库提取Bean是在ejbLoad()方法中完成) else throw new EJBException(ejbFind: Could not find!); catch (Exception ex) throw new EJBException(ejbFind: + ex.getMessage(); /查找年龄在fromAge与toAge之间的用户列表/(3)查找在某一年龄区间的用户列表public Collection findInAge(int fromAge, int toAge) throws FinderException try String sQuery=select cUser from Users where iAge between ? and ?; PreparedStatement pstate = conn.prepareStatement(sQuery);pstate.setInt(1, fromAge);pstate.setInt(2, toAge); ResultSet result = pstate.executeQuery(); if (result.count0) ArrayList userlist=new ArrayList();while(result.next() userlist.add(result.getString(cUser); return userlist; /返回结果集 else throw new EJBException(ejbFind: Could not find!);pstate.close(); catch (Exception ex) throw new EJBException(ejbFind: + ex.getMessage(); /删除记录,在客户端调用时使用remove()方法 public void ejbRemove() throws RemoveException public void ejbLoad() public void ejbStore() public void ejbActivate() /激活时从上下文获取主键信息 this.cUser=(String)entityContext.getPrimaryKey(); public void ejbPassivate() this.cUser=null; /钝化时将主键值设置为空 public void unsetEntityContext() /释放实体Bean上下文 this.entityContext = null; try /释放数据库连接 conn.close(); catch (Exception ex) public void setEntityContext(EntityContext entityContext) /设置上下文实体对象 this.entityContext = entityContext; try /连接数据库 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); conn = DriverManager.getConnection(jdbc:odbc:pubs); catch (Exception ex) ex.printStackTrace(); /业务方法 public String getUser() return cUser; public int getAge() return iAge; public String getEMail() return eMail; public void setAge(int age) iAge=age; public void setEMail(String email) this.eMail = email; 提示:可以仅编写能实现题目需求功能的方法体代码,但框架要求完整。7使用EJB 2.1规范编写BMP实体Bean,对Account表操作,实现如下功能:(1)用户记录的插入;(2)用户记录的获取;(3)查找帐户余额在某一区间的帐户列表。后台数据库为Pubs,表为Account(cId char(10) primary key, dDate char(10) not null, balance int not null),分别表示帐号ID、创建日期、帐户余额。Pubs对应的ODBC数据源为Pubs。部分代码已经编写如下,请编写EJB实现类完善该EJB。/*Remote接口*/import java.rmi.RemoteException;import javax.ejb.EJBObject;public interface Account extends EJBObject public String getAccountId() throws RemoteException; /获取帐号ID public String getDate() throws RemoteException; /获取创建日期 public int getBalance() throws RemoteException; /获取帐户余额 public void setDate(String date) throws RemoteException; /设置创建日期 public void setBalance(int balance) throws RemoteException; /设置帐户余额/*Home接口*/import java.rmi.RemoteException;import javax.ejb.*;import java.util.*;public interface AccountHome extends EJBHome public Account create(String accountId, String createDate, int balance)throws RemoteException,CreateException;public Account findByPrimaryKey(String priKey)throws RemoteException,FinderException; /查找帐户余额在某一区间的帐户列表 public Collection findByBalanceInterval(int from, int to)throws RemoteException,FinderException;/*EJB实现类*/import javax.ejb.EntityBean;import javax.ejb.EntityContext;import javax.ejb.CreateException;import javax.ejb.RemoveException;import javax.ejb.FinderException;import java.sql.*;import javax.ejb.*;public class AccountBean implements EntityBean EntityContext entityContext; String cId; String dDate; int balance; Connection conn=null; /ejbCreate()方法必须返回主键值(不同于会话Bean,会话Bean一般没有返回值) public String ejbCreate(String accountId, String createDate, int balance) throws CreateException cId= accountId;setDate(createDate);setBalance(balance); try/插入到数据库(创建新记录)/(1)用户记录的插入 String insertStatement=insert into Account values ( ? , ? , ? ); PreparedStatement prepStmt = conn.prepareStatement(insertStatement); prepStmt.setString(1, accountId); prepStmt.setString(2, createDate); prepStmt.setInt(3, balance); int ans = prepStmt.executeUpdate(); prepStmt.close(); if (ans = 0) throw new EJBException(ejbCreate: Could not Create!); catch (Exception ex) throw new EJBException(ejbCreate: + ex.getMessage(); return this.cId; /这里必须返回主键值 /ejbPostCreate()参数必须与ejbCreate()相同,但返回值必须是void(即无返回值) /ejbPostCreate()在容器中是在ejbCreate()调用之后由容器自动调用 public void ejbPostCreate(String user,int age,String email) throws CreateException /通过主键值查找记录或数据(这个方法和create()一样,对于实体Bean来说是必需的)/(2)用户记录的获取 public String ejbFindByPrim

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论