167、EJB 是基于哪些技术实现的?并说出 SessionBean 和 EntityBean 的区别,
StatefulBean 和 StatelessBean 的区别。【中等难度】
答:EJB 包括 Session Bean、Entity Bean、Message Driven Bean,基于 JNDI、
RMI、JTA 等技术实现。SessionBean 在 J2EE 应用程序中被用来完成一些服务器端的业务操作,例如访问数据库、调用其他 EJB 组件。EntityBean 被用来代表应用系统中用到的数据
对于客户机,SessionBean 是一种非持久性对象,它实现某些在服务器上运行的业务逻辑。
对于客户机,EntityBean 是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。
Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless SessionBean ,这两种的 SessionBean 都可以将系统逻辑放在 method 之中执行,不同的是 StatefulSessionBean 可以记录呼叫者的状态,因此通常来说, 一个使用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使用者状态,也就是说当使用者呼叫 StatelessSessionBean 的时候,EJBContainer 并不会找寻特定的 Stateless Session Bean 的实体来执行这个 method。换言之,很可能数个使用者在执行某个 Stateless Session Bean 的 methods 时,会是同一个Bean 的 Instance 在执行。从内存方面来看, Stateful Session Bean 与Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
168、bean 实例的生命周期?【中等难度】
答:对于 Stateless Session Bean、Entity Bean、Message Driven Bean 一般存在缓冲池管理,而对于 Entity Bean 和 Statefull Session Bean 存在 Cache 管理,通常包含创建实例,设置上下文、创建 EJB Object(create)、业务方法调用、remove 等过程,对于存在缓冲池管理的 Bean,在 create 之后实例并不从内存清除,而是采用缓冲池调度机制不断重用实例,而对于存在 Cache 管理的Bean 则通过激活和去激活机制保持 Bean 的状态并限制内存中实例数量。
169、EJB 的激活机制?【中等难度】
答:以 Stateful Session Bean 为例:其 Cache 大小决定了内存中可以同时存在的 Bean 实例的数量,根据 MRU 或 NRU 算法,实例在激活和去激活状态之间迁移,激活机制是当客户端调用某个 EJB 实例业务方法时,如果对应 EJB Object 发现自己没有绑定对应的 Bean 实例则从其去激活 Bean 存储中(通过序列化机制存储实例)回复(激活)此实例。状态变迁前会调用对应的 ejbActive 和
ejbPassivate 方法。
170、EJB 包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?【中等难度】
答:SessionBean:StatelessSessionBean 的生命周期是由容器决定的,当客户机发出请求要建立一个 Bean 的实例时,EJB 容器不一定要创建一个新的 Bean 的实例供客户机调用,而是随便找一个现有的实例提供给客户机。当客户机第一次调用一个 Stateful Session Bean 时,容器必须立即在服务器中创建一个新的 Bean 实例,并关联到客户机上,以后此客户机调用 StatefulSessionBean 的方法时容器会把调用分派到与此客户机相关联的 Bean 实例。EntityBean:Entity Beans 能存活相对较长的时间,并且状态是持续的。只要数据库中的数据存在, Entitybeans 就一直存活。而不是按照应用程序或者服务进程来说的。即使 EJB 容器崩溃了,Entity beans 也是存活的。Entity Beans 生命周期能够被容器或者 Beans 自己管理。EJB 通过以下技术管理事务:对象管理组织(OMG)的对象实务服务(OTS),Sun Microsystems 的 Transaction Service(JTS)、Java Transaction API(JTA),开发组(X/Open)的 XA 接口。
171、EJB 的事务是如何实现的?何时进行回滚;【中等难度】
答:是通过使用容器或 Bean 自身管理事务的;当产生一个系统异常时容器就自动回滚事务。
172、EJB 容器提供的服务?【中等难度】
答:主要提供生命周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务。
173、EJB 需直接实现它的业务接口或 Home 接口吗?请简述理由。【中等难度】答:远程接口和 Home 接口不需要直接实现,他们的实现代码是由服务器产生的, 程序运行中对应实现类会作为对应接口类型的实例被使用。
174、请对以下在 J2EE 中常用的名词进行解释(或简单描述) 【中等难度】
答:web 容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET 直接跟容器中的环境变量接口交互,不必关注其它系统问题。主要由 WEB 服务器来实现。
例如:TOMCAT,WEBLOGIC,WEBSPHERE 等。该容器提供的接口严格遵守 J2EE 规范中的 WEB APPLICATION 标准。我们把遵守以上标准的 WEB 服务器就叫做 J2EE 中的 WEB 容器;
EJB 容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件 EJB 各种管理功能。只要满足 J2EE 规范的 EJB 放入该容器, 马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理;
JNDI:(Java Naming & Directory Interface)JAVA 命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能;
JMS:(Java Message Service)JAVA 消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播;
JTA:(JavaTransactionAPI)JAVA 事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可;
JAF:(Java Action FrameWork)JAVA 安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略;
RMI/IIOP:(Remote Method Invocation /internet 对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI 是 JAVA 特有的。
175、J2EE 是什么?【中等难度】
答:J2EE 是 Sun 公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterprieseapplicationmodel).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietntier)组件,web 层和组件,Business 层和组件,企业信息系统(EIS)层。
176、J2EE 是技术还是平台还是框架?【中等难度】
答:J2EE 本身是一个标准,一个为企业分布式应用的开发提供的标准平台;
J2EE 也是一个框架,包括 JDBC、JNDI、RMI、JMS、EJB、JTA 等技术。
177、请写出 spring 中 I0C 的三种实现机制。【中等难度】
答:三种机制为:通过 setter 方法注入、通过构造方法注入和接口注入。
178、写出你熟悉的开源框架以及各自的作用。【中等难度】
答:框架:hibernate、spring、struts;
Hibernate 主要用于数据持久化;
Spring 的控制反转能起到解耦合的作用;
Struts 主要用于流程控制。
179、EJB 规范规定 EJB 中禁止的操作有哪些?【较难】
答:1)不能操作线程和线程 API(线程 API 指非线程对象的方法,如 notify,wait 等);
2)不能操作awt
3)不能实现服务器功能;
4)不能对静态属性存取;
5)不能使用 IO 操作直接存取文件系统;
6)不能加载本地库;
7)不能将 this 作为变量和返回;
8)不能循环调用。
八、数据结构、算法及计算机基础部分:(共 8 题:基础 6 道,中等难度 1 道,较难 1 道)
180、一个 byte 几个单位?【基础】
答:8bit。
181、常用 UNIX 命令(Linux 的常用命令)(至少 10 个)【基础】
答:ls pwd mkdir rm cp mv cd ps ftp telnet ping env more echo
182、后序遍历下列二叉树,访问结点的顺序是?【基础】
183、排序都有哪几种方法?请列举。用 JAVA 实现一个快速排序。【基础】
答:排序的方法有:
插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序);
快速排序的伪代码:
//使用快速排序方法对
a[ 0 :n- 1 ]排序从 a[ 0 :n- 1 ]中选择一个元素作为 middle,该元素为支点;把余下的元素分割为两段 left 和 right,使得 left 中的元素都小于等于支点, 而 right 中的元素都大于等于支点;递归地使用快速排序方法对 left 进行排序;
递归地使用快速排序方法对 right 进行排序; 所得结果为 left + middle + right。
184、写一种常见排序。【基础】
答:C++中冒泡排序:
void swap( int& a, int& b ){
int c=a; a = b; b = c;}
void bubble( int* p, int len ){
bool bSwapped;
do {bSwapped = false;
for( int i=1; i<len; i++ ){
if( p[i-1]>p[i] ){
swap( p[i-1], p[i] );
bSwapped = true;}}}
while( bSwapped );}
185、写一个一小段程序检查数字是否为质数;以上的程序你采用的哪种语言写的?采用该种语言的理由是什么?【基础】
#include <math.h>
bool prime( int n ){
if(n<=0) exit(0);
for( int i=2; i<=n; i++ )
for( int j=2; j<=sqrt(i); j++)
if((n%j==0) && (j!=n))
return false;
return true;}
采用 C++,因为其运行效率高。
186、编程题:设有n个人依围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为 1,2,…,n,打印出出列的顺序; 要求用 java 实现。【中等难度】
答:代如下: package test;
public class CountGame {
private static boolean same(int[] p,int l,int n){
for(int i=0;i<l;i++){
if(p[i]==n){
return true;
}
}
return false;
}
public static void play(int playerNum, int step){
int[] p=new int[playerNum];
int counter = 1; while(true){
if(counter > playerNum*step){ break;}
for(int i=1;i<playerNum+1;i++){
while(true){
if(same(p,playerNum,i)==false)
break;
else i=i+1;}
if(i > playerNum)break;
if(counter%step==0){
System.out.print(i + " ");
p[counter/step-1]=i;}
counter+=1;
}}
System.out.println();
}
public static void main(String[] args)
{ play(10, 7);}}
187、写一个方法 1000 的阶乘。【较难】
答:C++的代码实现如下:
#include <iostream>
#include <iomanip>
#include <vector> using namespace std;
class longint {
private:vector<int> iv;
public:longint(void) { iv.push_back(1); }
longint& multiply(const int &);
friend ostream& operator<<(ostream &, const longint &);};
ostream& operator<<(ostream &os, const longint &v)
{ vector<int>::const_reverse_iterator iv_iter = v.iv.rbegin();
os << *iv_iter++;
for ( ; iv_iter < v.iv.rend(); ++iv_iter) {
os << setfill('0') << setw(4) << *iv_iter;
}return os;}
longint& longint::multiply(const int &rv)
{ vector<int>::iterator iv_iter = iv.begin();
int overflow = 0, product = 0;
for ( ;
iv_iter < iv.end();
++iv_iter) { product = (*iv_iter) * rv;
product += overflow; overflow = 0;
if (product > 10000) {
overflow = product / 10000;
product -= overflow * 10000;
}
iv_iter = product;
}if (0 != overflow)
{ iv.push_back(overflow);}
return *this;}
int main(int argc, char **argv)
{ longint result;
int l = 0; if(argc==1){
cout << "like: multiply 1000" << endl; exit(0);
}
sscanf(argv[1], "%d", &l);
for (int i = 2; i <= l; ++i) { result.multiply(i);
}
cout << result << endl; return 0;
}
九、C++部分:(共 14 题:基础 10 道,中等 1 道,较难 3 道)
188、以下三条输出语句分别输出什么?【基础】
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char* str5 = "abc";
const char* str6 = "abc";
cout << boolalpha << (str1==str2) << endl; //输出什么?
cout << boolalpha << (str3==str4) << endl; //输出什么?
cout << boolalpha << (str5==str6) << endl; //输出什么?
答:输出为:false、false、true。
189、以下反向遍历 array 数组的方法有什么错误?【基础】
vector<int> array;
array.push_back(1);
array.push_back(2);
array.push_back(3);
//反向遍历 array 数组:
for(vector<int>::size_type i=array.size()-1;
i>=0; --i){
cout << array[i] << endl;
}
答:for 循环中的变量 i 的类型不应定义为 vector<int>::size_type,
因为该类型为无符号数值类型,故循环条件将恒成立,为死循环,应将其类型定义为有符号的int类型。
190、以下代码有什么问题?【基础】
cout << (true ? 1 : "1") << endl; 答: 运算符中两个可选值的类型不同。
191、以下代码有什么问题?【基础】
typedef vector<int> IntArray;
IntArray array; array.push_back(1);
array.push_back(2);
array.push_back(2);
array.push_back(3);
//删除 array 数组中所有的 2
for(IntArray::iterator itor=array.begin();
itor!=array.end();
++itor){if(2==*itor)
{ array.erase(itor);}
}
答:for 循环中的 if 语句后的 array.erase(itor)语句,它将迭代器 itor 所指向的元素删除后会自动下移一位,故应在其后加上语句:itor--;
192、以下代码中的两个 sizeof 用法有问题吗?【基础】
void upperCase(char str[]){ //将 str 中的小写字母转换成大写字母
for(int i=0; i<sizeof(str)/sizeof(str[0]);
++i){
if('a'<=str[i] && str[i]<='z')
str[i] -= ('a'-'A');}
}
int main(){
char str[] = "aBcDe";
cout << "str 字符串长度为:" << sizeof(str)/sizeof(str[0]);
cout << endl;
upperCase(str);
cout << str << endl;
return 0;
}
答:在 upperCase 方法中,for 循环的 sizeof(str)的值将总是4,所以该方法只能将参数中的字符串的前四个字符转换成大写字母。
193、以下代码能够编译通过吗?为什么?【基础】
unsigned int const size1 = 2;
char str1[size1];
unsigned int temp = 0;
cin >> temp;
unsigned int const size2 = temp; char str2[size2];
答:能
194、以下代码有什么问题?【基础】
struct Test{
Test(int){}
Test(){}
void fun(){}
};
void main(void){ Test a(1);
a.fun();
Test b();
b.fun();
}
答:main 函数的返回类型应为 int;不能对 b 调用 fun()方法。
195、以下代码中的输出语句输出 0 吗?为什么?【基础】
struct CLS{
int m_i;
CLS(int i):m_i(i){ }
CLS(){ CLS(0);}
};
int main(){
CLS obj;
cout <<obj.m_i << endl;
}
答:输出不是 0;
196、C++中的空类,默认产生哪些类成员函数?【基础】
答:空类中默认包含的成员函数如下:
class Empty{ public:
Empty(); //缺省构造函数
Empty( const Empty& ); //拷贝构造函数
~Empty(); //析构函数
Empty& operator=( const Empty& ); //赋值运算符
Empty* operator&(); //取址运算符
const Empty* operator&() const; //取址运算符 const
};
197、统计一篇文章中单词个数。【基础】
答:代码如下:
include<iostream>
#include<fstream> using namespace std;
int main(){
ifstream fin("t.txt");
if(!fin){cout<<"can't open file"<<endl; return -1;
}
int count = 0;
charbuf[256];
memset(buf, 0, 256);
while(1){
fin2>>buf;
if(fin2.eof()) break;
count++;
}
cout<<"The number of the words is : "<<count<<endl; fin2.close();
return 0;}
198、写一个函数,完成内存之间的拷贝。【中等难度】
答:代码如下:
void* mymemcpy(void* dest, const void* src, size_t count){
char* pdest = static_cast<char*>(dest);
const char* psrc = static_cast<const char*>(src);
if(pdest>psrc && pdest<psrc+count){ //能考虑到这种情况就行了
for(size_t i=count-1; i!=-1; --i){
pdest[i] = psrc[i];
}}else{
for(size_t i=0; i<count; ++i)
{ pdest[i] = psrc[i];}}
return dest;}
int main()
char str[] = "0123456789";
mymemcpy(str+1, str+0, 9);
cout << str << endl; //将输出"0012345678" return 0;
}
199、非 C++内建类型 A 和 B,在哪几种情况下 B 能隐式转化为 A?【较难】
答:a)class B : public A{……}//B 公有继承自 A,可以是间接继承b)
class B{operator A();}//B 实现了隐式转化为 A 的转化c)
class A{ A(const B&);}//A 实现了 non-explicit 的参数为 B 构造函数(可以有其他带带默认值的参数)d)
A& operator= (const A&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
200、以下代码有什么问题?【较难】
void char2Hex(char c){ //将字符以 16 进制显示
char ch = c/0x10 + '0';
if(ch>'9') ch += ('A'-'9'-1);
char cl = c%0x10 + '0';
if(cl>'9') cl +=('A'-'9'-1);
cout << ch << cl << ' ';
}
int main(){
char str[] = "I love 中 国 ";
for(size_t i=0; i<strlen(str); ++i)
char2Hex(str[i]);
cout << endl;return 0;
}
答:
201、以下两条输出语句分别输出什么?【较难】
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl;
cout << boolalpha << ((int)a==(int&)a) << endl; //输出什么
float b = 0.0f;
cout << (int)b << endl; cout << (int&)b << endl;
cout << boolalpha << ((int)b==(int&)b) << endl;
//输出什么答:第一处输出 false,第二处输出 true。
十、WebLogic 及其它:(共 13 题:附加部分,超出授课范围)
1、如何给 weblogic 指定大小的内存?
答:在启动 Weblogic 的脚本中(位于所在 Domian 对应服务器目录下的
startServerName),增加 set MEM_ARGS=-Xms32m -Xmx200m,可以调整最小内存为 32M,最大 200M。
2、如何设定的 weblogic 的热启动模式(开发模式)与产品发布模式?
答:可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一,或者修改服务的启动文件或者 commenv 文件,增加 set PRODUCTION_MODE=true。
3、如何启动时不需输入用户名与密码?
答:修改服务启动文件,增加 WLS_USER 和 WLS_PW 项;也可以在 boot.properties 文件中增加加密过的用户名和密码。
4、在 weblogic 管理控制台中对一个应用域(或者说是一个网站,Domain)进行jms 及 ejb 或连接池等相关信息进行配置后,实际保存在什么文件中?
答:保存在此 Domain 的 config.xml 文件中,它是服务器的核心配置文件。
5、说说 weblogic 中一个 Domain 的缺省目录结构?比如要将一个简单的
helloWorld.jsp 放入何目录下,然后在浏览器上打入 http://主机:端口号
//helloword.jsp 就可以看到运行结果了? 又比如这其中用到了一个自己写的
javaBean 该如何办?
答:Domain 目录\服务器目录\applications,将应用目录放在此目录下将可以作为应用访问,如果是 Web 应用,应用目录需要满足 Web 应用目录要求,jsp 文件可以直接放在应用目录中,Javabean 需要放在应用目录的 WEB-INF 目录的
classes目录中,设置服务器的缺省应用将可以实现在浏览器上无需输入应用名。
6、在 weblogic 中发布 ejb 需涉及到哪些配置文件?
答:不同类型的 EJB 涉及的配置文件不同,都涉及到的配置文件包括ejb-jar.xml,weblogic-ejb-jar.xml,CMP 实体 Bean 一般还需要weblogic-cmp-rdbms-jar.xml
7、如何在 weblogic 中进行 ssl 配置与客户端的认证配置或说说 j2ee(标准)进行 ssl 的配置?
答:缺省安装中使用DemoIdentity.jks和DemoTrust.jksKeyStore实现SSL, 需要配置服务器使用EnableSSL,配置其端口,在产品模式下需要从CA获取私有密钥和数字证书,创建identity和trustkeystore,装载获得的密钥和数字证书。可以配置此SSL连接是单向还是双向的。
8、如何查看在 weblogic 中已经发布的 EJB?
答:可以使用管理控制台,在它的 Deployment 中可以查看所有已发布的 EJB。
9、CORBA 是什么?用途是什么?
答:CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。其目的为:用不同的程序设计语言书写在不同的进程中运行,为不同的操作系统开发。
10、在 weblogic 中开发消息 Bean 时的 persistent 与 non-persisten 的差别? 答:persistent 方式的 MDB 可以保证消息传递的可靠性,也就是如果 EJB 容器出现问题而 JMS 服务器依然会将消息在此 MDB 可用的时候发送过来,而 non-
persistent 方式的消息将被丢弃。
11、LINUX 下线程,GDI 类的解释?
答:LINUX 实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现;GDI 类为图像设备编程接口类库。
12、Jdo 是什么?
答:JDO 是 Java 对象持久化的新的规范,为 java data object 的简称,也是一个用于存取某种数据仓库中的对象的标准化 API。JDO 提供了透明的对象存储, 因此对开发人员来说,存储数据对象完全不需要额外的代码(如 JDBC API 的使用)。这些繁琐的例行工作已经转移到 JDO 产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO 很灵活,因为它可以在任何数据底层上运行。JDBC 只是面向关系数据库(RDBMS)JDO 更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML 以及对象数据库(ODBMS) 等等,使得应用可移植性更强。
13、WEB SERVICE 名词解释;JAXP、JAXM 的解释;SOAP、UDDI,WSDL 解释?
答:Web Service 是基于网络的、分布式的模块化组件,它执行特定的任务,遵 守具体的技术规范,这些规范使得 WebService 能与其他兼容的组件进行互操作; JAXP(Java API for XML Parsing)定义了在 Java 中使用 DOM, SAX, XSLT的通用的接口,这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码;
JAXM(Java API for XML Messaging)是为 SOAP 通信提供访问方法和传输机制的 API;
WSDL 是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务);
SOAP 即简单对象访问协议(Simple Object Access Protocol),它是用于交换 XML 编码信息的轻量级协议;
UDDI 的目的是为电子商务建立标准;UDDI 是一套基于 Web 的、分布式的、为 WebService 提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的 WebService 注册,以使别的企业能够发现的访问协议的实现标准。