JSP企業(yè)面試題整理(1)
圖示三層架構(gòu),并說明其特點,如何實現(xiàn),每層實現(xiàn)什么功能?(企業(yè)筆試題)
在兩層應(yīng)用中,應(yīng)用程序直接同數(shù)據(jù)庫進(jìn)行對話。三層結(jié)構(gòu)在用戶接口代碼和數(shù)據(jù)庫中間加入了一個附加的邏輯層,通常這個層叫做“商務(wù)邏輯層”。在“商務(wù)邏輯層”,如果第一層和第二層在不同的計算機(jī)上,通常該層利用的技術(shù)是EJB(Enterprise JavaBean)技術(shù)、CORBA(Common Object Request Broker Architecture)技術(shù)和DCOM技術(shù)(Distributed Component Object Model,分布式組件對象模型)。在Java企業(yè)應(yīng)用領(lǐng)域中,表示邏輯層通??梢允荋TML、Applet和JSP,商務(wù)邏輯層一般利用EJB來實現(xiàn)
Java包含哪三個版本,每個版本有什么功能,各個版本的應(yīng)用領(lǐng)域?
SUN以J2EE為核心推出SUN-ONE(SUN Open Network Environment)戰(zhàn)略,該戰(zhàn)略包括三個部分:J2SE(Java 2 Standard Edition,Java 2標(biāo)準(zhǔn)版)、J2ME(Java 2 Micro Edition,Java 2微型版)和J2EE。
J2SE主要:用于創(chuàng)建典型的桌面與工作站應(yīng)用的Java平臺。從配置上來說,只要安裝JDK(Java Development Kit),就建立了一個J2SE開發(fā)和運行平臺。
J2ME主要用于創(chuàng)建嵌入式應(yīng)用程序(如PDA、儀表),J2ME開發(fā)平臺需要J2SE平臺的支持。開發(fā)領(lǐng)域包括:高端的信息家電,比如:電視機(jī)頂盒,網(wǎng)絡(luò)電視和網(wǎng)絡(luò)可視電話等,低端的信息家電,比如手機(jī),尋呼機(jī)和PDA等。
J2EE的任務(wù)是提供一個平臺獨立的、便攜式、多用戶、安全以及標(biāo)準(zhǔn)的企業(yè)級平臺,服務(wù)器端部署用Java技術(shù)來完成。J2EE主要用于創(chuàng)建可擴(kuò)展的企業(yè)應(yīng)用,包括13種核心技術(shù)規(guī)范
1-3 名詞解釋:EJB JNDI RMI。(企業(yè)筆試題)
EJB(Enterprise Java Bean,企業(yè)級JavaBean)J2EE體系的最核心技術(shù)是EJB,提供了一個框架來開發(fā)分布式商務(wù)邏輯,顯著地簡化了具有可伸縮性和高度復(fù)雜的企業(yè)級應(yīng)用的開發(fā)
JNDI(Java Naming and Directory Interface,Java命名和目錄接口)JNDI用于名字和目錄服務(wù),提供了一致的接口來存取和操作企業(yè)級的資源,如DNS(Domain Name Service)和本地文件系統(tǒng)等
RMI(Remote Method Invocation,遠(yuǎn)程方法調(diào)用)RMI是在遠(yuǎn)程對象上調(diào)用一些方法,使用了連續(xù)的方式在客戶端和服務(wù)器端傳遞數(shù)據(jù),RMI是EJB技術(shù)基礎(chǔ)
JSP企業(yè)面試題整理(2)
2-1 簡述Java語言的核心機(jī)制。
Java語言包含三種核心機(jī)制:Java 虛擬機(jī)、垃圾收集機(jī)制和代碼安全檢測。
1、Java 虛擬機(jī)(Java Virtual Machine,JVM)
在一臺計算機(jī)上由軟件或硬件模擬的計算機(jī)。Java虛擬機(jī)讀取并處理經(jīng)編譯過的平臺無關(guān)的字節(jié)碼class文件。
2、垃圾收集機(jī)制(Garbage collection)
在C/C++ 等語言中,由程序員負(fù)責(zé)回收無用內(nèi)存。Java語言解除了程序員回收無用內(nèi)存空間的責(zé)任。它提供一種系統(tǒng)級線程跟蹤存儲空間的分配情況。并在JVM的空閑時,檢查并釋放那些可被釋放的存儲器空間。垃圾收集在Java程序運行過程中自動進(jìn)行,程序員無法精確控制和干預(yù)。
3、代碼安全性檢測(Code Security)
Java執(zhí)行代碼的時候,由JVM對運行的代碼進(jìn)行安全性檢測,當(dāng)進(jìn)行一些非法操作的時候,比如修改一些系統(tǒng)設(shè)置的時候,JVM會發(fā)出警告。
2-2 比較基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別。
Java 語言共有八種基本數(shù)據(jù)類型:四種整數(shù)類型(byte、short、int、long),兩種浮點數(shù)類型(float、double),一種字符類型(char),一種布爾類型(boolean)。
Java語言中除8種基本數(shù)據(jù)類型以外的數(shù)據(jù)類型稱為引用類型,也叫做復(fù)合數(shù)據(jù)類型。在程序中聲明的引用類型變量只是為該對象起的一個名字,或者說是對該對象的引用,變量的值是對象在內(nèi)存空間中的存儲地址而不是對象本身,這就是稱之為引用類型的原因
2-4 構(gòu)造函數(shù)有什么作用?簡述重載構(gòu)造函數(shù)的好處。
構(gòu)造函數(shù)也叫構(gòu)造方法,是Java類中的一種特殊方法,其功能是創(chuàng)建其所屬類型的一個新的對象。聲明構(gòu)造方法的語法規(guī)則如下:
< modifiers> <class_name>([< argu_list>]) {
[< statements>]
}
從中可以看到,構(gòu)造方法與普通方法在聲明上的區(qū)別是,構(gòu)造方法沒有返回值類型、構(gòu)造方法必須取和所屬類相同的名字。
在定義Java類時可以根據(jù)需要定義一個或多個構(gòu)造方法,通常在構(gòu)造方法中進(jìn)行一些初始化工作。
2-5 簡述super、static和final的功能和作用。
如果子類中發(fā)生了方法重寫,那么子類對象能調(diào)用父類中重寫前的方法,Java語言允許在子類中使用關(guān)鍵字super來引用父類的方法。
在Java類中聲明屬性和方法時,可使用關(guān)鍵字static做為修飾符。static標(biāo)記的變量或方法由整個類共享,如訪問控制權(quán)限允許,可不必創(chuàng)建該類對象而直接用類名加‘.’調(diào)用。
在Java中聲明類、屬性和方法時,可使用關(guān)鍵字final來修飾。final所標(biāo)記的成分具有“終態(tài)”的特征,其具體規(guī)定如下:
l final標(biāo)記的類不能被繼承。
l final標(biāo)記的方法不能被子類重寫。
l final標(biāo)記的變量(成員變量或局部變量)即成為常量,只能賦值一次。
2-6 集合元素:集合、散列表和枚舉的特點和作用。
常用的集合元素有:向量(Vector)、枚舉(Enumeration)、散列表(Hashtable)和屬性(Properties)等
向量(Vector)不要求每個元素的類型相同,向量中可以混合多種數(shù)據(jù)類型。向量可以在增加元素時動態(tài)增大。
向量提供了集合內(nèi)容的順序訪問,散列表可以對集合內(nèi)容進(jìn)行隨機(jī)訪問,散列表提供的主要方法及其說明為。
l 用put(Object key,Object value)加進(jìn)關(guān)鍵字/數(shù)值對
l 用get(Object key)取得一個關(guān)鍵字的值
枚舉也可以存放許多元素。一般用來存儲其他集合的返回值。
2-7 關(guān)鍵字throw和throws的區(qū)別?(企業(yè)筆試題)
可以利用throw關(guān)鍵字自己拋出異常。
Throws一般在定義函數(shù)的時候使用,表明函數(shù)被調(diào)用的時候要拋出異常。
2-8 Java實現(xiàn)線程有幾種方式,各有什么優(yōu)點?
創(chuàng)建線程有兩種方式:使用Runnable接口和繼承Thread類。使用Runnable接口的實現(xiàn)類來提供線程體,這是創(chuàng)建線程的基本方式。還可以采用直接繼承Thread類、重寫其中的run()方法并以之作為線程體的方式創(chuàng)建線程,
兩種創(chuàng)建線程方式的有兩方面的區(qū)別。
l 使用Runnable接口創(chuàng)建線程時可以將CPU,代碼和數(shù)據(jù)分開,形成清晰的模型。線程體run()方法所在的類還可以從其他類繼承一些有用的屬性或方法,并有利于保持程序風(fēng)格的一致性。
l 直接繼承Thread類創(chuàng)建線程時,Thread子類無法再從其他類繼承。但這種情況編寫簡單,run()方法的當(dāng)前對象就是線程對象,可直接操縱。
4-1. 有幾種方法實現(xiàn)頁面的跳轉(zhuǎn),如何實現(xiàn)?
jsp:forward操作指令用于把當(dāng)前的JSP頁面轉(zhuǎn)發(fā)到另一個頁面上。基本語法為:“<jsp:forward page="test2.jsp"/>”,使用該功能時,瀏覽器的地址欄中地址不會發(fā)生任何變化。
對于response對象,最常用到的是sendRedirect()方法,可以使用這個方法將當(dāng)前客戶端的請求轉(zhuǎn)到其它頁面去。相應(yīng)的代碼格式為:“response.sendRedirect("URL地址");
4-2 synchronized關(guān)鍵字有什么功能?
,一般會在函數(shù)前面加上synchronized關(guān)鍵字,功能是當(dāng)前一個用戶在執(zhí)行該方法的時候,其他的用戶必須等待,直到該用戶完成操作
4-3. out對象有什么功能,out.print和document.write有什么區(qū)別?
out對象是javax.servlet.jsp.JspWriter類的一個子類的對象,它的作用是把信息回送到客戶端的瀏覽器中。在out對象中,最常用的方法就是print()和println()。在使用print()或println()方法時,由于客戶端是瀏覽器,因此向客戶端輸出時,可以使用HTML中的一些標(biāo)記,例如:“out.println("<h1>Hello,JSP</h1>");
out.print是JSP代碼, 被服務(wù)器解釋執(zhí)行。
Document.write是JavaScript代碼,被客戶端瀏覽器解釋執(zhí)行。
4-4. 如何獲得獲得客戶端的IP地址?
利用request對象可以獲得客戶提交的信息,比如:JSP文件目錄、客戶端的地址、以及服務(wù)器的端口等、
<BR>獲取客戶的IP地址:
<% String IP=request.getRemoteAddr();
out.println(IP);%>
4-5. application對象有什么特點?和session對象有什么聯(lián)系和區(qū)別?
站點所有的用戶公用一個application對象,當(dāng)站點服務(wù)器開啟的時候,application就被創(chuàng)建,直到網(wǎng)站關(guān)閉。
可以使用Session 對象存儲用戶登錄網(wǎng)站時候的信息。當(dāng)用戶在頁面之間跳轉(zhuǎn)時,存儲在Session對象中的變量不會被清除
聯(lián)系是:數(shù)據(jù)都存儲在服務(wù)器端,而且都可以保留一段時間。
區(qū)別是:每個用戶有一個session,但是application是共有的。
4-6. 程序如何向瀏覽器寫入Cookie集合,如何從瀏覽器端讀取Cookie集合。
Cookie對象是由Web服務(wù)器端產(chǎn)生后被保存到瀏覽器中的信息。Cookie對象可以用來保存一些小量的信息在瀏覽器中。目前主流的瀏覽器(Internet Explorer和Netscape Navigator)都支持Cookie。
案例名稱:寫入Cookie
程序名稱:4-25.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%
String strName = "Zhourunfa";
Cookie c = new Cookie("Name1", strName);
response.addCookie(c);
%>
案例名稱:讀出Cookie
程序名稱:4-26.jsp
<%@ page contentType="text/html;charset=GBK" %>
<HTML><BODY>
<%
Cookie cookies[] = request.getCookies();
for(int i=0; i<cookies.length; i++) {
if(cookies[i].getName().equals("Name1"))
out.print(cookies[i].getValue());
}
%>
JSP企業(yè)面試題整理(4)
5-1. 簡述Servlet和JSP的關(guān)系。
JSP是以另外一種方式實現(xiàn)的Servlet,Servlet是JSP的早期版本,在JSP中,更加注重頁面的表現(xiàn),而在Servlet中則更注重業(yè)務(wù)邏輯的實現(xiàn)。
因此,當(dāng)編寫的頁面顯示效果比較復(fù)雜時,首選是JSP?;蛘咴陂_發(fā)過程中,HTML代碼經(jīng)常發(fā)生變化,而Java代碼則相對比較固定時,可以選擇JSP。而我們在處理業(yè)務(wù)邏輯時,首選則是Servlet。
同時,JSP只能處理瀏覽器的請求,而Servlet則可以處理一個客戶端的應(yīng)用程序請求。因此,Servlet加強(qiáng)了Web服務(wù)器的功能。
5-2. 簡述Servlet的生命周期。(企業(yè)筆試題)
Servlet運行機(jī)制和Applet類似,Servlet是載服務(wù)器端運行的,但是Applet是在客戶端運行的。Servlet是javax.servlet包中HttpServlet類的子類,由服務(wù)器完成該子類的創(chuàng)建和初始化。
Servlet的生命周期主要由3個過程組成。
1、init()方法:服務(wù)器初始化Servlet。
2、service()方法:初始化完畢,Servlet對象調(diào)用該方法相應(yīng)客戶的請求。
3、destroy()方法:調(diào)用該方法消滅Servlet對象。
其中,init()方法只在Servlet第一次被請求加載的時候被調(diào)用一次,當(dāng)有客戶再請求Servlet服務(wù)時,Web服務(wù)器將啟動一個新的線程,在該線程中,調(diào)用service方法相應(yīng)客戶的請求。
5-3. 簡述HttpSession接口的功能和使用方法。(企業(yè)筆試題)
這是一個java.servelt.http包中的接口,它封裝了會話的概念。定義為:“public interface HttpSession”,可以使用HttpServletRequest對象的getSession()方法來得到這種類型的對象,語法為:“HttpSession session = request.getSession();”。
5-5. 編寫一個HTML文件,利用Servelt的doPost方法實現(xiàn)Form表單內(nèi)容的讀取。(上機(jī)完成)(企業(yè)筆試題)
案例名稱:使用doGet和doPost方法
程序名稱:j5_02.htm
<HTML>
<BODY>
<FORM ACTION="/doget" METHOD="get">
請輸入姓名:
<INPUT TYPE="TEXT" NAME="myname"><br>
您的興趣:
<SELECT NAME="love">
<OPTION value="Sleep">Sleep</OPTION>
<OPTION value="Dance">Dance</OPTION>
<OPTION value="Travel">Travel</OPTION>
</SELECT><br>
<INPUT TYPE="SUBMIT" NAME="mysubmit"><br>
<INPUT TYPE="RESET" VALUE="重新來過"><br>
</FORM>
</BODY>
</HTML>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class j5_03 extends HttpServlet
{
//重寫doPost方法
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
//首先設(shè)置頭信息
res.setContentType("text/html");
//用 writer方法返回響應(yīng)數(shù)據(jù)
PrintWriter out = res.getWriter();
out.println("<html><head></head><body>");
out.println("name: " + req.getParameter("myname"));
out.println("<br>");
out.println("love: " + req.getParameter("love"));
out.println("</body></html>");
out.close();
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException,IOException{
doPost(req,res);
}
}
6-1 什么是組件?使用組件有什么優(yōu)點?
現(xiàn)在軟件開發(fā)都已經(jīng)轉(zhuǎn)向了基于組件的開發(fā),目前具備代表性的組件技術(shù)有微軟的COM、COM+,有Sun的JavaBean和EJB(Enterprise Java Bean),另外還有CORBA(Common Object Request Broker Architecture,公共對象請求代理結(jié)構(gòu))
JavaBean規(guī)范將“軟件組件”的概念引入到Java編程的領(lǐng)域。組件是自包含的、可重用的軟件單元;而JavaBean組件,則可以使用可視的應(yīng)用程序開發(fā)工具,可視地將它們編寫到Java程序中。JavaBean規(guī)范為Java開發(fā)人員提供了一種“組件化”其Java類的方法
6-2 編寫JavaBean的時候,要注意哪些?
1、如果類的成員變量的名字是xxx,那么為了更改或獲取成員變量的值,在類中使用兩個方法:
getXxx(),用來獲取屬性xxx。
setXxx(),用來修改屬性xxx。
2、對于boolean類型的成員變量,允許使用is代替get和set。
3、類中方法的訪問屬性必須是public的。
4、類中如果有構(gòu)造方法,那么這個構(gòu)造方法也是public的,并且是無參數(shù)的。
6-3 簡述JSP的設(shè)計模式。(企業(yè)筆試題)
JSP設(shè)計模式包括兩個:(1)Model1,JSP+JavaBean設(shè)計模式。(2)Model2,MVC設(shè)計模式。
在這種模式中,JSP頁面獨自響應(yīng)請求并將處理結(jié)果返回客戶,所有的數(shù)據(jù)庫操作通過JavaBean來實現(xiàn)。大量地使用這種模式,常會導(dǎo)致在JSP頁面中嵌入大量的Java代碼,當(dāng)需要處理的商業(yè)邏輯非常復(fù)雜時,這種情況就會變得很糟糕。大量的Java代碼使得JSP頁面變得非常臃腫。前端的頁面設(shè)計人員稍有不慎,就有可能破壞關(guān)系到商業(yè)邏輯的代碼。
“MVC”模式即是:“Model-View-Controller”模式。在這種模式中,通過JSP技術(shù)來表現(xiàn)頁面,通過Servlet技術(shù)來完成大量的事務(wù)處理工作,實現(xiàn)用戶的商業(yè)邏輯。
在這種模式中,Servlet用來處理請求的事務(wù),充當(dāng)了控制器(Controller即“C”)的角色,Servlet負(fù)責(zé)響應(yīng)客戶對業(yè)務(wù)邏輯的請求并根據(jù)用戶的請求行為,決定將哪個JSP頁面發(fā)送給客戶。JSP頁面處于表現(xiàn)層,也就是視圖(View即“V”)的角色。JavaBean則負(fù)責(zé)數(shù)據(jù)的處理,也就是模型(Model即“M”)的角色。
JSP企業(yè)面試題整理(5)
7-2 圖示JDBC的工作原理,并列舉常用的對象。(企業(yè)筆試題)
建立是建立與數(shù)據(jù)庫之間的連接,也就是創(chuàng)建一個Connection的實例。DriverManager類的getConnection()方法將建立數(shù)據(jù)庫的連接:
Statement對象用于將SQL語句發(fā)送到數(shù)據(jù)庫中。存在3種Statement對象:(1)Statement;(2)PreparedStatement(從Statement繼承而來);(3)CallableStatement(從PreparedStatement繼承而來)。
ResultSet包含符合SQL語句執(zhí)行結(jié)果所有行,并且它通過一套get方法提供了對這些行中數(shù)據(jù)的訪問
7-3 如圖7-16,要求:查找 “張三”選擇所有課程的名稱,寫出SQL語句。(企業(yè)筆試題)
SELECT c.cname FROM sc a, student b, course c
WHERE a.cno=c.cno
AND a.sno=b.sno and b.sname ='張三'
7-4 下面的代碼段是否正確?請說明。(企業(yè)筆試題)
pst = conn.prepareStatement("INSERT INTO grade(學(xué)號) VALUES (?)");
for (int i = 101; i < 111; i++) {
pst.setInt(1, i);
pst.addBatch();
}
pst.execute ();
}
錯,pst.executeBatch();
7-5 簡述事務(wù)的基本概念,如何在JDBC中實現(xiàn)事務(wù)?
事務(wù)是一些事件的集合,執(zhí)行一條SQL語句可以理解成一個事件。事務(wù)中包含多個事件,如果每一個事件都能執(zhí)行成功的時候,事務(wù)才執(zhí)行,如果有任何一個事件不能成功執(zhí)行,事務(wù)的其他事件也不被執(zhí)行
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
stmt.executeUpdate(strSQL1);
stmt.executeUpdate(strSQL2);
conn.commit();
}
catch (Exception e) {
conn.rollback();
e.printStackTrace();
}
finally {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
conn.setAutoCommit(defaultCommit);
7-6 結(jié)果集類型和結(jié)果集并發(fā)性各有幾種情況,有什么作用。
決定這個Statement對象創(chuàng)建的ResultSet對象是否可以滾動,還可以指定結(jié)果集是否對數(shù)據(jù)庫中的修改敏感。使用ResultSet類中的int常量來表示結(jié)果集類型,結(jié)果集類型有3種:
l ResultSet.TYPE_FORWORD_ONLY:指定ResultSet對象是不可滾動,這是默認(rèn)值。
l ResultSet.TYPE_SCOLL_INSENSITIVE:指定ResultSet對象是可滾動的,但是對數(shù)據(jù)庫中修改不敏感。
l ResultSet.TYPE_SCOLL_SENSITIVE:指定ResultSet對象是可滾動的,而且對數(shù)據(jù)庫的修改敏感。
結(jié)果集的并發(fā)性(Concurrency)決定ResultSet對象是否可以修改數(shù)據(jù)庫中的行。可以使用ResultSet類中定義的int常量來指定結(jié)果集的并發(fā)性。
l ResultSet.CONCUR_READ_ONLY,指定ResultSet對象不能修改數(shù)據(jù)庫,默認(rèn)值。
ResultSet.CONCUR_UPDATABLE,指定ResultSet對象可以修改數(shù)據(jù)庫。