Java面試4

14.航空網(wǎng)的幾個(gè)航班查詢題:

表結(jié)構(gòu)如下:

flight{flightID,StartCityID ,endCityID,StartTime}

city{cityID, CityName)

實(shí)驗(yàn)環(huán)境:

create table city(cityID int auto_increment primary key,cityNamevarchar(20));

create table flight (flightID int auto_increment primary key,

StartCityID intreferences city(cityID),

endCityID int references city(cityID),

StartTimetimestamp);

//航班本來(lái)應(yīng)該沒(méi)有日期部分才好,但是下面的題目當(dāng)中涉及到了日期

insert into city values(null,'北京'),(null,'上海'),(null,'廣州');

insert into flight values

(null,1,2,'9:37:23'),(null,1,3,'9:37:23'),(null,1,2,'10:37:23'),(null,2,3,'10:37:23');

1、查詢起飛城市是北京的所有航班,按到達(dá)城市的名字排序

參與運(yùn)算的列是我起碼能夠顯示出來(lái)的那些列,但最終我不一定把它們顯示出來(lái)。各個(gè)表組

合出來(lái)的中間結(jié)果字段中必須包含所有運(yùn)算的字段。

select * from flight f,city c

where f.endcityid =c.cityid and startcityid =

(select c1.cityidfrom city c1 where c1.cityname = "北京")

order by c.citynameasc;

mysql> select flight.flightid,'北京' startcity, e.cityname from flight,city e wh

ere flight.endcityid=e.cityid and flight.startcityid=(selectcityid from city wh

ere cityname='北京');

mysql> select flight.flightid,s.cityname,e.cityname fromflight,city s,city e wh

ere flight.startcityid=s.cityid and s.cityname='北京' andflight.endCityId=e.cit

yID order by e.cityName desc;

2、查詢北京到上海的所有航班紀(jì)錄(起飛城市,到達(dá)城市,起飛時(shí)間,航班號(hào))

select c1.CityName,c2.CityName,f.StartTime,f.flightID

from city c1,city c2,flight f

where f.StartCityID=c1.cityID

and f.endCityID=c2.cityID

and c1.cityName='北京'

and c2.cityName='上海'

3、查詢具體某一天(2005-5-8)的北京到上海的的航班次數(shù)

select count(*) from

(select c1.CityName,c2.CityName,f.StartTime,f.flightID

from city c1,city c2,flight f

where f.StartCityID=c1.cityID

and f.endCityID=c2.cityID

and c1.cityName='北京'

and c2.cityName='上海'

and 查幫助獲得的某個(gè)日期處理函數(shù)(startTime) like '2005-5-8%'

mysql 中提取日期部分進(jìn)行比較的示例代碼如下:

select * from flight wheredate_format(starttime,'%Y-%m-%d')='1998-01-02'

15.查出比經(jīng)理薪水還高的員工信息:

Drop table if not exists employees;

create table employees(id int primary key auto_increment,namevarchar(50)

,salary int,managerid intreferences employees(id));

insert into employees values (null,' lhm',10000,null), (null,'zxx',15000,1

),(null,'flx',9000,1),(null,'tg',10000,2),(null,'wzg',10000,3);

Wzg 大于 flx,lhm 大于 zxx

解題思路:

根據(jù) sql 語(yǔ)句的查詢特點(diǎn),是逐行進(jìn)行運(yùn)算,不可能兩行同時(shí)參與運(yùn)算。

涉及了員工薪水和經(jīng)理薪水,所有,一行記錄要同時(shí)包含兩個(gè)薪水,所有想到要把這個(gè)表自

關(guān)聯(lián)組合一下。

首先要組合出一個(gè)包含有各個(gè)員工及該員工的經(jīng)理信息的長(zhǎng)記錄,譬如,左半部分是

員工,右半部分是經(jīng)理。而迪卡爾積會(huì)組合出很多垃圾信息,先去除這些垃圾信息。

select e.* from employees e,employees m where e.managerid=m.idand e.sala

ry>m.salary;

16、求出小于 45 歲的各個(gè)老師所帶的大于 12 歲的學(xué)生人數(shù)

數(shù)據(jù)庫(kù)中有3個(gè)表 teacher 表,student 表,tea_stu 關(guān)系表。

teacher 表 teaID name age

student 表 stuID name age

teacher_student 表 teaID stuID

要求用一條 sql 查詢出這樣的結(jié)果

1.顯示的字段要有老師 name, age 每個(gè)老師所帶的學(xué)生人數(shù)

2 只列出老師 age 為40以下,學(xué)生 age 為12以上的記錄

預(yù)備知識(shí):

1.sql 語(yǔ)句是對(duì)每一條記錄依次處理,條件為真則執(zhí)行動(dòng)作

(select,insert,delete,update)

2.只要是迪卡爾積,就會(huì)產(chǎn)生“垃圾”信息,所以,只要迪卡爾積了,我們首先就要

想到清除“垃圾”信息

實(shí)驗(yàn)準(zhǔn)備:

drop table if exists tea_stu;

drop table if exists teacher;

drop table if exists student;

create table teacher(teaID int primarykey,name varchar(50),age int);

create table student(stuID int primarykey,name varchar(50),age int);

create table tea_stu(teaID int referencesteacher(teaID),stuID int references

student(stuID));

insertinto teacher values(1,'zxx',45), (2,'lhm',25) , (3,'wzg',26) , (4,'tg',27);

insertinto student values(1,'wy',11), (2,'dh',25) , (3,'ysq',26) , (4,'mxc',27);

insertinto tea_stu values(1,1), (1,2), (1,3);

insertinto tea_stu values(2,2), (2,3), (2,4);

insert into tea_stu values(3,3), (3,4), (3,1);

insertinto tea_stu values(4,4), (4,1), (4,2) , (4,3);

結(jié)果:2à3,3à2,4à3

解題思路:(真實(shí)面試答題時(shí),也要寫出每個(gè)分析步驟,如果紙張不夠,就找別人要)

1要會(huì)統(tǒng)計(jì)分組信息,統(tǒng)計(jì)信息放在中間表中:

selectteaid,count(*) from tea_stu group by teaid;

2接著其實(shí)應(yīng)該是篩除掉小于12歲的學(xué)生,然后再進(jìn)行統(tǒng)計(jì),中間表必須與 student 關(guān)聯(lián)才

能得到12歲以下學(xué)生和把該學(xué)生記錄從中間表中剔除,代碼是:

selecttea_stu.teaid,count(*) total from student,tea_stu

wherestudent.stuid=tea_stu.stuid and student.age>12 group by tea_stu.teaid

3.接著把上面的結(jié)果做成虛表與 teacher 進(jìn)行關(guān)聯(lián),并篩除大于45的老師

selectteacher.teaid,teacher.name,total from teacher ,(select tea_stu.tea

id,count(*)total from student,tea_stu where student.stuid=tea_stu.stuid and stu

dent.age>12group by tea_stu.teaid) as tea_stu2where teacher.teaid=tea_stu2.tea

idand teacher.age<45;

17.求出發(fā)帖最多的人:

select authorid,count(*) total from articles

group by authorid

having total=

(select max(total2) from(select count(*) total2 from articles group by authorid) as t);

select t.authorid,max(t.total) from

(select authorid,count(*) total from articles)as t

這條語(yǔ)句不行,因?yàn)?max 只有一列,不能與其他列混淆。

select authorid,count(*) total from articles

group by authorid having total=max(total)也不行。

18、一個(gè)用戶表中有一個(gè)積分字段,假如數(shù)據(jù)庫(kù)中有 100 多萬(wàn)個(gè)用戶,若要在

每年第一天凌晨將積分清零,你將考慮什么,你將想什么辦法解決?

alter table drop column score;

alter table add colunm score int;

可能會(huì)很快,但是需要試驗(yàn),試驗(yàn)不能拿真實(shí)的環(huán)境來(lái)操刀,并且要注意,

這樣的操作時(shí)無(wú)法回滾的,在我的印象中,只有 inert update delete 等 DML 語(yǔ)句才能回滾,

對(duì)于 create table,drop table ,alter table 等 DDL 語(yǔ)句是不能回滾。

解決方案一,update user set score=0;

解決方案二,假設(shè)上面的代碼要執(zhí)行好長(zhǎng)時(shí)間,超出我們的容忍范圍,那我就 alter table user

drop columnscore;alter table user add column score int。

下面代碼實(shí)現(xiàn)每年的那個(gè)凌晨時(shí)刻進(jìn)行清零。

Runnable runnable =

new Runnable(){

public voidrun(){

clearDb();

schedule(this,newDate(new Date().getYear()+1,0,0));

}

};

schedule(runnable,

new Date(newDate().getYear()+1,0,1));

19、一個(gè)用戶具有多個(gè)角色,請(qǐng)查詢出該表中具有該用戶的所有角色的其他用

戶。

select count(*) as num,tb.id

from

tb,

(select role from tbwhere id=xxx) as t1

where

tb.role = t1.role andtb.id != t1.id

group by tb.id

having

num = select count(role)from tb where id=xxx;

20. xxx 公司的 sql 面試

Table EMPLOYEES Structure:

EMPLOYEE_ID NUMBER Primary Key,

FIRST_NAME VARCHAR2(25),

LAST_NAME VARCHAR2(25),

Salary number(8,2),

HiredDate DATE,

Departmentid number(2)

TableDepartments Structure:

Departmentid number(2) Primary Key,

DepartmentName VARCHAR2(25).

(2)基于上述 EMPLOYEES 表寫出查詢:寫出雇用日期在今年的,或者工資在[1000,2000]

之間的,或者員工姓名(last_name)以’Obama’打頭的所有員工,列出這些員工的全部個(gè)

人信息。(4分)

select* from employees

whereYear(hiredDate) = Year(date())

or (salary between 1000 and 200)

or left(last_name,3)='abc';

(3) 基于上述 EMPLOYEES 表寫出查詢:查出部門平均工資大于1800元的部門的所有員工,

列出這些員工的全部個(gè)人信息。(4分)

mysql>select id,name,salary,deptid did from employee1 where (select avg(salary)

from employee1 where deptid = did) > 1800;

(4) 基于上述 EMPLOYEES 表寫出查詢:查出個(gè)人工資高于其所在部門平均工資的員工,

列出這些員工的全部個(gè)人信息及該員工工資高出部門平均工資百分比。(5分)

selectemployee1.*,(employee1.salary-t.avgSalary)*100/employee1.salary

fromemployee1,

(select deptid,avg(salary) avgSalary fromemployee1 group by deptid) as t

whereemployee1.deptid = t.deptid and employee1.salary>t.avgSalary;

21、注冊(cè) Jdbc 驅(qū)動(dòng)程序的三種方式

22、用 JDBC 如何調(diào)用存儲(chǔ)過(guò)程

代碼如下:

package com.huawei.interview.lym;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Types;

publicclass JdbcTest {

/**

* @paramargs

*/

public static voidmain(String[] args) {

// TODO Auto-generated method stub

Connection cn = null;

CallableStatement cstmt =null;

try {

//這里最好不要這么干,因?yàn)轵?qū)動(dòng)名寫死在程序中了

Class.forName("com.mysql.jdbc.Driver");

//實(shí)際項(xiàng)目中,這里應(yīng)用 DataSource 數(shù)據(jù),如果用框架,

//這個(gè)數(shù)據(jù)源不需要我們編碼創(chuàng)建,我們只需 Datasource ds =context.lookup()

//cn = ds.getConnection();

cn = DriverManager.getConnection("jdbc:mysql:///test","root","root");

cstmt = cn.prepareCall("{callinsert_Student(?,?,?)}");

cstmt.registerOutParameter(3,Types.INTEGER);

cstmt.setString(1,"wangwu");

cstmt.setInt(2, 25);

cstmt.execute();

//get 第幾個(gè),不同的數(shù)據(jù)庫(kù)不一樣,建議不寫

System.out.println(cstmt.getString(3));

} catch (Exception e) {

// TODO Auto-generated catchblock

e.printStackTrace();

}

finally

{

/*try{cstmt.close();}catch(Exceptione){}

try{cn.close();}catch(Exceptione){}*/

try {

if(cstmt !=null)

cstmt.close();

if(cn !=null)

cn.close();

} catch (SQLException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

}

}

}

23、JDBC 中的 PreparedStatement 相比 Statement 的好處

答:一個(gè) sql 命令發(fā)給服務(wù)器去執(zhí)行的步驟為:語(yǔ)法檢查,語(yǔ)義分析,編譯成內(nèi)部指令,緩

存指令,執(zhí)行指令等過(guò)程。

select * from student where id =3----緩存--àxxxxx 二進(jìn)制命令

select * from student where id =3----直接取-àxxxxx 二進(jìn)制命令

select * from student where id =4--- -à 會(huì)怎么干?

如果當(dāng)初是 select * from student where id =?--- -à 又會(huì)怎么干?

上面說(shuō)的是性能提高

可以防止 sql 注入。

24. 寫一個(gè)用 jdbc 連接并訪問(wèn) oracle 數(shù)據(jù)的程序代碼

25、Class.forName 的作用?為什么要用?

答:按參數(shù)中指定的字符串形式的類名去搜索并加載相應(yīng)的類,如果該類字節(jié)碼已經(jīng)被加載

過(guò),則返回代表該字節(jié)碼的 Class 實(shí)例對(duì)象,否則,按類加載器的委托機(jī)制去搜索和加載該

類,如果所有的類加載器都無(wú)法加載到該類,則拋出 ClassNotFoundException。加載完這

個(gè) Class 字節(jié)碼后,接著就可以使用 Class 字節(jié)碼的 newInstance 方法去創(chuàng)建該類的實(shí)例

對(duì)象了。

有時(shí)候,我們程序中所有使用的具體類名在設(shè)計(jì)時(shí)(即開(kāi)發(fā)時(shí))無(wú)法確定,只有程序運(yùn)行時(shí)

才能確定,這時(shí)候就需要使用 Class.forName 去動(dòng)態(tài)加載該類,這個(gè)類名通常是在配置文

件中配置的,例如,spring 的 ioc 中每次依賴注入的具體類就是這樣配置的,jdbc 的驅(qū)動(dòng)類

名通常也是通過(guò)配置文件來(lái)配置的,以便在產(chǎn)品交付使用后不用修改源程序就可以更換驅(qū)動(dòng)

類名。

26、大數(shù)據(jù)量下的分頁(yè)解決方法。

答:最好的辦法是利用 sql 語(yǔ)句進(jìn)行分頁(yè),這樣每次查詢出的結(jié)果集中就只包含某頁(yè)的數(shù)據(jù)

內(nèi)容。再 sql 語(yǔ)句無(wú)法實(shí)現(xiàn)分頁(yè)的情況下,可以考慮對(duì)大的結(jié)果集通過(guò)游標(biāo)定位方式來(lái)獲取

某頁(yè)的數(shù)據(jù)。

sql 語(yǔ)句分頁(yè),不同的數(shù)據(jù)庫(kù)下的分頁(yè)方案各不一樣,下面是主流的三種數(shù)據(jù)庫(kù)的分頁(yè) sql:

sql server:

String sql =

"select top" + pageSize + " * from students where id not in" +

"(select top "+ pageSize * (pageNumber-1) + " id from students order by id)" +

"order by id";

mysql:

String sql =

"select * fromstudents order by id limit " + pageSize*(pageNumber-1) + ","

+pageSize;

oracle:

String sql =

"select * from " +

(select *,rownum rid from (select * fromstudents order by postime desc) where

rid<=" + pagesize*pagenumber +") as t" +

"where t>" +pageSize*(pageNumber-1);

27、用 JDBC 查詢學(xué)生成績(jī)單,把主要代碼寫出來(lái)(考試概率極大).

Connection cn = null;

PreparedStatement pstmt =null;

Resultset rs = null;

try

{

Class.forname(driveClassName);

cn = DriverManager.getConnection(url,username,password);

pstmt =cn.prepareStatement(“select score.* fromscore ,student “ +

“wherescore.stuId = student.id and student.name = ?”);

pstmt.setString(1,studentName);

Resultset rs =pstmt.executeQuery();

while(rs.next())

{

system.out.println(rs.getInt(“subject”) + “ ” +?

rs.getFloat(“score”) );

}

}catch(Exception e){e.printStackTrace();}

finally

{

if(rs != null) try{rs.close() }catch(exception e){}

if(pstmt != null)try{pstmt.close()}catch(exception e){}

if(cn != null) try{cn.close() }catch(exception e){}

}

28、這段代碼有什么不足之處?

try {

Connection conn = ...;

Statement stmt = ...;

ResultSet rs =stmt.executeQuery("select * from table1");

while(rs.next()) {

}

} catch(Exception ex) {

}

答:沒(méi)有 finally 語(yǔ)句來(lái)關(guān)閉各個(gè)對(duì)象,另外,使用 finally 之后,要把變量的定義放在 try 語(yǔ)

句塊的外面,以便在 try 語(yǔ)句塊之外的 finally 塊中仍可以訪問(wèn)這些變量。

29、說(shuō)出數(shù)據(jù)連接池的工作機(jī)制是什么?

J2EE 服務(wù)器啟動(dòng)時(shí)會(huì)建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻舳?/p>

程序需要連接時(shí),池驅(qū)動(dòng)程序會(huì)返回一個(gè)未使用的池連接并將其表記為忙。如果當(dāng)前沒(méi)有空

閑連接,池驅(qū)動(dòng)程序就新建一定數(shù)量的連接,新建連接的數(shù)量有配置參數(shù)決定。當(dāng)使用的池

連接調(diào)用完成后,池驅(qū)動(dòng)程序?qū)⒋诉B接表記為空閑,其他調(diào)用就可以使用這個(gè)連接。

實(shí)現(xiàn)方式,返回的 Connection 是原始 Connection 的代理,代理 Connection 的 close 方法

不是真正關(guān)連接,而是把它代理的 Connection 對(duì)象還回到連接池中。

30、為什么要用 ORM? 和 JDBC 有何不一樣?

orm 是一種思想,就是把 object 轉(zhuǎn)變成數(shù)據(jù)庫(kù)中的記錄,或者把數(shù)據(jù)庫(kù)中的記錄轉(zhuǎn)變成

objecdt,我們可以用 jdbc 來(lái)實(shí)現(xiàn)這種思想,其實(shí),如果我們的項(xiàng)目是嚴(yán)格按照 oop 方式編

寫的話,我們的 jdbc 程序不管是有意還是無(wú)意,就已經(jīng)在實(shí)現(xiàn) orm 的工作了。

現(xiàn)在有許多 orm 工具,它們底層調(diào)用 jdbc 來(lái)實(shí)現(xiàn)了 orm 工作,我們直接使用這些工具,就

省去了直接使用 jdbc 的繁瑣細(xì)節(jié),提高了開(kāi)發(fā)效率,現(xiàn)在用的較多的 orm 工具是 hibernate。

也聽(tīng)說(shuō)一些其他 orm 工具,如 toplink,ojb 等。

六. XML 部分

1、xml 有哪些解析技術(shù)?區(qū)別是什么?

答:有 DOM,SAX,STAX 等

DOM:處理大型文件時(shí)其性能下降的非常厲害。這個(gè)問(wèn)題是由 DOM 的樹(shù)結(jié)構(gòu)所造成的,這

種結(jié)構(gòu)占用的內(nèi)存較多,而且 DOM 必須在解析文件之前把整個(gè)文檔裝入內(nèi)存,適合對(duì) XML

的隨機(jī)訪問(wèn) SAX:不現(xiàn)于 DOM,SAX 是事件驅(qū)動(dòng)型的 XML 解析方式。它順序讀取 XML 文件,

不需要一次全部裝載整個(gè)文件。當(dāng)遇到像文件開(kāi)頭,文檔結(jié)束,或者標(biāo)簽開(kāi)頭與標(biāo)簽結(jié)束時(shí),

它會(huì)觸發(fā)一個(gè)事件,用戶通過(guò)在其回調(diào)事件中寫入處理代碼來(lái)處理 XML 文件,適合對(duì) XML

的順序訪問(wèn)

STAX:Streaming API for XML (StAX)

講解這些區(qū)別是不需要特別去比較,就像說(shuō)傳智播客與其他培訓(xùn)機(jī)構(gòu)的區(qū)別時(shí),我們只需說(shuō)

清楚傳智播客有什么特點(diǎn)和優(yōu)點(diǎn)就行了,這就已經(jīng)間接回答了彼此的區(qū)別。

2、你在項(xiàng)目中用到了 xml 技術(shù)的哪些方面?如何實(shí)現(xiàn)的?

答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺(tái)時(shí),將不能數(shù)據(jù)源的數(shù)據(jù)組裝成

XML 文件,然后將 XML 文件壓縮打包加密后通過(guò)網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后

再同 XML 文件中還原相關(guān)信息進(jìn)行處理。在做軟件配置時(shí),利用 XML 可以很方便的進(jìn)行,

軟件的各種配置參數(shù)都存貯在 XML 文件中。

3、用 jdom 解析 xml 文件時(shí)如何解決中文問(wèn)題?如何解析?

答:看如下代碼,用編碼方式加以解決

package test;

import java.io.*;

public class DOMTest

{

private String inFile = "c:\\people.xml"?

private String outFile = "c:\\people.xml"

public static void main(String args[])

{

new DOMTest();

}

public DOMTest()

{

try

{

javax.xml.parsers.DocumentBuilder builder =

javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();

org.w3c.dom.Document doc = builder.newDocument();

org.w3c.dom.Element root = doc.createElement("老師");

org.w3c.dom.Element wang = doc.createElement("王");

org.w3c.dom.Element liu = doc.createElement("劉");

wang.appendChild(doc.createTextNode("我是王老師"));

root.appendChild(wang);

doc.appendChild(root);

javax.xml.transform.Transformer transformer =

javax.xml.transform.TransformerFactory.newInstance().newTransformer();

transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,"gb2312");

transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT,"yes");

transformer.transform(newjavax.xml.transform.dom.DOMSource(doc),

new

javax.xml.transform.stream.StreamResult(outFile));

}

catch (Exception e)

{

System.out.println (e.getMessage());

}

}

}

4、編程用 JAVA 解析 XML 的方式.

答:用 SAX 方式解析 XML,XML 文件如下:

<?xml version=1.0 encoding=gb2312?>

<person>

<name>王小明</name>

<college>信息學(xué)院</college>

<telephone>6258113</telephone>

<notes>男,1955年生,博士,95年調(diào)入海南大學(xué)</notes>

</person>

事件回調(diào)類 SAXHandler.java

import java.io.*;

import java.util.Hashtable;

import org.xml.sax.*;

public class SAXHandler extends HandlerBase

{

private Hashtable table = new Hashtable();

private String currentElement = null;

private String currentValue = null;

public void setTable(Hashtable table)

{

this.table = table;

}

public Hashtable getTable()

{

return table;

}

public void startElement(String tag, AttributeList attrs)

throws SAXException

{

currentElement = tag;

}

public void characters(char[] ch, int start, int length)

throws SAXException

{

currentValue = new String(ch, start, length);

}

public void endElement(String name) throws SAXException

{

if (currentElement.equals(name))

table.put(currentElement, currentValue);

}

}

JSP 內(nèi)容顯示源碼,SaxXml.jsp:

<HTML>

<HEAD>

<TITLE>剖析 XML 文件 people.xml</TITLE>

</HEAD>

<BODY>

<%@ page errorPage=ErrPage.jsp

contentType=text/html;charset=GB2312 %>

<%@ page import=java.io.* %>

<%@ page import=java.util.Hashtable %>

<%@ page import=org.w3c.dom.* %>

<%@ page import=org.xml.sax.* %>

<%@ page import=javax.xml.parsers.SAXParserFactory %>

<%@ page import=javax.xml.parsers.SAXParser %>

<%@ page import=SAXHandler %>

<%

File file = new File(c:\people.xml);

FileReader reader = new FileReader(file);

Parser parser;

SAXParserFactory spf = SAXParserFactory.newInstance();

SAXParser sp = spf.newSAXParser();

SAXHandler handler = new SAXHandler();

sp.parse(new InputSource(reader), handler);

Hashtable hashTable = handler.getTable();

out.println(<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>);

out.println(<TR><TD>姓名</TD> + <TD> +

(String)hashTable.get(new String(name)) +</TD></TR>);

out.println(<TR><TD>學(xué)院</TD> + <TD> +

(String)hashTable.get(newString(college))+</TD></TR>);

out.println(<TR><TD>電話</TD> + <TD> +

(String)hashTable.get(new String(telephone)) +</TD></TR>);

out.println(<TR><TD>備注</TD> + <TD> +

(String)hashTable.get(new String(notes)) +</TD></TR>);

out.println(</TABLE>);

%>

</BODY>

</HTML>

5、XML 文檔定義有幾種形式?它們之間有何本質(zhì)區(qū)別?解析 XML 文檔有哪幾

種方式?

a: 兩種形式 dtd schema,b:本質(zhì)區(qū)別:schema 本身是 xml 的,可以被 XML 解析器解析(這

也是從 DTD 上發(fā)展 schema 的根本目的),c:有 DOM,SAX,STAX 等

DOM:處理大型文件時(shí)其性能下降的非常厲害。這個(gè)問(wèn)題是由 DOM 的樹(shù)結(jié)構(gòu)所造成的,

這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個(gè)文檔裝入內(nèi)存,適合對(duì)XML

的隨機(jī)訪問(wèn)

SAX:不現(xiàn)于 DOM,SAX 是事件驅(qū)動(dòng)型的 XML 解析方式。它順序讀取 XML 文件,不需要一

次全部裝載整個(gè)文件。當(dāng)遇到像文件開(kāi)頭,文檔結(jié)束,或者標(biāo)簽開(kāi)頭與標(biāo)簽結(jié)束時(shí),它會(huì)觸

發(fā)一個(gè)事件,用戶通過(guò)在其回調(diào)事件中寫入處理代碼來(lái)處理 XML 文件,適合對(duì) XML 的順

序訪問(wèn)

STAX:Streaming API forXML (StAX)

七.流行的框架與新技術(shù)

1、談?wù)勀銓?duì) Struts 的理解。

答:

1. struts 是一個(gè)按 MVC 模式設(shè)計(jì)的 Web 層框架,其實(shí)它就是一個(gè)大大的 servlet,這個(gè)

Servlet 名為 ActionServlet,或是 ActionServlet 的子類。我們可以在 web.xml 文件中將符

合某種特征的所有請(qǐng)求交給這個(gè) Servlet 處理,這個(gè) Servlet 再參照一個(gè)配置文件(通常為

/WEB-INF/struts-config.xml)將各個(gè)請(qǐng)求分別分配給不同的 action 去處理。

一個(gè)擴(kuò)展知識(shí)點(diǎn):struts 的配置文件可以有多個(gè),可以按模塊配置各自的配置文件,這樣可

以防止配置文件的過(guò)度膨脹;

2.ActionServlet 把請(qǐng)求交給 action 去處理之前,會(huì)將請(qǐng)求參數(shù)封裝成一個(gè) formbean 對(duì)象(就

是一個(gè) java 類,這個(gè)類中的每個(gè)屬性對(duì)應(yīng)一個(gè)請(qǐng)求參數(shù)),封裝成一個(gè)什么樣的 formbean

對(duì)象呢?看配置文件。

3.要說(shuō)明的是, ActionServlet 把 formbean 對(duì)象傳遞給 action 的 execute 方法之前,可能

會(huì)調(diào)用 formbean 的 validate 方法進(jìn)行校驗(yàn),只有校驗(yàn)通過(guò)后才將這個(gè) formbean 對(duì)象傳遞

給 action 的 execute 方法,否則,它將返回一個(gè)錯(cuò)誤頁(yè)面,這個(gè)錯(cuò)誤頁(yè)面由 input 屬性指定,

(看配置文件)作者為什么將這里命名為 input 屬性,而不是 error 屬性,我們后面結(jié)合實(shí)

際的運(yùn)行效果進(jìn)行分析。

4.action 執(zhí)行完后要返回顯示的結(jié)果視圖,這個(gè)結(jié)果視圖是用一個(gè) ActionForward 對(duì)象來(lái)表

示的,actionforward 對(duì)象通過(guò) struts-config.xml 配置文件中的配置關(guān)聯(lián)到某個(gè) jsp 頁(yè)面,因

為程序中使用的是在 struts-config.xml 配置文件為 jsp 頁(yè)面設(shè)置的邏輯名,這樣可以實(shí)現(xiàn)

action 程序代碼與返回的 jsp 頁(yè)面名稱的解耦。

你對(duì) struts 可能還有自己的應(yīng)用方面的經(jīng)驗(yàn),那也要一并說(shuō)出來(lái)。

2、談?wù)勀銓?duì) Hibernate 的理解。

答:

1. 面向?qū)ο笤O(shè)計(jì)的軟件內(nèi)部運(yùn)行過(guò)程可以理解成就是在不斷創(chuàng)建各種新對(duì)象、建立對(duì)象之

間的關(guān)系,調(diào)用對(duì)象的方法來(lái)改變各個(gè)對(duì)象的狀態(tài)和對(duì)象消亡的過(guò)程,不管程序運(yùn)行的過(guò)程

和操作怎么樣,本質(zhì)上都是要得到一個(gè)結(jié)果,程序上一個(gè)時(shí)刻和下一個(gè)時(shí)刻的運(yùn)行結(jié)果的差

異就表現(xiàn)在內(nèi)存中的對(duì)象狀態(tài)發(fā)生了變化。

2.為了在關(guān)機(jī)和內(nèi)存空間不夠的狀況下,保持程序的運(yùn)行狀態(tài),需要將內(nèi)存中的對(duì)象狀態(tài)保

存到持久化設(shè)備和從持久化設(shè)備中恢復(fù)出對(duì)象的狀態(tài),通常都是保存到關(guān)系數(shù)據(jù)庫(kù)來(lái)保存大

量對(duì)象信息。從 Java 程序的運(yùn)行功能上來(lái)講,保存對(duì)象狀態(tài)的功能相比系統(tǒng)運(yùn)行的其他功

能來(lái)說(shuō),應(yīng)該是一個(gè)很不起眼的附屬功能,java 采用 jdbc 來(lái)實(shí)現(xiàn)這個(gè)功能,這個(gè)不起眼的

功能卻要編寫大量的代碼,而做的事情僅僅是保存對(duì)象和恢復(fù)對(duì)象,并且那些大量的 jdbc

代碼并沒(méi)有什么技術(shù)含量,基本上是采用一套例行公事的標(biāo)準(zhǔn)代碼模板來(lái)編寫,是一種苦活

和重復(fù)性的工作。

3.通過(guò)數(shù)據(jù)庫(kù)保存 java 程序運(yùn)行時(shí)產(chǎn)生的對(duì)象和恢復(fù)對(duì)象,其實(shí)就是實(shí)現(xiàn)了 java 對(duì)象與關(guān)

系數(shù)據(jù)庫(kù)記錄的映射關(guān)系,稱為 ORM(即 Object RelationMapping),人們可以通過(guò)封裝

JDBC 代碼來(lái)實(shí)現(xiàn)了這種功能,封裝出來(lái)的產(chǎn)品稱之為 ORM 框架,Hibernate 就是其中的

一種流行 ORM 框架。使用 Hibernate 框架,不用寫 JDBC 代碼,僅僅是調(diào)用一個(gè) save 方

法,就可以將對(duì)象保存到關(guān)系數(shù)據(jù)庫(kù)中,僅僅是調(diào)用一個(gè) get 方法,就可以從數(shù)據(jù)庫(kù)中加載

出一個(gè)對(duì)象。

4.使用 Hibernate 的基本流程是:配置 Configuration 對(duì)象、產(chǎn)生 SessionFactory、創(chuàng)建

session 對(duì)象,啟動(dòng)事務(wù),完成 CRUD 操作,提交事務(wù),關(guān)閉 session。

5.使用 Hibernate 時(shí),先要配置 hibernate.cfg.xml 文件,其中配置數(shù)據(jù)庫(kù)連接信息和方言等,

還要為每個(gè)實(shí)體配置相應(yīng)的 hbm.xml 文件,hibernate.cfg.xml 文件中需要登記每個(gè) hbm.xml

文件。

6.在應(yīng)用 Hibernate 時(shí),重點(diǎn)要了解 Session 的緩存原理,級(jí)聯(lián),延遲加載和 hql 查詢。

3、AOP 的作用。

4、你對(duì) Spring 的理解。

1.Spring 實(shí)現(xiàn)了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模式),這個(gè)類名為

BeanFactory(實(shí)際上是一個(gè)接口),在程序中通常 BeanFactory 的子類 ApplicationContext。

Spring 相當(dāng)于一個(gè)大的工廠類,在其配置文件中通過(guò)<bean>元素配置用于創(chuàng)建實(shí)例對(duì)象的

類名和實(shí)例對(duì)象的屬性。

2. Spring 提供了對(duì) IOC 良好支持,IOC 是一種編程思想,是一種架構(gòu)藝術(shù),利用這種思想

可以很好地實(shí)現(xiàn)模塊之間的解耦。IOC 也稱為 DI(Depency Injection),什么叫依賴注入呢?

譬如,Class Programmer

{

Computer computer =null;

public void code()

{

//Computercomputer = new IBMComputer();

//Computercomputer = beanfacotry.getComputer();

computer.write();

}

public voidsetComputer(Computer computer)

{

this.computer= computer;

}

}

另外兩種方式都由依賴,第一個(gè)直接依賴于目標(biāo)類,第二個(gè)把依賴轉(zhuǎn)移到工廠上,第三個(gè)徹

底與目標(biāo)和工廠解耦了。在 spring 的配置文件中配置片段如下:

<bean id=”computer” class=”cn.itcast.interview.Computer”>

</bean>

<bean id=”programmer” class=”cn.itcast.interview.Programmer”>

<property name=”computer” ref=”computer”></property>

</bean>

3. Spring 提供了對(duì) AOP 技術(shù)的良好封裝, AOP 稱為面向切面編程,就是系統(tǒng)中有很多各

不相干的類的方法,在這些眾多方法中要加入某種系統(tǒng)功能的代碼,例如,加入日志,加入

權(quán)限判斷,加入異常處理,這種應(yīng)用稱為 AOP。實(shí)現(xiàn) AOP 功能采用的是代理技術(shù),客戶端

程序不再調(diào)用目標(biāo),而調(diào)用代理類,代理類與目標(biāo)類對(duì)外具有相同的方法聲明,有兩種方式

可以實(shí)現(xiàn)相同的方法聲明,一是實(shí)現(xiàn)相同的接口,二是作為目標(biāo)的子類在,JDK 中采用 Proxy

類產(chǎn)生動(dòng)態(tài)代理的方式為某個(gè)接口生成實(shí)現(xiàn)類,如果要為某個(gè)類生成子類,則可以用 CGLI

B。在生成的代理類的方法中加入系統(tǒng)功能和調(diào)用目標(biāo)類的相應(yīng)方法,系統(tǒng)功能的代理以

Advice 對(duì)象進(jìn)行提供,顯然要?jiǎng)?chuàng)建出代理對(duì)象,至少需要目標(biāo)類和 Advice 類。spring 提供

了這種支持,只需要在 spring 配置文件中配置這兩個(gè)元素即可實(shí)現(xiàn)代理和 aop 功能,例如,

<bean id=”proxy” type=”org.spring.framework.aop.ProxyBeanFactory”>

<property name=”target”ref=””></property>

<property name=”advisor”ref=””></property>

</bean>

5、談?wù)?Struts 中的 Action servlet。

6、Struts 優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

1. 實(shí)現(xiàn) MVC 模式,結(jié)構(gòu)清晰,使開(kāi)發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn).

2.有豐富的 tag 可以用 ,Struts 的標(biāo)記庫(kù)(Taglib),如能靈活動(dòng)用,則能大大提高開(kāi)發(fā)效率

3. 頁(yè)面導(dǎo)航

使系統(tǒng)的脈絡(luò)更加清晰。通過(guò)一個(gè)配置文件,即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,

這對(duì)于后期的維護(hù)有著莫大的好處。尤其是當(dāng)另一批開(kāi)發(fā)者接手這個(gè)項(xiàng)目時(shí),這種優(yōu)勢(shì)體現(xiàn)

得更加明顯。

4. 提供 Exception 處理機(jī)制 .

5. 數(shù)據(jù)庫(kù)鏈接池管理

6. 支持 I18N

缺點(diǎn)

一、 轉(zhuǎn)到展示層時(shí),需要配置 forward,如果有十個(gè)展示層的 jsp,需要配置十次 struts,

而且還不包括有時(shí)候目錄、文件變更,需要重新修改 forward,注意,每次修改配置之后,

要求重新部署整個(gè)項(xiàng)目,而 tomcate 這樣的服務(wù)器,還必須重新啟動(dòng)服務(wù)器

二、 二、 Struts 的 Action 必需是 thread-safe 方式,它僅僅允許一個(gè)實(shí)例去處理所有

的請(qǐng)求。所以 action 用到的所有的資源都必需統(tǒng)一同步,這個(gè)就引起了線程安全的問(wèn)題。

三、 測(cè)試不方便. Struts 的每個(gè) Action 都同 Web 層耦合在一起,這樣它的測(cè)試依賴于

Web 容器,單元測(cè)試也很難實(shí)現(xiàn)。不過(guò)有一個(gè) Junit 的擴(kuò)展工具 Struts TestCase 可以實(shí)現(xiàn)

它的單元測(cè)試。

四、 類型的轉(zhuǎn)換. Struts 的 FormBean 把所有的數(shù)據(jù)都作為 String 類型,它可以使用工

具 Commons-Beanutils 進(jìn)行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在 Class 級(jí)別,而且轉(zhuǎn)化的類型是

不可配置的。類型轉(zhuǎn)化時(shí)的錯(cuò)誤信息返回給用戶也是非常困難的。

五、 對(duì) Servlet 的依賴性過(guò)強(qiáng). Struts 處理 Action 時(shí)必需要依賴 ServletRequest 和

ServletResponse,所有它擺脫不了 Servlet 容器。

六、 前端表達(dá)式語(yǔ)言方面.Struts 集成了 JSTL,所以它主要使用 JSTL 的表達(dá)式語(yǔ)言來(lái)

獲取數(shù)據(jù)??墒?JSTL 的表達(dá)式語(yǔ)言在 Collection 和索引屬性方面處理顯得很弱。

七、 對(duì) Action 執(zhí)行的控制困難. Struts 創(chuàng)建一個(gè) Action,如果想控制它的執(zhí)行順序?qū)?huì)

非常困難。甚至你要重新去寫 Servlet 來(lái)實(shí)現(xiàn)你的這個(gè)功能需求。

八、 對(duì) Action 執(zhí)行前和后的處理. Struts 處理 Action 的時(shí)候是基于 class 的 hierarchies,

很難在 action 處理前和后進(jìn)行操作。

九、 對(duì)事件支持不夠.在 struts 中,實(shí)際是一個(gè)表單 Form 對(duì)應(yīng)一個(gè) Action 類(或

DispatchAction),換一句話說(shuō):在 Struts 中實(shí)際是一個(gè)表單只能對(duì)應(yīng)一個(gè)事件,struts 這種

事件方式稱為 application event,application event 和 component event 相比是一種粗粒度

的事件

7、STRUTS 的應(yīng)用(如 STRUTS 架構(gòu))

Struts 是采用 Java Servlet/JavaServer Pages 技術(shù),開(kāi)發(fā) Web 應(yīng)用程序的開(kāi)放源碼的

framework。采用 Struts 能開(kāi)發(fā)出基于 MVC(Model-View-Controller)設(shè)計(jì)模式的應(yīng)用構(gòu)架。

Struts 有如下的主要功能:一.包含一個(gè) controller servlet,能將用戶的請(qǐng)求發(fā)送到相應(yīng)的

Action 對(duì)象。二.JSP 自由 tag 庫(kù),并且在 controller servlet 中提供關(guān)聯(lián)支持,幫助開(kāi)發(fā)員

創(chuàng)建交互式表單應(yīng)用。三.提供了一系列實(shí)用對(duì)象:XML 處理、通過(guò) Java reflection APIs 自

動(dòng)處理 JavaBeans 屬性、國(guó)際化的提示和消息。

8、說(shuō)說(shuō) struts1 與 struts2 的區(qū)別。

1.都是 MVC 的 WEB 框架,

2 struts1的老牌框架,應(yīng)用很廣泛,有很好的群眾基礎(chǔ),使用它開(kāi)發(fā)風(fēng)險(xiǎn)很小,成本更低!

struts2雖然基于這個(gè)框架,但是應(yīng)用群眾并多,相對(duì)不成熟,未知的風(fēng)險(xiǎn)和變化很多,開(kāi)發(fā)

人員相對(duì)不好招,使用它開(kāi)發(fā)項(xiàng)目的風(fēng)險(xiǎn)系數(shù)更大,用人成本更高!

3.struts2畢竟是站在前輩的基礎(chǔ)設(shè)計(jì)出來(lái),它會(huì)改善和完善 struts1中的一些缺陷,struts1

中一些懸而未決問(wèn)題在 struts2得到了解決。

4.struts1的前端控制器是一個(gè) Servlet,名稱為 ActionServlet,struts2的前端控制器是一個(gè)

filter,在 struts2.0中叫 FilterDispatcher,在 struts2.1中叫 StrutsPrepareAndExecuteFilter。

5.struts1的 action 需要繼承 Action 類,struts2的 action 可以不繼承任何類;struts1對(duì)同一

個(gè)路徑的所有請(qǐng)求共享一個(gè) Action 實(shí)例,struts2對(duì)同一個(gè)路徑的每個(gè)請(qǐng)求分別使用一個(gè)獨(dú)

立 Action 實(shí)例對(duì)象,所有對(duì)于 struts2的 Action 不用考慮線程安全問(wèn)題。

6.在 struts1中使用 formbean 封裝請(qǐng)求參數(shù),在 struts2中直接使用 action 的屬性來(lái)封裝請(qǐng)

求參數(shù)。

7.struts1中的多個(gè)業(yè)務(wù)方法放在一個(gè) Action 中時(shí)(即繼承 DispatchAction 時(shí)),要么都校驗(yàn),

要么都不校驗(yàn);對(duì)于 struts2,可以指定只對(duì)某個(gè)方法進(jìn)行校驗(yàn),當(dāng)一個(gè) Action 繼承了

ActionSupport 且在這個(gè)類中只編寫了 validateXxx()方法,那么則只對(duì) Xxx()方法進(jìn)行校驗(yàn)。

(一個(gè)請(qǐng)求來(lái)了的執(zhí)行流程進(jìn)行分析,struts2是自動(dòng)支持分模塊開(kāi)發(fā),并可以不同模塊設(shè)置

不同的 url 前綴,這是通過(guò) package 的 namespace 來(lái)實(shí)現(xiàn)的;struts2是支持多種類型的視

圖;struts2的視圖地址可以是動(dòng)態(tài)的,即視圖的名稱是支持變量方式的,舉例,論壇發(fā)帖失

敗后回來(lái)還要傳遞 boardid。視圖內(nèi)容顯示方面:它的標(biāo)簽用 ognl,要 el 強(qiáng)大很多,在國(guó)際

化方面支持分模塊管理,兩個(gè)模塊用到同樣的 key,對(duì)應(yīng)不同的消息;)

與 Struts1不同,Struts2對(duì)用戶的每一次請(qǐng)求都會(huì)創(chuàng)建一個(gè) Action,所以 Struts2中的 Action

是線程安全的。

給我印象最深刻的是:struts 配置文件中的 redirect 視圖的 url 不能接受參數(shù),而 struts2配

置文件中的 redirect 視圖可以接受參數(shù)。

9、hibernate 中的 update()和 saveOrUpdate()的區(qū)別,session 的 load()和

get()的區(qū)別。

10、簡(jiǎn)述 Hibernate 和 JDBC 的優(yōu)缺點(diǎn)?如何書寫一個(gè) one to many 配置文

件.

11、iBatis 與 Hibernate 有什么不同?

相同點(diǎn):屏蔽 jdbc api 的底層訪問(wèn)細(xì)節(jié),使用我們不用與 jdbc api 打交道,就可以訪問(wèn)數(shù)據(jù)。

jdbc api 編程流程固定,還將 sql 語(yǔ)句與 java 代碼混雜在了一起,經(jīng)常需要拼湊 sql 語(yǔ)句,

細(xì)節(jié)很繁瑣。

ibatis 的好處:屏蔽 jdbc api 的底層訪問(wèn)細(xì)節(jié);將 sql 語(yǔ)句與 java 代碼進(jìn)行分離;提供了將結(jié)

果集自動(dòng)封裝稱為實(shí)體對(duì)象和對(duì)象的集合的功能,queryForList 返回對(duì)象集合,用

queryForObject 返回單個(gè)對(duì)象;提供了自動(dòng)將實(shí)體對(duì)象的屬性傳遞給 sql 語(yǔ)句的參數(shù)。

Hibernate 是一個(gè)全自動(dòng)的 orm 映射工具,它可以自動(dòng)生成 sql 語(yǔ)句,ibatis 需要我們自己在

xml 配置文件中寫 sql 語(yǔ)句,hibernate 要比 ibatis 功能負(fù)責(zé)和強(qiáng)大很多。因?yàn)?hibernate 自

動(dòng)生成 sql 語(yǔ)句,我們無(wú)法控制該語(yǔ)句,我們就無(wú)法去寫特定的高效率的 sql。對(duì)于一些不

太復(fù)雜的 sql 查詢,hibernate 可以很好幫我們完成,但是,對(duì)于特別復(fù)雜的查詢,hibernate

就很難適應(yīng)了,這時(shí)候用 ibatis 就是不錯(cuò)的選擇,因?yàn)?ibatis 還是由我們自己寫 sql 語(yǔ)句。

12、寫 Hibernate 的一對(duì)多和多對(duì)一雙向關(guān)聯(lián)的 orm 配置?

12.1、hibernate 的 inverse 屬性的作用?

解決方案一,按照 Object[]數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean

解決方案二,對(duì)每個(gè)表的 bean 寫構(gòu)造函數(shù),比如表一要查出 field1,field2兩個(gè)字段,那么有

一個(gè)構(gòu)造函數(shù)就是 Bean(type1filed1,type2

field2) ,然后在 hql 里面就可以直接生成這個(gè) bean 了。

13、在 DAO 中如何體現(xiàn) DAO 設(shè)計(jì)模式?

解決方案一,按照 Object[]數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean

解決方案二,對(duì)每個(gè)表的 bean 寫構(gòu)造函數(shù),比如表一要查出 field1,field2兩個(gè)字段,那么有

一個(gè)構(gòu)造函數(shù)就是 Bean(type1filed1,type2

field2) ,然后在 hql 里面就可以直接生成這個(gè) bean 了。

14、spring+Hibernate 中委托方案怎么配置?

解決方案一,按照 Object[]數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean

解決方案二,對(duì)每個(gè)表的 bean 寫構(gòu)造函數(shù),比如表一要查出 field1,field2兩個(gè)字段,那么有

一個(gè)構(gòu)造函數(shù)就是 Bean(type1filed1,type2

field2) ,然后在 hql 里面就可以直接生成這個(gè) bean 了。

15、spring+Hibernate 中委托方案怎么配置?

解決方案一,按照 Object[]數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean

解決方案二,對(duì)每個(gè)表的 bean 寫構(gòu)造函數(shù),比如表一要查出 field1,field2兩個(gè)字段,那么有

一個(gè)構(gòu)造函數(shù)就是 Bean(type1filed1,type2

field2) ,然后在 hql 里面就可以直接生成這個(gè) bean 了。

16. hibernate 進(jìn)行多表查詢每個(gè)表中各取幾個(gè)字段,也就是說(shuō)查詢出來(lái)的結(jié)果

集沒(méi)有一個(gè)實(shí)體類與之對(duì)應(yīng)如何解決;

解決方案一,按照 Object[]數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean

解決方案二,對(duì)每個(gè)表的 bean 寫構(gòu)造函數(shù),比如表一要查出 field1,field2兩個(gè)字段,那么有

一個(gè)構(gòu)造函數(shù)就是 Bean(type1filed1,type2

field2) ,然后在 hql 里面就可以直接生成這個(gè) bean 了。

17.介紹一下 Hibernate 的二級(jí)緩存

按照以下思路來(lái)回答:(1)首先說(shuō)清楚什么是緩存,(2)再說(shuō)有了 hibernate 的 Session 就

是一級(jí)緩存,即有了一級(jí)緩存,為什么還要有二級(jí)緩存,(3)最后再說(shuō)如何配置 Hibernate

的二級(jí)緩存。

(1)緩存就是把以前從數(shù)據(jù)庫(kù)中查詢出來(lái)和使用過(guò)的對(duì)象保存在內(nèi)存中(一個(gè)數(shù)據(jù)結(jié)構(gòu)

中),這個(gè)數(shù)據(jù)結(jié)構(gòu)通常是或類似 Hashmap,當(dāng)以后要使用某個(gè)對(duì)象時(shí),先查詢緩存中是否

有這個(gè)對(duì)象,如果有則使用緩存中的對(duì)象,如果沒(méi)有則去查詢數(shù)據(jù)庫(kù),并將查詢出來(lái)的對(duì)象

保存在緩存中,以便下次使用。下面是緩存的偽代碼:

引出 hibernate 的第二級(jí)緩存,用下面的偽代碼分析了 Cache 的實(shí)現(xiàn)原理

Dao

{

hashmap map = newmap();

User getUser(integerid)

{

User user =map.get(id)

if(user ==null)

{

user =session.get(id);

map.put(id,user);

}

return user;

}

}

Dao

{

Cache cache = null

setCache(Cachecache)

{

this.cache =cache

}

User getUser(int id)

{?

if(cache!=null)

{

Useruser = cache.get(id);

if(user==null)

{

user= session.get(id);

cache.put(id,user);

}

returnuser;

}

returnsession.get(id);

}

}

(2)Hibernate 的 Session 就是一種緩存,我們通常將之稱為 Hibernate 的一級(jí)緩存,當(dāng)想

使用 session 從數(shù)據(jù)庫(kù)中查詢出一個(gè)對(duì)象時(shí),Session 也是先從自己內(nèi)部查看是否存在這個(gè)

對(duì)象,存在則直接返回,不存在才去訪問(wèn)數(shù)據(jù)庫(kù),并將查詢的結(jié)果保存在自己內(nèi)部。由于

Session 代表一次會(huì)話過(guò)程,一個(gè) Session 與一個(gè)數(shù)據(jù)庫(kù)連接相關(guān)連,所以 Session 最好不

要長(zhǎng)時(shí)間保持打開(kāi),通常僅用于一個(gè)事務(wù)當(dāng)中,在事務(wù)結(jié)束時(shí)就應(yīng)關(guān)閉。并且 Session 是

線程不安全的,被多個(gè)線程共享時(shí)容易出現(xiàn)問(wèn)題。通常只有那種全局意義上的緩存才是真正

的緩存應(yīng)用,才有較大的緩存價(jià)值,因此,Hibernate 的 Session 這一級(jí)緩存的緩存作用并

不明顯,應(yīng)用價(jià)值不大。Hibernate 的二級(jí)緩存就是要為 Hibernate 配置一種全局緩存,讓

多個(gè)線程和多個(gè)事務(wù)都可以共享這個(gè)緩存。我們希望的是一個(gè)人使用過(guò),其他人也可以使用,

session 沒(méi)有這種效果。

(3)二級(jí)緩存是獨(dú)立于 Hibernate 的軟件部件,屬于第三方的產(chǎn)品,多個(gè)廠商和組織都提

供有緩存產(chǎn)品,例如,EHCache 和 OSCache 等等。在 Hibernate 中使用二級(jí)緩存,首先

就要在 hibernate.cfg.xml 配置文件中配置使用哪個(gè)廠家的緩存產(chǎn)品,接著需要配置該緩存

產(chǎn)品自己的配置文件,最后要配置 Hibernate 中的哪些實(shí)體對(duì)象要納入到二級(jí)緩存的管理

中。明白了二級(jí)緩存原理和有了這個(gè)思路后,很容易配置起 Hibernate 的二級(jí)緩存。擴(kuò)展知

識(shí):一個(gè) SessionFactory 可以關(guān)聯(lián)一個(gè)二級(jí)緩存,也即一個(gè)二級(jí)緩存只能負(fù)責(zé)緩存一個(gè)數(shù)

據(jù)庫(kù)中的數(shù)據(jù),當(dāng)使用 Hibernate 的二級(jí)緩存后,注意不要有其他的應(yīng)用或 SessionFactory

來(lái)更改當(dāng)前數(shù)據(jù)庫(kù)中的數(shù)據(jù),這樣緩存的數(shù)據(jù)就會(huì)與數(shù)據(jù)庫(kù)中的實(shí)際數(shù)據(jù)不一致。

18、Spring 的依賴注入是什么意思?給一個(gè) Bean 的 message 屬性,字符串類

型,注入值為"Hello"的 XML 配置文件該怎么寫?

19、Jdo 是什么?

JDO 是 Java 對(duì)象持久化的新的規(guī)范,為 java data object 的簡(jiǎn)稱,也是一個(gè)用于存取某種數(shù)

據(jù)倉(cāng)庫(kù)中的對(duì)象的標(biāo)準(zhǔn)化 API。JDO 提供了透明的對(duì)象存儲(chǔ),因此對(duì)開(kāi)發(fā)人員來(lái)說(shuō),存儲(chǔ)

數(shù)據(jù)對(duì)象完全不需要額外的代碼(如 JDBC API 的使用)。這些繁瑣的例行工作已經(jīng)轉(zhuǎn)移到

JDO 產(chǎn)品提供商身上,使開(kāi)發(fā)人員解脫出來(lái),從而集中時(shí)間和精力在業(yè)務(wù)邏輯上。另外,

JDO 很靈活,因?yàn)樗梢栽谌魏螖?shù)據(jù)底層上運(yùn)行。JDBC 只是面向關(guān)系數(shù)據(jù)庫(kù)(RDBMS)

JDO 更通用,提供到任何數(shù)據(jù)底層的存儲(chǔ)功能,比如關(guān)系數(shù)據(jù)庫(kù)、文件、XML 以及對(duì)象數(shù)

據(jù)庫(kù)(ODBMS)等等,使得應(yīng)用可移植性更強(qiáng)。

20、什么是 spring 的 IOC AOP

21、STRUTS 的工作流程!

22、spring 與 EJB 的區(qū)別??!

八.軟件工程與設(shè)計(jì)模式

1、UML 方面

標(biāo)準(zhǔn)建模語(yǔ)言 UML。用例圖,靜態(tài)圖(包括類圖、對(duì)象圖和包圖),行為圖,交互圖(順序圖,合作

圖),實(shí)現(xiàn)圖。

2、j2ee 常用的設(shè)計(jì)模式?說(shuō)明工廠模式。

總共23種,分為三大類:創(chuàng)建型,結(jié)構(gòu)型,行為型

我只記得其中常用的6、7種,分別是:

創(chuàng)建型(工廠、工廠方法、抽象工廠、單例)

結(jié)構(gòu)型(包裝、適配器,組合,代理)

行為(觀察者,模版,策略)

然后再針對(duì)你熟悉的模式談?wù)勀愕睦斫饧纯伞?/p>

Java 中的23種設(shè)計(jì)模式:

Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式),

Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式),

Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式),Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),

Command(命令模式), Interpreter(解釋器模式), Visitor(訪問(wèn)者模式),

Iterator(迭代子模式), Mediator(調(diào)停者模式), Memento(備忘錄模式),

Observer(觀察者模式), State(狀態(tài)模式), Strategy(策略模式),

Template Method(模板方法模式), Chain Of Responsibleity(責(zé)任鏈模式)

工廠模式:工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實(shí)現(xiàn)的類可以根據(jù)提供的數(shù)

據(jù)生成一組類中某一個(gè)類的實(shí)例,通常這一組類有一個(gè)公共的抽象父類并且實(shí)現(xiàn)了相同的方

法,但是這些方法針對(duì)不同的數(shù)據(jù)進(jìn)行了不同的操作。首先需要定義一個(gè)基類,該類的子類

通過(guò)不同的方法實(shí)現(xiàn)了基類中的方法。然后需要定義一個(gè)工廠類,工廠類可以根據(jù)條件生成

不同的子類實(shí)例。當(dāng)?shù)玫阶宇惖膶?shí)例后,開(kāi)發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返

回的是哪一個(gè)子類的實(shí)例。

3、開(kāi)發(fā)中都用到了那些設(shè)計(jì)模式?用在什么場(chǎng)合?

每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的解決方案的核

心。通過(guò)這種方式,你可以無(wú)數(shù)次地使用那些已有的解決方案,無(wú)需在重復(fù)相同的工作。主

要用到了 MVC 的設(shè)計(jì)模式。用來(lái)開(kāi)發(fā) JSP/Servlet 或者 J2EE 的相關(guān)應(yīng)用。簡(jiǎn)單工廠模式

等。

九. j2ee 部分

1、BS 與 CS 的聯(lián)系與區(qū)別。

C/S 是 Client/Server 的縮寫。服務(wù)器通常采用高性能的 PC、工作站或小型機(jī),并采用大型

數(shù)據(jù)庫(kù)系統(tǒng),如 Oracle、Sybase、InFORMix 或 SQL Server??蛻舳诵枰惭b專用的客戶

端軟件。

B/S是 Brower/Server 的縮寫,客戶機(jī)上只要安裝一個(gè)瀏覽器(Browser),如 Netscape

Navigator 或 Internet Explorer,服務(wù)器安裝 Oracle、Sybase、InFORMix 或 SQL Server

等數(shù)據(jù)庫(kù)。在這種結(jié)構(gòu)下,用戶界面完全通過(guò) WWW 瀏覽器實(shí)現(xiàn),一部分事務(wù)邏輯在前端

實(shí)現(xiàn),但是主要事務(wù)邏輯在服務(wù)器端實(shí)現(xiàn)。瀏覽器通過(guò)Web Server 同數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)交互。

C/S 與 B/S 區(qū)別:

1.硬件環(huán)境不同:

C/S 一般建立在專用的網(wǎng)絡(luò)上,小范圍里的網(wǎng)絡(luò)環(huán)境,局域網(wǎng)之間再通過(guò)專門服務(wù)器提供連

接和數(shù)據(jù)交換服務(wù).

B/S 建立在廣域網(wǎng)之上的,不必是專門的網(wǎng)絡(luò)硬件環(huán)境,例與電話上網(wǎng),租用設(shè)備.信息自己管

理.有比 C/S 更強(qiáng)的適應(yīng)范圍,一般只要有操作系統(tǒng)和瀏覽器就行

2.對(duì)安全要求不同

C/S 一般面向相對(duì)固定的用戶群,對(duì)信息安全的控制能力很強(qiáng).一般高度機(jī)密的信息系統(tǒng)采

用 C/S 結(jié)構(gòu)適宜.可以通過(guò) B/S 發(fā)布部分可公開(kāi)信息.

B/S 建立在廣域網(wǎng)之上,對(duì)安全的控制能力相對(duì)弱,可能面向不可知的用戶。

3.對(duì)程序架構(gòu)不同

C/S 程序可以更加注重流程,可以對(duì)權(quán)限多層次校驗(yàn),對(duì)系統(tǒng)運(yùn)行速度可以較少考慮.

B/S 對(duì)安全以及訪問(wèn)速度的多重的考慮,建立在需要更加優(yōu)化的基礎(chǔ)之上.比 C/S 有更高的

要求 B/S 結(jié)構(gòu)的程序架構(gòu)是發(fā)展的趨勢(shì),從 MS 的.Net 系列的 BizTalk 2000Exchange 2000

等,全面支持網(wǎng)絡(luò)的構(gòu)件搭建的系統(tǒng). SUN 和 IBM 推的 JavaBean 構(gòu)件技術(shù)等,使 B/S 更加

成熟.

4.軟件重用不同

C/S 程序可以不可避免的整體性考慮,構(gòu)件的重用性不如在 B/S 要求下的構(gòu)件的重用性好.

B/S 對(duì)的多重結(jié)構(gòu),要求構(gòu)件相對(duì)獨(dú)立的功能.能夠相對(duì)較好的重用.就入買來(lái)的餐桌可以再

利用,而不是做在墻上的石頭桌子

5.系統(tǒng)維護(hù)不同

C/S 程序由于整體性,必須整體考察,處理出現(xiàn)的問(wèn)題以及系統(tǒng)升級(jí).升級(jí)難.可能是再做一個(gè)

全新的系統(tǒng)

B/S 構(gòu)件組成,方面構(gòu)件個(gè)別的更換,實(shí)現(xiàn)系統(tǒng)的無(wú)縫升級(jí).系統(tǒng)維護(hù)開(kāi)銷減到最小.用戶從網(wǎng)

上自己下載安裝就可以實(shí)現(xiàn)升級(jí).

6.處理問(wèn)題不同

C/S 程序可以處理用戶面固定,并且在相同區(qū)域,安全要求高需求,與操作系統(tǒng)相關(guān).應(yīng)該都是

相同的系統(tǒng)

B/S 建立在廣域網(wǎng)上,面向不同的用戶群,分散地域,這是 C/S 無(wú)法作到的.與操作系統(tǒng)平臺(tái)關(guān)

系最小.

7.用戶接口不同

C/S 多是建立的 Window 平臺(tái)上,表現(xiàn)方法有限,對(duì)程序員普遍要求較高

B/S 建立在瀏覽器上,有更加豐富和生動(dòng)的表現(xiàn)方式與用戶交流.并且大部分難度減低,減低

開(kāi)發(fā)成本.

8.信息流不同

C/S 程序一般是典型的中央集權(quán)的機(jī)械式處理,交互性相對(duì)低

B/S 信息流向可變化, B-B B-C B-G 等信息、流向的變化,更像交易中心。

2、應(yīng)用服務(wù)器與 WEB SERVER 的區(qū)別?

應(yīng)用服務(wù)器:Weblogic、Tomcat、Jboss

WEB SERVER:IIS、 Apache

3、應(yīng)用服務(wù)器有那些?

BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i ApplicationServer,

jBoss,Tomcat

4、J2EE 是什么?

答:Je22是 Sun 公司提出的多層(multi-diered),分布式(distributed),基于組件

(component-base)的企業(yè)級(jí)應(yīng)用模型(enterpriese applicationmodel).在這樣的一個(gè)應(yīng)用系

統(tǒng)中,可按照功能劃分為不同的組件,這些組件又可在不同計(jì)算機(jī)上,并且處于相應(yīng)的層次

(tier)中。所屬層次包括客戶層(clietn tier)組件,web 層和組件,Business 層和組件,企業(yè)信息系

統(tǒng)(EIS)層。

一個(gè)另類的回答:j2ee 就是增刪改查。

5、J2EE 是技術(shù)還是平臺(tái)還是框架?什么是 J2EE

J2EE 本身是一個(gè)標(biāo)準(zhǔn),一個(gè)為企業(yè)分布式應(yīng)用的開(kāi)發(fā)提供的標(biāo)準(zhǔn)平臺(tái)。

J2EE 也是一個(gè)框架,包括 JDBC、JNDI、RMI、JMS、EJB、JTA 等技術(shù)。

6、請(qǐng)對(duì)以下在 J2EE 中常用的名詞進(jìn)行解釋(或簡(jiǎn)單描述)

web 容器:給處于其中的應(yīng)用程序組件(JSP,SERVLET)提供一個(gè)環(huán)境,使 JSP,SERVLET

直接更容器中的環(huán)境變量接口交互,不必關(guān)注其它系統(tǒng)問(wèn)題。主要有 WEB 服務(wù)器來(lái)實(shí)現(xiàn)。

例如:TOMCAT,WEBLOGIC,WEBSPHERE 等。該容器提供的接口嚴(yán)格遵守 J2EE 規(guī)范中

的 WEB APPLICATION 標(biāo)準(zhǔn)。我們把遵守以上標(biāo)準(zhǔn)的 WEB 服務(wù)器就叫做 J2EE 中的 WEB

容器。

EJB 容器:Enterprise java bean 容器。更具有行業(yè)領(lǐng)域特色。他提供給運(yùn)行在其中的組件

EJB 各種管理功能。只要滿足 J2EE 規(guī)范的 EJB 放入該容器,馬上就會(huì)被容器進(jìn)行高效率

的管理。并且可以通過(guò)現(xiàn)成的接口來(lái)獲得系統(tǒng)級(jí)別的服務(wù)。例如郵件服務(wù)、事務(wù)管理。

JNDI:(Java Naming & Directory Interface)JAVA 命名目錄服務(wù)。主要提供的功能是:提

供一個(gè)目錄系統(tǒng),讓其它各地的應(yīng)用程序在其上面留下自己的索引,從而滿足快速查找和定

位分布式應(yīng)用程序的功能。

JMS:(Java Message Service)JAVA 消息服務(wù)。主要實(shí)現(xiàn)各個(gè)應(yīng)用程序之間的通訊。包

括點(diǎn)對(duì)點(diǎn)和廣播。

JTA:(Java Transaction API)JAVA 事務(wù)服務(wù)。提供各種分布式事務(wù)服務(wù)。應(yīng)用程序只需

調(diào)用其提供的接口即可。

JAF:(Java Action FrameWork)JAVA 安全認(rèn)證框架。提供一些安全控制方面的框架。讓

開(kāi)發(fā)者通過(guò)各種部署和自定義實(shí)現(xiàn)自己的個(gè)性安全控制策略。

RMI/IIOP:(Remote Method Invocation /internet 對(duì)象請(qǐng)求中介協(xié)議)他們主要用于通過(guò)遠(yuǎn)

程調(diào)用服務(wù)。例如,遠(yuǎn)程有一臺(tái)計(jì)算機(jī)上運(yùn)行一個(gè)程序,它提供股票分析服務(wù),我們可以在

本地計(jì)算機(jī)上實(shí)現(xiàn)對(duì)其直接調(diào)用。當(dāng)然這是要通過(guò)一定的規(guī)范才能在異構(gòu)的系統(tǒng)之間進(jìn)行通

信。RMI 是 JAVA 特有的。

7、如何給 weblogic 指定大小的內(nèi)存?

(這個(gè)問(wèn)題不作具體回答,列出來(lái)只是告訴讀者可能會(huì)遇到什么問(wèn)題,你不需要面面俱到,

什么都精通。)

在啟動(dòng) Weblogic 的腳本中(位于所在 Domian 對(duì)應(yīng)服務(wù)器目錄下的 startServerName),增

加 set MEM_ARGS=-Xms32m-Xmx200m,可以調(diào)整最小內(nèi)存為32M,最大200M

8、如何設(shè)定的 weblogic 的熱啟動(dòng)模式(開(kāi)發(fā)模式)與產(chǎn)品發(fā)布模式?

可以在管理控制臺(tái)中修改對(duì)應(yīng)服務(wù)器的啟動(dòng)模式為開(kāi)發(fā)或產(chǎn)品模式之一?;蛘咝薷姆?wù)的啟

動(dòng)文件或者 commenv 文件,增加 setPRODUCTION_MODE=true。

9、如何啟動(dòng)時(shí)不需輸入用戶名與密碼?

修改服務(wù)啟動(dòng)文件,增加 WLS_USER 和 WLS_PW 項(xiàng)。也可以在 boot.properties 文件中

增加加密過(guò)的用戶名和密碼.

10、在 weblogic 管理制臺(tái)中對(duì)一個(gè)應(yīng)用域(或者說(shuō)是一個(gè)網(wǎng)站,Domain)進(jìn)行

jms 及 ejb 或連接池等相關(guān)信息進(jìn)行配置后,實(shí)際保存在什么文件中?

保存在此 Domain 的 config.xml 文件中,它是服務(wù)器的核心配置文件。

11、說(shuō)說(shuō) weblogic 中一個(gè) Domain 的缺省目錄結(jié)構(gòu)?比如要將一個(gè)簡(jiǎn)單的

helloWorld.jsp 放入何目錄下,然的在瀏覽器上就可打入 http://主機(jī):端口號(hào)

//helloword.jsp 就可以看到運(yùn)行結(jié)果了?又比如這其中用到了一個(gè)自己寫的

javaBean 該如何辦?

Domain 目錄服務(wù)器目錄 applications,將應(yīng)用目錄放在此目錄下將可以作為應(yīng)用訪問(wèn),如

果是 Web 應(yīng)用,應(yīng)用目錄需要滿足 Web 應(yīng)用目錄要求,jsp 文件可以直接放在應(yīng)用目錄中,

Javabean 需要放在應(yīng)用目錄的 WEB-INF 目錄的 classes 目錄中,設(shè)置服務(wù)器的缺省應(yīng)用

將可以實(shí)現(xiàn)在瀏覽器上無(wú)需輸入應(yīng)用名。

12、在 weblogic 中發(fā)布 ejb 需涉及到哪些配置文件

不同類型的 EJB 涉及的配置文件不同,都涉及到的配置文件包括

ejb-jar.xml,weblogic-ejb-jar.xmlCMP 實(shí)體 Bean 一般還需要 weblogic-cmp-rdbms-jar.xml

13、如何在 weblogic 中進(jìn)行 ssl 配置與客戶端的認(rèn)證配置或說(shuō)說(shuō) j2ee(標(biāo)準(zhǔn))進(jìn)

行 ssl 的配置?

缺省安裝中使用 DemoIdentity.jks 和 DemoTrust.jks KeyStore 實(shí)現(xiàn) SSL,需要配置服務(wù)器

使用 Enable SSL,配置其端口,在產(chǎn)品模式下需要從 CA 獲取私有密鑰和數(shù)字證書,創(chuàng)建

identity 和 trust keystore,裝載獲得的密鑰和數(shù)字證書??梢耘渲么?SSL 連接是單向還是

雙向的。

14、如何查看在 weblogic 中已經(jīng)發(fā)布的 EJB?

可以使用管理控制臺(tái),在它的 Deployment 中可以查看所有已發(fā)布的 EJB

十. EJB 部分

1、EJB 是基于哪些技術(shù)實(shí)現(xiàn)的?并說(shuō)出 SessionBean 和 EntityBean 的區(qū)別,

StatefulBean 和 StatelessBean 的區(qū)別。

EJB 包括 Session Bean、Entity Bean、Message Driven Bean,基于 JNDI、RMI、JAT

等技術(shù)實(shí)現(xiàn)。

SessionBean 在 J2EE 應(yīng)用程序中被用來(lái)完成一些服務(wù)器端的業(yè)務(wù)操作,例如訪問(wèn)數(shù)據(jù)庫(kù)、

調(diào)用其他 EJB 組件。EntityBean 被用來(lái)代表應(yīng)用系統(tǒng)中用到的數(shù)據(jù)。

對(duì)于客戶機(jī),SessionBean 是一種非持久性對(duì)象,它實(shí)現(xiàn)某些在服務(wù)器上運(yùn)行的業(yè)務(wù)邏輯。

對(duì)于客戶機(jī),EntityBean 是一種持久性對(duì)象,它代表一個(gè)存儲(chǔ)在持久性存儲(chǔ)器中的實(shí)體的

對(duì)象視圖,或是一個(gè)由現(xiàn)有企業(yè)應(yīng)用程序?qū)崿F(xiàn)的實(shí)體。

Session Bean 還可以再細(xì)分為 Stateful Session Bean 與 Stateless SessionBean,這兩種

的 Session Bean 都可以將系統(tǒng)邏輯放在 method 之中執(zhí)行,不同的是 Stateful

SessionBean 可以記錄呼叫者的狀態(tài),因此通常來(lái)說(shuō),一個(gè)使用者會(huì)有一個(gè)相對(duì)應(yīng)的

Stateful SessionBean 的實(shí)體。Stateless SessionBean 雖然也是邏輯組件,但是他卻不負(fù)

責(zé)記錄使用者狀態(tài),也就是說(shuō)當(dāng)使用者呼叫 Stateless SessionBean 的時(shí)候,EJB Container

并不會(huì)找尋特定的 Stateless SessionBean 的實(shí)體來(lái)執(zhí)行這個(gè) method。換言之,很可能數(shù)

個(gè)使用者在執(zhí)行某個(gè) Stateless SessionBean 的 methods 時(shí),會(huì)是同一個(gè) Bean 的

Instance 在執(zhí)行。從內(nèi)存方面來(lái)看,Stateful SessionBean 與 Stateless SessionBean 比較,

Stateful SessionBean 會(huì)消耗 J2EE Server 較多的內(nèi)存,然而 Stateful SessionBean 的優(yōu)

勢(shì)卻在于他可以維持使用者的狀態(tài)。

2、簡(jiǎn)要講一下 EJB 的 7 個(gè) Transaction Level?

3、EJB 與 JAVA BEAN 的區(qū)別?

Java Bean 是可復(fù)用的組件,對(duì) Java Bean 并沒(méi)有嚴(yán)格的規(guī)范,理論上講,任何一個(gè) Java

類都可以是一個(gè) Bean。但通常情況下,由于 Java Bean 是被容器所創(chuàng)建(如 Tomcat)的,

所以 Java Bean 應(yīng)具有一個(gè)無(wú)參的構(gòu)造器,另外,通常 Java Bean 還要實(shí)現(xiàn) Serializable

接口用于實(shí)現(xiàn) Bean 的持久性。Java Bean 實(shí)際上相當(dāng)于微軟 COM 模型中的本地進(jìn)程內(nèi)

COM 組件,它是不能被跨進(jìn)程訪問(wèn)的。Enterprise Java Bean 相當(dāng)于 DCOM,即分布式組

件。它是基于 Java 的遠(yuǎn)程方法調(diào)用(RMI)技術(shù)的,所以 EJB 可以被遠(yuǎn)程訪問(wèn)(跨進(jìn)程、

跨計(jì)算機(jī))。但 EJB 必須被布署在諸如 Webspere、WebLogic 這樣的容器中,EJB 客戶從

不直接訪問(wèn)真正的 EJB 組件,而是通過(guò)其容器訪問(wèn)。EJB 容器是 EJB 組件的代理,EJB 組

件由容器所創(chuàng)建和管理??蛻敉ㄟ^(guò)容器來(lái)訪問(wèn)真正的 EJB 組件。

4、EJB 包括(SessionBean,EntityBean)說(shuō)出他們的生命周期,及如何管理

事務(wù)的?

SessionBean:Stateless Session Bean 的生命周期是由容器決定的,當(dāng)客戶機(jī)發(fā)出請(qǐng)求要

建立一個(gè) Bean 的實(shí)例時(shí),EJB 容器不一定要?jiǎng)?chuàng)建一個(gè)新的 Bean 的實(shí)例供客戶機(jī)調(diào)用,而

是隨便找一個(gè)現(xiàn)有的實(shí)例提供給客戶機(jī)。當(dāng)客戶機(jī)第一次調(diào)用一個(gè) Stateful SessionBean

時(shí),容器必須立即在服務(wù)器中創(chuàng)建一個(gè)新的 Bean 實(shí)例,并關(guān)聯(lián)到客戶機(jī)上,以后此客戶機(jī)

調(diào)用 Stateful SessionBean 的方法時(shí)容器會(huì)把調(diào)用分派到與此客戶機(jī)相關(guān)聯(lián)的 Bean 實(shí)例。

EntityBean:Entity Beans 能存活相對(duì)較長(zhǎng)的時(shí)間,并且狀態(tài)是持續(xù)的。只要數(shù)據(jù)庫(kù)中的數(shù)

據(jù)存在,Entity beans 就一直存活。而不是按照應(yīng)用程序或者服務(wù)進(jìn)程來(lái)說(shuō)的。即使 EJB

容器崩潰了,Entity beans 也是存活的。Entity Beans 生命周期能夠被容器或者 Beans 自

己管理。

EJB 通過(guò)以下技術(shù)管理實(shí)務(wù):對(duì)象管理組織(OMG)的對(duì)象實(shí)務(wù)服務(wù)(OTS),Sun

Microsystems 的 Transaction Service(JTS)、Java Transaction API(JTA),開(kāi)發(fā)組(X/Open)

的 XA 接口。

5、EJB 容器提供的服務(wù)

主要提供聲明周期管理、代碼產(chǎn)生、持續(xù)性管理、安全、事務(wù)管理、鎖和并發(fā)行管理等服務(wù)。

6、EJB 的激活機(jī)制

以 Stateful Session Bean 為例:其 Cache 大小決定了內(nèi)存中可以同時(shí)存在的 Bean 實(shí)例的

數(shù)量,根據(jù) MRU 或 NRU 算法,實(shí)例在激活和去激活狀態(tài)之間遷移,激活機(jī)制是當(dāng)客戶端

調(diào)用某個(gè) EJB 實(shí)例業(yè)務(wù)方法時(shí),如果對(duì)應(yīng) EJB Object 發(fā)現(xiàn)自己沒(méi)有綁定對(duì)應(yīng)的 Bean 實(shí)例

則從其去激活 Bean 存儲(chǔ)中(通過(guò)序列化機(jī)制存儲(chǔ)實(shí)例)回復(fù)(激活)此實(shí)例。狀態(tài)變遷前

會(huì)調(diào)用對(duì)應(yīng)的 ejbActive 和 ejbPassivate 方法。

7、EJB 的幾種類型

會(huì)話(Session)Bean,實(shí)體(Entity)Bean 消息驅(qū)動(dòng)的(Message Driven)Bean

會(huì)話 Bean 又可分為有狀態(tài)(Stateful)和無(wú)狀態(tài)(Stateless)兩種

實(shí)體 Bean 可分為 Bean 管理的持續(xù)性(BMP)和容器管理的持續(xù)性(CMP)兩種

8、客服端調(diào)用 EJB 對(duì)象的幾個(gè)基本步驟

設(shè)置 JNDI 服務(wù)工廠以及 JNDI 服務(wù)地址系統(tǒng)屬性,查找 Home 接口,從 Home 接口調(diào)用

Create 方法創(chuàng)建 Remote 接口,通過(guò) Remote 接口調(diào)用其業(yè)務(wù)方法。

十一. webservice 部分

1、WEB SERVICE 名詞解釋。JSWDL 開(kāi)發(fā)包的介紹。JAXP、JAXM 的解釋。

SOAP、UDDI,WSDL 解釋。

Web ServiceWeb Service 是基于網(wǎng)絡(luò)的、分布式的模塊化組件,它執(zhí)行特定的任務(wù),遵守

具體的技術(shù)規(guī)范,這些規(guī)范使得 Web Service 能與其他兼容的組件進(jìn)行互操作。

JAXP(Java API for XML Parsing) 定義了在 Java 中使用 DOM, SAX, XSLT 的通用的接口。

這樣在你的程序中你只要使用這些通用的接口,當(dāng)你需要改變具體的實(shí)現(xiàn)時(shí)候也不需要修改

代碼。

JAXM(Java API for XML Messaging) 是為 SOAP 通信提供訪問(wèn)方法和傳輸機(jī)制的 API。

WSDL 是一種 XML 格式,用于將網(wǎng)絡(luò)服務(wù)描述為一組端點(diǎn),這些端點(diǎn)對(duì)包含面向文檔信息

或面向過(guò)程信息的消息進(jìn)行操作。這種格式首先對(duì)操作和消息進(jìn)行抽象描述,然后將其綁定

到具體的網(wǎng)絡(luò)協(xié)議和消息格式上以定義端點(diǎn)。相關(guān)的具體端點(diǎn)即組合成為抽象端點(diǎn)(服務(wù))。

SOAP 即簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(Simple Object Access Protocol),它是用于交換 XML 編碼信息

的輕量級(jí)協(xié)議。

UDDI 的目的是為電子商務(wù)建立標(biāo)準(zhǔn);UDDI 是一套基于 Web 的、分布式的、為 Web Service

提供的、信息注冊(cè)中心的實(shí)現(xiàn)標(biāo)準(zhǔn)規(guī)范,同時(shí)也包含一組使企業(yè)能將自身提供的 Web

Service 注冊(cè),以使別的企業(yè)能夠發(fā)現(xiàn)的訪問(wèn)協(xié)議的實(shí)現(xiàn)標(biāo)準(zhǔn)。

2、CORBA 是什么?用途是什么?

CORBA 標(biāo)準(zhǔn)是公共對(duì)象請(qǐng)求代理結(jié)構(gòu)(Common Object Request Broker Architecture),由

對(duì)象管理組織 (Object ManagementGroup,縮寫為 OMG)標(biāo)準(zhǔn)化。它的組成是接口定義語(yǔ)

言(IDL),語(yǔ)言綁定(binding:也譯為聯(lián)編)和允許應(yīng)用程序間互操作的協(xié)議。其目的為:用不同

的程序設(shè)計(jì)語(yǔ)言書寫在不同的進(jìn)程中運(yùn)行,為不同的操作系統(tǒng)開(kāi)發(fā)。

3. Linux

4、LINUX 下線程,GDI 類的解釋。

LINUX 實(shí)現(xiàn)的就是基于核心輕量級(jí)進(jìn)程的"一對(duì)一"線程模型,一個(gè)線程實(shí)體對(duì)應(yīng)一個(gè)核心輕

量級(jí)進(jìn)程,而線程之間的管理在核外函數(shù)庫(kù)中實(shí)現(xiàn)。

GDI 類為圖像設(shè)備編程接口類庫(kù)。

5. 問(wèn)得稀里糊涂的題

6、四種會(huì)話跟蹤技術(shù)

會(huì)話作用域 ServletsJSP 頁(yè)面描述

page 否是代表與一個(gè)頁(yè)面相關(guān)的對(duì)象和屬性。一個(gè)頁(yè)面由一個(gè)編譯好的 Java servlet 類(可

以帶有任何的 include 指令,但是沒(méi)有 include 動(dòng)作)表示。這既包括 servlet 又包括被編

譯成 servlet 的 JSP 頁(yè)面

request 是是代表與 Web 客戶機(jī)發(fā)出的一個(gè)請(qǐng)求相關(guān)的對(duì)象和屬性。一個(gè)請(qǐng)求可能跨越多

個(gè)頁(yè)面,涉及多個(gè) Web 組件(由于 forward 指令和 include 動(dòng)作的關(guān)系)

session 是是代表與用于某個(gè) Web 客戶機(jī)的一個(gè)用戶體驗(yàn)相關(guān)的對(duì)象和屬性。一個(gè) Web

會(huì)話可以也經(jīng)常會(huì)跨越多個(gè)客戶機(jī)請(qǐng)求

application 是是代表與整個(gè) Web 應(yīng)用程序相關(guān)的對(duì)象和屬性。這實(shí)質(zhì)上是跨越整個(gè) Web

應(yīng)用程序,包括多個(gè)頁(yè)面、請(qǐng)求和會(huì)話的一個(gè)全局作用域

7、簡(jiǎn)述邏輯操作(&,|,^)與條件操作(&&,||)的區(qū)別。

區(qū)別主要答兩點(diǎn):a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型,而且可以

操作數(shù)值型

b.邏輯操作不會(huì)產(chǎn)生短路

十二.其他

1、請(qǐng)用英文簡(jiǎn)單介紹一下自己.

4、WEB SERVICE 名詞解釋。JSWDL 開(kāi)發(fā)包的介紹。JAXP、JAXM 的解釋。SOAP、

UDDI,WSDL 解釋。

2、請(qǐng)把 http://tomcat.apache.org/ 首頁(yè)的這一段話用中文翻譯一下?

Apache Tomcat is the servlet container that is used in the officialReference

Implementation for theJava ServletandJavaServerPages technologies. The Java Servlet?

and JavaServer Pagesspecifications are developed by Sun under theJavaCommunity

Process.

Apache Tomcat is developed in an open andparticipatory environment and released under

theApacheSoftware License. Apache Tomcat is intended to be a collaboration ofthe

best-of-breed developers from around the world. We invite you toparticipate in this open

development project. To learn more about gettinginvolved,click here.

ApacheTomcat powers numerous large-scale, mission-critical web applications across

adiverse range of industries and organizations. Some of these users and theirstories are

listed on thePoweredBy wiki page.

3、美資軟件公司 JAVA 工程師電話面試題目

1. Talk about overriding, overloading.

2. Talk about JAVA design patterns you known.

3. Talk about the difference between LinkList, ArrayList and Victor.

4. Talk about the difference between an Abstract class and an Interface.

5. Class a = new Class(); Class b = new Class();

if(a == b) returns true or false, why?

6. Why we use StringBuffer when concatenating strings?

7. Try to explain Singleton to us? Is it thread safe? If no, how to make itthread safe?

8. Try to explain Ioc?

9. How to set many-to-many relationship in Hibernate?

10. Talk about the difference between INNER JOIN and LFET JOIN.

11. Why we use index in database? How many indexes is the maximum in one tableas

your suggestion?

12. When ‘Final’ is used in class, method and property, what dose it mean?

13. Do you have any experience on XML? Talk about any XML tool youused ,e.g. JAXB,

JAXG.

14. Do you have any experience on Linux?

15. In OOD what is the reason when you create a Sequence diagram?

Administrator 10:34:20

1,堆和棧的區(qū)別,有一個(gè)64k 的字符串,是放到堆上,還是放到棧上,為什么?

2,什么時(shí)候用到接口,什么時(shí)候用到抽象類,二者區(qū)別

3,有一個(gè)100萬(wàn)的數(shù)組,里邊有兩個(gè)市重復(fù)的,如何設(shè)計(jì)算法找到。

4,設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),n 維,如何設(shè)計(jì)。

注:出自牛客網(wǎng)-程序員筆試面試題庫(kù),程序員求職備考網(wǎng)站 http://www.nowcoder.com”,學(xué)習(xí)分享,侵刪!??!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容