版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Java程序員面試分類模擬12論述題1.
什么是守護線程正確答案:Java提供了兩種線程:守護線程與用戶線程。守護線程又被稱為“服務進程”“精靈線程”或“后臺線程”,是指在程序運行時在后臺提供一種(江南博哥)通用服務的線程,這種線程并不屬于程序中不可或缺的部分。通俗點講,任何一個守護線程都是整個JVM中所有非守護線程的“保姆”。
用戶線程和守護線程幾乎一樣,唯一的不同之處就在于如果用戶線程已經全部退出運行,只剩下守護線程存在了,JVM也就退出了。因為當所有非守護線程結束時,沒有了被守護者,守護線程也就沒有工作可做了,也就沒有繼續(xù)運行程序的必要了,程序也就終止了,同時會“殺死”所有守護線程。也就是說,只要有任何非守護線程還在運行,程序就不會終止。
在Java語言中,守護線程一般具有較低的優(yōu)先級,它并非只由JVM內部提供,用戶在編寫程序時也可以自己設置守護線程,例如,將一個用戶線程設置為守護線程的方法就是在調用start()方法啟動線程之前調用對象的setDaemon(true)方法,若將以上參數設置為false,則表示的是用戶進程模式。需要注意的是,當在一個守護線程中產生了其他線程,那么這些新產生的線程默認還是守護線程,用戶線程也是如此,示例如下:
classThreadDemoextendsThread{
publicvoidrun(){
System.out.println(Thread.currentThread().getName()+":begin");
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStaekTrace();
}
System.out.println(Thread.currentThread().getName()+":end");
}
}
publicclassTest{
publicstaticvoidmain(string[]args){
System.out.println("test3:begin");;
Threadt1=newThreadDemo();
t1.setDaemon(true);
t1.start();
System.out.println("test3:end");
}
}
程序運行結果為:
test3:begin
test3:end
Thread-0:begin
從運行結果中可以發(fā)現,沒有輸出Thread-0:end。之所以結果是這樣,是在啟動線程前將其設置為守護線程了,當程序中只有守護線程存在時,JVM是可以退出的,也就是說,當JVM中只有守護線程運行時,JVM會自動關閉。因此,當test3方法調用結束后,。main線程將退出,此時線程t1還處于休眠狀態(tài)沒有運行結束,但是由于此時只有這個守護線程在運行,JVM將會關閉,因此不會輸出“Thread-0:end”。
守護線程的一個典型的例子就是垃圾回收器。只要JVM啟動,它始終在運行,實時監(jiān)控和管理系統(tǒng)中可以被回收的資源。
常見筆試題:
1.Java的Daemon線程,setDaemon設置必須要______。
A.在調用start()方法之前
B.調用在start()方法之后
C.前后都可以
答案:A。見上面講解。
2.關于守護線程的說法,正確的是______。
A.所有非守護線程終止,即使存在守護線程,進程運行終止
B.所有守護線程終止,即使存在非守護線程,進程運行終止
C.只要有守護線程或者非守護進程其中之一存在,進程就不會終止
D.只要所有守護線程和非守護線程終止運行之后,進程才會終止
答案:A。見上面講解。
2.
join()方法的作用是什么正確答案:在Java語言中,join()方法的作用是讓調用該方法的線程在執(zhí)行完run()方法后,再執(zhí)行join方法后面的代碼。簡單點說,就是將兩個線程合并,用于實現同步功能。具體而言,可以通過線程A的join()方法來等待線程A的結束,或者使用線程A的join(2000)方法來等待線程A的結束,但最多只等待2s,示例如下:
publicclassJoinTest{
publicstaticvoidmain(String[]args){
Threadt=newThread(newThreadImp());
t.start();
tfy
{
t.join(1000);//主線程等待t結束,只等1秒
if(t.isAlive())//t已經結束
System.out.println("thasnotfinished");
else
System.out.println("thasfinished");
System.out.println("joinFinish");
}
catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
classThreadImpimplementsRunnable{
publicvoidrun(){
try{
System.out.println("BeginThreadImp");
Thread.sleep(5000);
System.out.println("EndThreadImp");
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
程序運行結果為:
BeginThreadImp
thasnotfinished
joinFinish
EndThreadImp
3.
如何通過JDBC訪問數據庫正確答案:Java數據庫連接(JavaDataBaseConnectivity,JDBC)用于在Java程序中實現數據庫操作功能,它提供了執(zhí)行SQL語句、訪問各種數據庫的方法,并為各種不同的數據庫提供統(tǒng)一的操作接口,java.sql包中包含了JDBC操作數據庫的所有類。通過JDBC訪問數據庫一般有如下幾個步驟:
1)加載JDBC驅動器。將數據庫的JDBC驅動加載到classpath中,在基于JavaEE的Web應用開發(fā)過程中,通常要把目標數據庫產品的JDBC驅動復制到WEB-INF/lib下。
2)加載JDBC驅動,并將其注冊到DriverManager中。一般使用反射Class.forName(StringdriveName)。
3)建立數據庫連接,取得Connection對象。一般通過DriverManager.getConnection(url,username,passwd)方法實現,其中,url表示連接數據庫的字符串,username表示連接數據庫的用戶名,passwd表示連接數據庫的密碼。
4)建立Statement對象或是PreparedStatement對象。
5)執(zhí)行SQL語句。
6)訪問結果集ResultSet對象。
7)依次將ResuhSet、Statement、PreparedStatement、Connection對象關閉,釋放掉所占用資源,例如rs.close(),con.close()等。為什么要這么做呢?原因在于JDBC驅動在底層通常都是通過網絡IO實現SQL命令與數據傳輸的。
常見筆試題:
1.舉出一個用JDBC訪問MySQL的例子。
答案:首先,創(chuàng)建Employee表。
createtableEmployee(
idintprimarykey,
namevarehar(20),
ageint
);
其次,創(chuàng)建一個示例程序,如下所示。
importjava.sql.*;
publicclassTest{
publicstaticvoidmain(String[]args)throwsException{
Stringuser="user1";
Stringpassword="pwd1";
Stringurl="jdbc:mysql://localhost:3306/Test";
Stringdriver="com.mysql.jdbc.Driver";
Connectioncon=null;
Statementstmt=null;
ResultSetrs=null;
try{
Class.forName(driver);
con=DriverManager.getConnection(url,user,password);
stmt=con.createStatement();
stmt.execute("insertintoEmployeevalues(1,'James1',25)");
stmt.execute("insertintoEmployeevalues(2,'James2',26)");
rs=stmt.executeQuery("select*fromEmployee");
while(rs.next()){
System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getInt(3));
}
}
catch(SQLExceptione1){
e1.printStackTrace();
}finally{
try{
if(rs!=null)rs.close();
if(stmt!=null)stmt.close();
if(con!=null)con.close();
}catch(SQLExceptione){
System.out.println(e.getMessage());
}
}
}
}
程序運行結果為:
1James125
2James226
2.JDBC的主要功能有______。
A.創(chuàng)建與數據庫的連接
B.發(fā)送SQL語句到數據庫中
C.處理數據并查詢結果
D.以上都是
答案:D。見上面講解。
3.提供Java存取數據庫能力的包是______。
A.java.sql
B.java.awt
C.java.lang
D.java.swing
答案:A。對數據庫操作的所有類都在java.sql包中。
4.
JDBC處理事務采用什么方法正確答案:一個事務是由一條或多條對數據庫操作的SQL語句所組成的一個不可分割的工作單元,只有當事務中的所有操作都正常執(zhí)行完了,整個事務才會被提交給數據庫。在JDBC中,一般是通過commit()方法或rollback()方法來結束事務的操作。其中commit()方法表示完成對事務的提交,rollback()方法表示完成事務回滾,多用于在處理事務的過程中出現了異常的情況,這兩種方法都位于java.sql.Connection類中。一般而言,事務默認操作是自動提交,即操作成功后,系統(tǒng)將自動調用commit()方法,否則將調用rollback()方法。
當然,在JDBC中,也可以通過調用setAutoCommit(false)方法來禁止自動提交,然后就可以把多個數據庫操作的表達式作為一個事務,在操作完成后調用commit()方法實現整體提交,如果其中一個表達式操作失敗,就會拋出異常而不會調用commit()方法。在這種情況下,就可以在異常捕獲的代碼塊中調用rollback()方法進行事務回滾。通過此種方法可以保持對數據庫的多次操作后,數據仍然保持一致性。
引申:JDBC有哪些事務隔離級別?
為了解決與“多個線程請求相同數據”相關的問題,事務之間通常會用鎖相互隔離開。如今,大多數主流的數據庫支持不同類型的鎖。因此,JDBCAPl支持不同類型的事務,它們由Connection對象指派或確定。在JDBC中,定義了以下5種事務隔離級別:
1)TRANSACTION_NONEJDB。不支持事務。
2)TRANSACTTON_READ_UNCOMMITTED。未提交讀。說明在提交前一個事務可以看到另一個事務的變化。這樣讀“臟”數據、不可重復讀和虛讀都是允許的。
3)TRANSACTION_READ_COMMITTED。已提交讀。說明讀取未提交的數據是不允許的。這個級別仍然允許不可重復讀和虛讀產生。
4)TRANSACTION_REPEATABLE_READ??芍貜妥x。說明事務保證能夠再次讀取相同的數據而不會失敗,但虛讀仍然會出現。
5)TRANSACTION_SERIALIZABLE。可序列化。是最高的事務級別,它防止讀“臟”數據、不可重復讀和虛讀。
(備注:①讀“臟”數據。一個事務讀取了另一個事務尚未提交的數據,例如,當事務A與事務B并發(fā)執(zhí)行時,當事務A更新后,事務B查詢讀取到A尚未提交的數據,此時事務A回滾,則事務B讀到的數據是無效的“臟”數據。②不可重復讀。一個事務的操作導致另一個事務前后兩次讀取到不同的數據,例如,當事務A與事務B并發(fā)執(zhí)行時,當事務B查詢讀取數據后,事務A更新操作更改事務B查詢到的數據,此時事務B再次讀去該數據,發(fā)現前后兩次的數據不一樣。③虛讀。一個事務的操作導致另一個事務前后兩次查詢的結果數據量不同,例如,當事務A與事務B并發(fā)執(zhí)行時,當事務B查詢讀取數據后,事務A新增或刪除了一條滿足事務A的查詢條件的記錄,此時,事務B再次查詢,發(fā)現查詢到前次不存在的記錄,或者前次的某個記錄不見了。)
事務隔離級別越高,為避免沖突所花的精力也就越多。可以通過Connection對象的conn.setTransactionLevel()方法來設置隔離級別,通過conn.getTransactionIsolation()方法來確定當前事務的級別。
5.
Class.forName的作用是什么正確答案:在Java語言中,任何類只有被裝載到JVM上才能運行。Class.forName()方法的作用就是把類加載到JVM中,它會返回一個與帶有給定字符串名的類或接口相關聯的Class對象,并且JVM會加載這個類,同時JVM會執(zhí)行該類的靜態(tài)代碼段。
在使用JDBC連接數據庫前,一般都會調用Class.forName("com.mysql.jdbc.Driver")方法來加載JDBC驅動,那么是否一定需要調用這個方法呢?如果是,那為什么要調用這個方法呢?其實,并不一定非要調用這種方法,例如Testt=(Test)Class.forName("Test").newInstance()語句和Testt=newTest()語句就具有相同的效果,所以使用new也可以,但二者的區(qū)別也非常明顯:創(chuàng)建對象的方式不同。前者使用類加載機制,后者是創(chuàng)建了一個新的類。使用第一種方法往往能提高軟件的可擴展性,例如,一個軟件項目開發(fā)后會被多家公司來使用,每家公司的處理流程大致相同,只有個別公司的業(yè)務邏輯不同,在開發(fā)過程中,完全可以把不通用的地方抽取出來定義成一個接口BussinessInterface,針對每個公司不同的業(yè)務流程定義不同的實現類sub1、sub2、sub3等,通過創(chuàng)建不同的子類來完成不同公司的業(yè)務需求。為了達到良好的可擴展性,可以把子類采用配置文件的方式放到XML文件中。在程序部署時,只需要從讀配置文件中讀取類名className,然后采用BussinessInterfaceb=(BussinessInterface)Class.forName(className).newInstance()創(chuàng)建實例即可提高開發(fā)人員的開發(fā)效率。當以后再有新的需求時,即使開發(fā)了新的子類,也不需要修改創(chuàng)建實例的代碼,只需要修改配置文件即可,從而使得程序具有很好的可擴展性。
JDBC規(guī)范中要求Driver類在使用前必須向DriverManager注冊自己,所以,當執(zhí)行Class.forName("com.mysql.jdbc.Driver")時,JVM會加載名字為"com.mysql.jdbc.Driver"對應的Driver類,而com.mysql.Driver類的實現如下例所示:
publicclassDriverextendsNonRegisteringDrjverimplementsJava.sql.Driver{
static{
try{
java.sql.DriverManager.registerDriver(newDriver());
}catch(SQLExceptionE){
thrownewRuntimeException("Can'tregisterdriver!");
}
}
}
在調用Class.forName()方法時,這個Driver類被加載了,由于靜態(tài)部分被執(zhí)行,因此Driver也被注冊到了DriverManager中。
6.
Statement、PreparedStatement和CallableStatement有什么區(qū)別正確答案:Statement用于執(zhí)行不帶參數的簡單SQL語句,并返回它所生成結果的對象,每次執(zhí)行SQL語句時,數據庫都要編譯該SQL語句。以下是一個最簡單的SQL語句:
Statementstrut=corm.getStatement();
stmt.executeUpdate("insertintoclientvalues('aa','aaaa')");
PreparedStatement表示預編譯的SQL語句的對象,用于執(zhí)行帶參數的預編譯SQL語句。
CallableStatement則提供了用來調用數據庫中存儲過程的接口,如果有輸出參數要注冊,說明是輸出參數。下面給出一個使用PreparedStatement的例子:
importjava.sql.*;
publicclassTest{
publicstaticvoidmain(String[]args)throwsException{
Stringuser="user1";
Stringpassword="pwd1";
Stringurl="jdbc:mysql://localhost:3306/Test";
Stringdriver="com.mysql.jdbc.Driver";
Connectioncon=null;
PreparedStatementstmt=null;
ResultSetrs=null;
try{
Class.forName(driver);
con=DriverManager.getConnection(url,user,password);
stmt=con.prepareStatement("select*fromEmployeewhereid=?");
stmt.setInt(1,1);//傳遞參數(第一個問號,傳遞的值)
rs=stmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt(1)+""+rs.getString(2)+""+rs.getInt(3));
}
}
catch(SQLExceptione1){
e1.printStackTrace();
}finally{
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
catch(SQLExceptione){
System.out.println(e.getMessage());
}
}
}
}
程序運行結果為:
1James125
雖然Statemetlt對象與PreparedStatement對象能夠完成相同的功能,但相比之下,PreparedStatement具有以下優(yōu)點:
1)效率更高。在使用PreparedStatement對象執(zhí)行SQL命令時,命令會被數據庫進行編譯和解析,并放到命令緩沖區(qū)。然后,每當執(zhí)行同一個PreparedStatement對象時,由于在緩沖區(qū)中可以發(fā)現預編譯的命令,雖然它會被再解析一次,但不會被再次編譯,是可以重復使用的,能夠有效提高系統(tǒng)性能,因此,如果要執(zhí)行插入、更新、刪除等操作,最好使用PreparedStatement。鑒于此,PreparedStatement適用于存在大量用戶的企業(yè)級應用軟件中。
2)代碼可讀性和可維護性更好。以下兩種方法分別使用Statement與PreparedStatement來執(zhí)行SQL語句,顯然方法2具有更好的可讀性。
方法1:
stmt.executeUpdate("insertintot(col1,col2)values('"+var1+"','"+vat2+"')");
方法2:
perstmt=con.prepareStatement("insertintotb_name(col1,col2)values(?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
3)安全性更好。使用PreparedStatement能夠預防SQL注入攻擊,所謂SQL注入,指的是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器,達到執(zhí)行惡意SQL命令的目的。注入只對SQL語句的編譯過程有破壞作用,而執(zhí)行階段只是把輸入串作為數據處理,不再需要對SQL語句進行解析,因此也就避免了類似select*fromuserwherename='aa'andpassword='bb'or1=1的SQL注入問題的發(fā)生。
CallableStatement由prepareCall()方法所創(chuàng)建,它為所有DBMS(DatabaseManagementSystem,數據庫管理系統(tǒng))提供了一種以標準形式調用已儲存過程的方法。它從PreparedStatement中繼承了用于處理輸入參數的方法,而且還增加了調用數據庫中的存儲過程和函數以及設置輸出類型參數的功能。
常見筆試題:
用于調用存儲過程的對象是______。
A.ResultSet
B.DriverManager
C.CallableStatemet
D.PreparedStatement
答案:C。JDBC中的CallableStatement對象為所有RDBMS(RelationalDatabaseManagementSystem,關系數據庫管理系統(tǒng))提供了一種標準形式調用存儲過程的方法。其對存儲過程的調用存在兩種形式:帶結果參數和不帶結果參數。結果參數是一種輸出參數,是存儲過程的返回值。兩種形式都可帶有數量可變的輸入(IN參數)、輸出(OUT參數)或輸入和輸出(IN-OUT參數)的參數。
7.
getString()方法與getObject()方法有什么區(qū)別正確答案:JDBC提供了getString()、getInt()和getData()等方法從ResultSet中獲取數據,當查詢結果集中的數據量較小時,不用考慮性能,使用這些方法完全能夠滿足需求,但是當查詢結果集中的數據量非常大時,則會拋出異常:OracleException未處理:ORA-01000:maximumopencursorsexceeded(以訪問Oraele數據庫為例)。而通常情況下,使用getObject()方法就可以解決這個問題。
getString()或getInt()等方法在被調用時,程序會一次性地把數據都放到內存中,然后通過調用ResultSet的next()和getString()等方法來獲取數據。當數據量大到內存中放不下時就會拋出異常,而使用getObject()方法就不會這種問題,因為數據不會一次性被讀到內存中,每次調用時會直接從數據庫中去獲取數據,因此使用這種方法不會因為數據量過大而出錯。
8.
使用JDBC時需要注意哪些問題正確答案:在使用JDBc編程時,首先需要建立于數據庫的連接,才能完成對數據庫的訪問,由于與數據庫的連接是非常重要的資源。JDBC連接池提供了JDBC連接定義和數目有限的連接,如果連接數量不夠,就需要長時間的等待。不正常關閉JDBC連接會導致等待回收無效的JDBC連接。只有正常的關閉和釋放JDBC連接,JDBC資源才可以被快速地重用,從而使得系統(tǒng)性能得到改善。因此在編程時,一定要保證釋放不再使用的連接。
一般來講,在使用JDBC訪問數據庫時,createStatement和prepareStatement最好放在循環(huán)外面,而且使用了這些Statement后,需要及時關閉。最好是在執(zhí)行了一次executeQuery、executeUpdate等之后,如果不需要使用結果集(ResultSet)的數據,就馬上將Statment關閉。因為每次執(zhí)行conn.createStatement()或conn.prepareStatement(),實際上都相當于在數據庫中打開了一個cursor(游標),如果把對這兩個方法的調用放到循環(huán)內,會一直不停地打開cursor。如果不能及時地關閉,會導致程序拋出異常。
9.
什么是JDO正確答案:Java數據對象(JavaDataObject,JDO)是一個用于存取某種數據倉庫中的對象的標準化API,它使開發(fā)人員能夠間接地訪問數據庫。
JDO是JDBC的一個補充,它提供了透明的對象存儲,因此對開發(fā)人員來說,存儲數據對象完全不需要額外的代碼(例如JDBCAPI的使用)。這些煩瑣的工作已經轉移到JDO產品提供商身上,使開發(fā)人員解脫出來,從而集中時間和精力在業(yè)務邏輯上。另外,相較于JDBC,JDO更靈活、更通用,它提供了到任何數據底層的存儲功能,例如關系數據庫、文件、XML以及對象數據庫管理系統(tǒng)(ObjectDatabaseManagementSystem,ODBMS)等,使得應用可移植性更強。
10.
JDBC與Hibernate有什么區(qū)別正確答案:Hibernate是JDBC的封裝,采用配置文件的形式將數據庫的連接參數寫到XML文件中,至于對數據庫的訪問還是通過JDBC來完成的。
Hibernate是一個持久層框架,它將表的信息映射到XML文件中,再從XML文件映射到相應的持久化類中,這樣可以使用Hihernate獨特的查詢語言Hibernate查詢語言(HibernateQueryLanguage,HQL)了。Hibernate的HQL查詢語句返回的是List<Object[.]>類,而JDBC通過statement返回的查詢結果是ResultSet并且有時候需要自己封裝到List中。另外一個重要區(qū)別在于,Hibernate具有訪問層(DAO類層,DAO全稱為DataAccessObjeet數據訪問接口,意為數據訪問接口),該層是HQL查詢語句唯一出現的位置,再往上層則不會出現查詢語句,而JDBC可以隨時連接隨時訪問,例如有100個類都有SQL查詢語句,如果表名改變了,那么要使用JDBC的方式,就必須重寫所有查詢語句,而采用Hibernate的方式只需修改DAO層的類即可,因此Hibernate具有很好的維護性和擴展性。
11.
頁面請求的工作流程是怎樣的正確答案:一個Web應用程序一般都是由客戶端程序與服務器端程序兩部分組成。其中,客戶端主要是指用戶和瀏覽器,用戶可以通過瀏覽器查找所需的資源,而這些資源則位于服務器上。瀏覽器是一個工具軟件,它主要有兩個作用:一是完成與服務器端的交互;二是完成HTML(Hyper-TextMarkupLanguage,超文本標記語言,用來告訴瀏覽器怎樣給用戶展示內容)的解析,從而實現把用戶需要查看的資源信息以直觀的形式展現出來。服務器端用來接收客戶端發(fā)來的請求,并對該請求進行處理,找到客戶端請求的資源,最后把查找到的資源返回給客戶端,這些資源主要包括HTML頁面、圖片、音頻、視頻、PDF文件等內容。
下圖給出了最基本的頁面訪問的處理流程。
而面訪問的處理流程
1)用戶通過瀏覽器輸入鏈接地址來請求所需的資源。
2)瀏覽器接受用戶的請求,并把該請求組裝成指定的格式發(fā)送給服務器端,客戶端與服務器端之間通過HTTP來完成具體的交互。其中請求的數據流中主要包含HTTP(HyperTextTransferProtocol,超文本傳輸協議,建立在TCP/IP基礎上的一個協議,主要用來實現客戶端與服務器端之間的通信)請求方法(GET或POST)、請求的網址(URL,UniformResourceLocator,統(tǒng)一資源定位符)以及請求的一些參數信息。
3)服務器接收到客戶端發(fā)來的請求,并查找用戶所需要的資源。
4)服務器查找到用戶請求的資源后,把該資源返回給客戶端。
5)服務器通過把響應消息組裝成特定的消息格式后返回給客戶端,這個過程通過HTTP來完成。響應的數據流主要包含狀態(tài)編碼(代表請求成功或失敗),Content-type(例如text、picture、HTML等),響應消息的內容(圖片或HTML格式的內容)。
6)瀏覽器對HTML進行解析,并把響應結果展現給用戶。
12.
HTTP中GET與POST方法有什么區(qū)別正確答案:HTTP請求的方法有很多種類,例如GET、POST、HEAD、TRACE、OPTIONS等,但是CET與POST是兩個最常用的方法。其中,GET是最簡單的一種請求方法,其主要功能是從服務器端獲取用戶所需資源,并將其作為響應返回給客戶端,這些資源可以是HTML頁面、圖片、文檔等內容中的任何一種,但需要注意的是,GET方法的作用主要用來獲取服務器端資源信息,就如同數據庫中查詢操作一樣,不會影響到資源自身的狀態(tài),例如刪除、修改或新增資源都是不允許的。而POST方法提供了比GET方法更強大的功能,它除了能夠從服務器端獲取資源外,同時還可以向服務器上傳數據。
雖然GET方法主要用來從服務器上獲取數據,也可以向服務器上傳數據,但是一般不建議采用GET方法來向服務器上傳數據,而是推薦使用POST方法實現該功能。具體而言,主要有以下兩個方面原因:
1)采用GET方法向服務器上傳數據時,一般將數據添加到URL后面,并且二者用“?”連接,各個變量之間用“&”連接。由于對URL的長度存在限制,因此采用這種方法能上傳的數據量非常小,通常在1024Byte左右。而POST方法傳遞數據是通過HTTP請求的附件進行的,傳送的數據量更大一些,一般默認為不受限制的。
2)由于GET方法上傳的數據是添加在URL中的,因此上傳的數據被徹底“暴露”出來了,本身存在安全隱患,尤其是當用戶需要向服務器提交一些敏感信息時。而POST方法向服務器提交的內容在URL中并沒有明文顯示,對用戶都是不可見的,所以,安全性更好一些。
常見筆試題:
在HTTP中,用于發(fā)送大量數據的方法是______。
A.GET
B.POST
C.PUT
D.OPTIONS
答案:B。見上面講解。
13.
什么是Servlet正確答案:HTML只能用來保存靜態(tài)內容,而通常情況下,靜態(tài)頁面很難滿足實際應用的需要,鑒于此,動態(tài)頁面的概念被引入。所謂動態(tài)頁面,指的是能夠根據不同時間、不同用戶而顯示不同內容的頁面,例如常見的論壇、留言板、電子商務網站等都是通過動態(tài)頁面來實現的。那么如何才能生成動態(tài)頁面呢?其中一種方法是采用公共網關接口(CommonGatewayInterface,CGI)。CGI是一種用Perl腳本編寫的程序,可以用來生成動態(tài)頁面,而另一種方式則是采用Servlet技術。
什么是Servlet呢?Servlet是采用Java語言編寫的服務器端程序,它運行于Web服務器中的Servlet容器中,其主要功能是提供請求/響應的Web服務模式,可以生成動態(tài)的Web內容,而這正是HTML所不具備的功能。
與其他生成動態(tài)頁面的技術相比,Servlet有諸多優(yōu)點,具體而言,主要表現在如下幾個方面:
1)較好的可移植性。由于Java語言具有跨平臺和可移植性強的特點,使得Setvlet也有較好的可移植性,即無需修改代碼就可以部署到多種不同類型的Web服務器上。
2)執(zhí)行效率高。由于CGI針對每個請求都會創(chuàng)建一個進程來處理,而Servlet針對每個請求創(chuàng)建一個線程來執(zhí)行,而創(chuàng)建線程比創(chuàng)建進程的開銷要小,因此與CGI相比,Servlet在交互過程中有更短的響應時間,響應效率更高。
3)功能強大。Setvlet可以與Web服務器進行交互,而CGI卻無法與Web服務器直接交互。
4)使用方便。Servlet提供了許多非常有用的接口以用來讀取或設置HTTP頭消息,處理Cookie和跟蹤會話狀態(tài)等。
5)可擴展性強。由于Setvlet是用Java語言編寫的,因此它具備了Java語言的所有優(yōu)點。Java語言是健壯的、面向對象的編程語言,它很容易擴展,Servlet自然也具備這樣的優(yōu)點。
為了更好地說明Setvlet,在介紹Servlet處理請求的過程前,首先引入Servlet程序的基本結構,如下所示:
publicclassMyServletextendsHttpServlet{
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
PrinterWriterout=response.getWriter();
Out.println("somehtmlformatestring");
}
}
從以上Servlet的程序結構中可以看出,在Servlet中,并沒有main()方法,連所謂的入口方法都沒有,那么它到底是如何執(zhí)行的呢?其實,它是在容器的控制下執(zhí)行的,最常被使用的容器為Tomeat。當Web服務器獲取到一個對Servlet的請求時,該服務器將會把這個請求交給對應的容器來處理,容器通過調用Servlet的方法(doGet()或doPost())來響應客戶端的請求。
具體而言,Servlet處理客戶端請求有如下幾個步驟:
1)用戶通過單擊一個鏈接來向Servlet發(fā)起請求。
2)Web服務器接收到該請求后,會把該請求交給相應的容器來處理,當容器發(fā)現這是對Servlet發(fā)起的請求后,容器此時會創(chuàng)建兩個對象:HttpServletResponse和HttpServletRequest。
3)容器可以根據請求消息中的URL消息找到對應的Servlet,然后針對該請求創(chuàng)建一個單獨的線程,同時把第2)步中創(chuàng)建的兩個對象以參數的形式傳遞到新創(chuàng)建的線程中。
4)容器調用Servlet的service()方法來完成對用戶請求的響應,service()方法會調用doPost()或doGet()方法來完成具體的響應任務,同時把生成的動態(tài)頁面返回給容器。
5)容器把響應消息組裝成HTTP格式返回給客戶端。此時,這個線程運行結束,同時刪除第2)步創(chuàng)建的兩個對象。
以上處理流程如圖所示。
Servlet的處理流程
容器會針對每次請求創(chuàng)建一個新的線程進行處理,同時會針對每次請求創(chuàng)建HttpServletResponse和HttpServletRequest兩個對象。處理完成后線程也就退出了。
常見筆試題:
1.Servlet處理請求的方式為______。
A.以進程的方式
B.以程序的方式
C.以線程的方式
D.以響應的方式
答案:C。見上面講解。
2.Servlet與CGI有什么區(qū)別?
答案:相較于CGI,Servlet處于服務器進程之中,它通過多線程方式運行其service()方法,一個實例可以服務于多個請求,并且其實例一般不會被銷毀,而CGI對每個請求都產生新的進程,服務完成后就銷毀,所以效率不如Servlet。
14.
doPost()方法與doGet()方法怎么選擇正確答案:從Web容器處理HTTP請求的流程中可以看出,最終的請求都會交給Servlet來處理,而servlet是通過調用service()方法來處理請求的,service()方法會根據不同的請求類型分別調用doPost()方法(用于處理POST請求)或doGet()方法(用于處理GET請求)來處理用戶請求,實現對客戶的響應。如果請求是GET,就調用doGet()方法;如果請求是POST,就調用doPost()方法。在Servlet接口和GenericServlet(一個通用的、不特定于任何協議的Servlet,它實現了Servlet接口)中是沒有doGet()方法與doPost()方法的,而HttpServlet中定義了這些方法,但是都是返回error信息,所以,當定義一個Servlet時,都必須實現doGet()方法或doPost()方法。doGet和doPost都接受請求(HttpServletRequest)和響應(HttpServletResponse)。
具體而言,當HTTP請求中的method屬性為get時,調用doGet()方法;當method屬性為post時,則調用doPost()方法。
15.
什么是Servlet的生命周期正確答案:由于Servlet運行在容器中,沒有main()方法,因此,整個生命周期都是由容器來控制的。簡單而言,Servlet的生命周期只有兩個狀態(tài):未創(chuàng)建狀態(tài)與初始化狀態(tài)。這兩種狀態(tài)的轉換主要是由3個重要的方法來進行控制:init()、service()和destroy()。其中,init()方法是Servlet生命的起點,用于創(chuàng)建或打開任何與Servlet相關的資源以及執(zhí)行初始化工作。service()方法是Servlet中真正處理客戶端傳過來的請求的方法,它根據HTTP請求方法(GET、POST等)將請求分發(fā)到doGet()、doPost()等方法。destroy()方法釋放任何在init()方法中打開的與Servlet相關的資源。
Servlet的狀態(tài)圖如圖所示。
Servlet的狀態(tài)圖
具體而言,Servlet的生命周期可以分為加載、創(chuàng)建、初始化、處理客戶請求和卸載5個階段。
1)加載。容器通過類加載器使用Servlet類對應的文件來加載Servlet。
2)創(chuàng)建。通過調用Servlet的構造函數來創(chuàng)建一個Servlet實例。
3)初始化。通過調用Servlet的init()方法來完成初始化工作,這個方法是在Servlet已被創(chuàng)建但向客戶端提供服務之前調用的,需要注意的是,init()方法只會被調用一次。
4)處理客戶請求。Servlet一旦被創(chuàng)建后,它就可以為客戶端提供服務了。每當有新的客戶請求到來時,容器都會創(chuàng)建一個新的線程來處理該請求,接著會調用Servlet的service()方法來完成客戶端的請求,當然,service()方法會根據請求的method屬性值的不同調用決定是調用doGet()方法還是調用doPost()方法來完成具體的響應。
5)卸載。容器在卸載Servlet之前需要調用destroy()方法,讓Servlet自己釋放其占用的系統(tǒng)資源,一旦destroy方法被調用,容器就不會再向這個Servlet發(fā)送任何請求消息了。如果容器需要這個Servlet,那么就必須重新創(chuàng)建并初始化一個實例。需要注意的是,destroy()方法只會被調用一次。
常見筆試題:
在Servlet的生命周期中,容器只調用一次的方法是(
)。
A.service
B.getServletConfig
C.init
D.destroy
答案:C、D。見上面講解。
16.
JSP有哪些優(yōu)點正確答案:JSP(JavaServerPages)是由Sun公司倡導、許多企業(yè)參與建立起來的一種動態(tài)技術標準,從本質上來講,就是嵌入了Java代碼的HTML文件(但需要注意的是,JSP頁面最好少寫Java代碼)。在引入JSP之前,在Web應用程序中,所有業(yè)務邏輯和HTML的響應都是在Servlet中實現的,但在使用這種方式時,存在一個比較大的缺陷:必須把給用戶響應的視圖組裝成一個很長的HTML格式的字符串寫入println()方法中。所以,使用這種方式編程,在編寫一段很長的HTML字符串時非常容易出錯,而且代碼的可讀性也非常差,同時由于業(yè)務邏輯與視圖沒有分離,系統(tǒng)的可擴展性、可維護性都較差。
JSP的引入在一定程度上解決了Servlet存在的缺點。其實現理念是讓每個Servlet只負責其對應的業(yè)務邏輯的處理,讓JSP來負責用戶的HTML顯示,因此實現了業(yè)務邏輯與視圖實現的分離,從而極大地提高了系統(tǒng)的可擴展性。
在引入JSP后,Servlet的實現結構如下:
publicclassMyServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
//businesslogiccode
//forwardtherequesttoaJSPpage
}
}
17.
JSP與Servlet有何異同正確答案:JSP與Servlet的相同點為:JSP可以被看作一個特殊的Servlet,它只不過是對Servlet的擴展,只要是JSP可以完成的工作,使用Servlet都可以完成,例如生成動態(tài)頁面。由于JSP頁面最終要被轉換成Servlet來運行,因此處理請求實際上是編譯后的Servlet。
JSP與Servlet的不同點為:①Servlet的實現方式是在Java中嵌入HTML代碼,編寫和修改HTML非常不方便,所以它比較適合做流程控制、業(yè)務處理;而JSP的實現方式為在HTML中嵌入Java代碼,比較適合頁面的顯示,例如,在Struts框架中,Servlet位于MVC設計模式的控制層,而JSP位于視圖層。②Servlet中沒有內置對象,JSP中的內置對象都是必須通過HttpServletRequest對象、HttpServletResponse對象以及HttpServlet對象得到。
18.
如何使用JSP與Servlet實現MVC模型正確答案:MVC是Model(模型)、View(視圖)和Controller(控制器)3個單詞的首字母組合。MVC是一種目前廣泛流行的應用模型,其目的是實現Web系統(tǒng)的職能分工。下圖為MVC模型關系圖,其中模型層實現系統(tǒng)中的業(yè)務邏輯,通??梢杂肑avaBean或EJB來實現;視圖層則用于與用戶的交互,通常用JSP來實現;控制層則是模型與視圖之間溝通的橋梁,它可以把用戶的請求分派并選擇恰當的視圖來顯示它們,同時它也可以解釋用戶的輸入并將其映射為模型層能夠執(zhí)行的操作。
MVC模型關系圖
MVC強制性地分離Web應用的輸入、處理和輸出,使得MVC應用程序被分成3個核心部件:模型、視圖和控制器。它們各自處理自己的任務。
(1)模型(業(yè)務邏輯層)
模型表示企業(yè)數據和業(yè)務邏輯,它是應用程序的主體部分。業(yè)務流程的處理過程對其他層來說是黑箱操作,模型接收視圖請求數據,并返回最終的處理結果。業(yè)務模型的設計可以說是MVC最主要的核心。目前流行的EJB模型就是一個典型的應用例子,它從應用技術實現的角度對模型做了進一步的劃分,以便充分利用現有的組件,但它不能作為應用設計模型的框架。它僅僅告訴設計人員按這種模型設計就可以利用某些技術組件,從而減少了技術上的困難,可以使設計人員專注于業(yè)務模型的設計。
MVC把應用的模型按一定的規(guī)則抽象出來。抽象的層次很重要,這也是判斷設計人員是否優(yōu)秀的主要依據。抽象與具體不能隔得太遠,也不能太近。MVC并沒有提供模型的設計方法,而只告訴設計人員應該如何組織管理這些模型,以便于模型的重構和提高重用性。
業(yè)務模型還有一個很重要的模型那就是數據模型。數據模型主要指實體對象的數據持續(xù)化,比如將一張訂單保存到數據庫,從數據庫獲取訂單,將這個模型單獨列出,所有相關數據庫的操作只限制在該模型中。
(2)視圖(表示層)
視圖是用戶看到的并與之交互的界面。對早期的Web應用來說,視圖就是由HTML元素組成的界面,在新式的Web應用中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出不窮,它們包括AdobeFlash以及諸如XHTML、XML/XSL等一些標識語言和Web服務等。
隨著Web應用開發(fā)技術的發(fā)展,用戶要求的日益提高,如何處理應用程序的界面已經變得越來越有挑戰(zhàn)性。MVC架構一個大的好處是它能為Web應用處理很多不同的視圖。在視圖中其實沒有真正的業(yè)務處理發(fā)生,不管這些數據是聯機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數據并允許用戶操縱的方式。
視圖功能強大,主要表現在以下兩個方面:
1)根據客戶類型顯示信息。
2)顯示商業(yè)邏輯(模型)的結構,而不關心信息如何獲得何時獲得。
(3)控制器
控制器接收用戶的輸入并調用模型和視圖去完成用戶的需求。所以當用戶單擊Web頁面中的超鏈接和發(fā)送HTML表單時,控制器(例如Servlet)本身不輸出任何東西,也不執(zhí)行任何處理,它只是接收請求并決定調用哪個模型構件去處理請求,然后確定用哪個視圖來顯示模型處理返回的數據。
MVC的處理過程是這樣的:對于每一個用戶輸入的請求,先被控制器接收,并決定由哪個模型來進行處理,然后模型通過業(yè)務邏輯層處理用戶的請求并返回數據,最后控制器用相應的視圖格式化模型返回的數據,并通過顯示頁面呈現給用戶。
MVC這種特殊的設計結構,給應用開發(fā)帶來了很多便利,通過使用MVC架構,大大提高了Web應用的開發(fā)效率,具體來說,MVC設計結構主要有以下幾個方面的優(yōu)點:
1)低耦合性。由于視圖層和業(yè)務層分離,這樣就使得修改視圖層代碼時不需要重新編譯模型和控制器的代碼,同樣,一個應用的業(yè)務流程或者業(yè)務規(guī)則的改變只需要改動MVC的模型層即可。因為模型與控制器和視圖相分離,所以很容易改變應用程序的數據層和業(yè)務規(guī)則。
2)高重用性和可適用性。由于技術的不斷進步,現在訪問應用程序可以有越來越多的方式。MVC模式允許使用各種不同樣式的視圖來訪問同一個服務器端的代碼。它包括任何Web(HTTP)瀏覽器或者無線瀏覽器(WAP),例如,用戶可以通過計算機或手機來訂購某樣產品,雖然訂購的方式不一樣,但處理訂購產品的方式是一樣的。由于模型返回的數據沒有進行格式化,因此同樣的構件能被不同的界面使用,例如,很多數據可能用HTML來表示,但是也有可能用WAP來表示,而這些表示所需要的命令僅是改變視圖層的實現方式,而控制層和模型層無需做任何改變。
3)較低的生命周期成本。MVC使得開發(fā)和維護用戶接口的技術難度降低。
4)部署快速。使用MVC模式可以大大縮減開發(fā)時間,這使得后臺開發(fā)人員集中精力于業(yè)務邏輯上,使界面開發(fā)人員(包括HTML和JSP開發(fā)人員)集中精力于表現形式上。
5)可維護性。分離視圖層和業(yè)務邏輯層也使得Web應用更易于維護和修改。
6)有利于軟件工程化管理。由于采用了分層思想,每一層不同的應用具有某些相同的特征,有利于通過工程化、工具化管理程序代碼。
用JSP與Servlet實現的MVC模型如圖所示。
用JSP與Servlet買現的MVC模型
在這個MVC模型中,視圖模塊采用JSP來實現,主要負責數據的展現。視圖可以從控制器上獲取模型的狀態(tài),當然不是直接從控制器上獲取,而是控制器把模型的數據放到一個視圖可以訪問的地方,通過間接方式來訪問模型的數據??刂破鞑捎肧ervlet來實現,客戶端的所有請求都發(fā)送給Servlet,它接收請求,并根據請求消息把它們分發(fā)給對應的JSP頁面來響應,同時根據需求生成JavaBean實例供JSP來使用。模型采用JavaBean來實現,這個模塊實現了實際的業(yè)務邏輯。
常見筆試題:
按照MVC設計模式,JSP用于實現______。
A.Model
B.View
C.Controller
D.容器
答案:B。見上面講解。
19.
Servlet中forward和redirect有什么區(qū)別正確答案:在設計Web應用程序時,經常需要把一個系統(tǒng)進行結構化設計,即按照模塊進行劃分,讓不同的Servlet來實現不同的功能,例如可以讓其中一個Servlet接收用戶的請求,另外一個Servlet來處理用戶的請求。為了實現這種程序的模塊化,就需要保證在不同的Servlet之間可以相互跳轉,而Servlet中主要有兩種實現跳轉的方式:forward方式與redirect方式。
forward是服務器內部的重定向,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而客戶端并不知道,因此在客戶端瀏覽器的地址欄中不會顯示轉向后的地址,還是原來的地址。由于在整個定向的過程中用的是同一個Request,因此forward會將Request的信息帶到被定向的JSP或Servlet中使用。
redirect則是客戶端的重定向,是完全的跳轉,即客戶端瀏覽器會獲取到跳轉后的地址,然后重新發(fā)送請求,因此瀏覽器中會顯示跳轉后的地址。同時,由于這種方式比forward方式多了一次網絡請求,因此其效率要低于forward方式。需要注意的是,客戶端的重定向可以通過設置特定的HTTP頭或寫JavaScript腳本實現。
下圖可以更好地說明forward與redirect的區(qū)別。
forward與redirect的區(qū)別
鑒于以上區(qū)別,一般當forward方式可以滿足需求時,盡可能地使用forward方式。但在有些情況下,例如,需要跳轉到一個其他服務器上的資源,則必須使用redirect方式。
引申:filter的作用是什么?主要實現什么方法?
filter使用戶可以改變一個request并且修改一個response。filter不是一個Servlet,它不能產生一個response,但它能夠在一個request到達Servlet之前預處理request,也可以在離開Servlet時處理response。filter其實是一個“ServletChaining”(Servlet鏈)。
一個filter的作用包括以下幾個方面:
1)在Servlet被調用之前截獲。
2)在Servlet被調用之前檢查ServletRequest。
3)根據需要修改Request頭和Request數據。
4)根據需要修改Response頭和Response數據。
5)在Servlet被調用之后截獲。
常見筆試題:
下列有關forward和redirect的描述中,正確的是______。
A.forward是服務器將控制權轉交給另外一個內部服務器對象,由新的對象來全權負責響應用戶的請求
B.執(zhí)行forward時,瀏覽器不知道服務器發(fā)送的內容是從何處來,瀏覽器地址欄中還是原來的地址
C.執(zhí)行redirect時,服務器端告訴瀏覽器重新去請求地址
D.forward是內部重定向,redirect是外部重定向
答案:B、C、D。見上面講解。
20.
JSP的內置對象有哪些正確答案:在JSP中,內置對象又稱為隱含對象,是指在不聲明和不創(chuàng)建的情況下就可以被使用的一些成員變量。JSP一共提供有9個內置對象:request(請求對象)、response(響應對象)、pageContext(頁面上下文對象)、session(會話對象)、application(應用程序對象)、out(輸出對象)、config(配置對象)、page(頁面對象)與exception(例外對象)。JSP內置對象的具體描述見表。JSP內置對象名稱描述request客戶端請求,此請求包含來自GET/POST請求的參數??蛻舳说恼埱笮畔⒈环庋b在request對象中,通過它才能了解到客戶的需求,然后做出響應,因此request對象是用來獲取請求參數的非常重要的途徑。它是HttpServletRequest類的實例response用來表示服務器端劉客戶端的響應,將Web服務器處理后的結果返回給客戶端。但在JSP中很少直接使用到它。它是HttpServletResponse類的實例pageContext提供了對JSP頁面的所有對象及命名空間的訪問,也就是說,用它可以訪問到本頁面中的所有其他對象,例如前面已經描述的request、response以及后面要介紹的session和application對象等。它的本類名也叫pageContextsession用來表示客戶端與服務器的一次會話。從客戶端與Web服務器建立連接的時候會話開始,直到關閉瀏覽器時結束會話。它是HttpSession類的實例application代表JSP所屬的Web應用本身。application對象可存放全局變量,因此可以實現用戶間的數據共享。它的生命周期與服務器的生命周期一致,也就是說,服務器啟動后這個對象即被創(chuàng)建出來,直到服務器停止后這個對象的生命周期才結束。在任何地方,對此對象屬性的操作都將影響到其他用戶對此的訪問。它是ServletContext類的實例out用于在客戶端瀏覽器內輸出信息。它是JspWriter類的實例config主要作用是取得服務器的配置信息。當一個Servlet初始化時,容器把某些信息通過config對象傳遞給這個Servlet,Servlet可以使用這個對象獲取所需的配置信息page表示當前JSP頁面,類似于Java中的this指針。它是java.lang.Object類的實例exception用來表示異常。當一個頁面在運行過程中發(fā)生了例外,就會產生這個對象。如果JSP需要使用這個對象,就必須把isErrorPage設為true,否則將無法編譯。它是java.lang.Throwable的對象
根據以上9個內置對象的作用的不同,可以將它們分為4類:第一類,與Servlet有關的page和config;第二類,與Input/Output有關的out,request和response;第三類,與Context有關的application,session和pageContext;第四類,與Error有關的exception。
常見筆試題:
JSP主要內置對象有______、______、______、______、______、______、out、config和page。
答案:見上面講解。
21.
request對象主要有哪些方法正確答案:當使用JSP與Servlet開發(fā)Web應用程序時,如何獲取用戶提交的請求信息是非常重要的內容之一。request對象就是用來封裝用戶請求數據的,每當有請求到達服務器時,系統(tǒng)都會創(chuàng)建一個request對象。在服務器進行處理時可以通過獲取request對象的屬性來獲取用戶的請求數據。此外,還可以通過對request對象設置新的一些屬性來實現在Servlet與JSP之間跳轉時傳遞一些參數的功能。具體來講,request對象的方法見表。request對象的方法名稱描述setAttribute(Stringname,Object)用來設置名字為name所對應的屬性值。在對請求進行轉發(fā)處理時,也可以通過該方法設置一些屬性,從而將數據傳遞到轉發(fā)后的頁面中getAttribute(Stringname)用來獲取名字為name所對應的屬性值,可以用來獲取通過setAttribute方法設置的一些屬性getAttributeNames()返回request對象所有屬性的名字集合。其返回值為枚舉的實例getCookies()用來返回客戶端的所有Cookie列象,其結果是一個Cookie數組getCharacterEncoding()用來返回請求的消息中字符的編碼方式getContentLength()用來獲取請求消息的Body的長度getInputStream()返回請求的輸入流,這個輸入流可以被用于獲得請求中的數據getMethod()用來獲取HTTP的請求方式,如get或postgetParameter(Stringname)用來獲取用戶提交的數據,其中name與表單中的name屬性一一對應getParameterNames()用來獲取客戶端傳送給服務器端的所有參數的名字,其結果是一個枚舉的實例getParameterValues(Stringname)獲得有name指定的參數的所有值getProtocol()用來獲取客戶端向服務器端傳送數據所使用的協議名稱getQueryString()用來獲得查詢字符串,返回值為URL后面的參數串getRequestURI()用來獲取發(fā)出請求字符串的客戶端地址getRemoteAddr()獲取客戶端的IP地址getRemoteHost()獲取客戶端的名字getSession(booleancreate)用來獲取與請求相關sessiongetServerName()獲取服務器的名字getServletPath()用來獲取客戶端所請求的腳本文件(JSP或Servlet)的路徑getServerPort()用來獲取服務器的端口號removeAttribute(Stringname)用來刪除名字為name對應的屬性
常見筆試題:
HttpServletRequest對象的(
)方法能夠獲取一個表單參數的值。
A.getQuaryString()
B.getPathInfo()
C.getParameter()
D.getAttribute()
答案:C。見上面講解。
22.
JSP有哪些動作正確答案:JSP使用動作來實現動態(tài)地插入文件、實現重定向和對JavaBean的引用等功能。它共有6個基本動作:jsp:include、jsp:useBean、jsp:setProperty、jsp:getProperty、jsp:forward和jsp:plugin。下面將分別對這些動作進行具體介紹。
1)jsp:include。用來在頁面被請求時引入一個文件。include指令是在JSP文件被轉換成Servlet時引入文件,而jsp:include插入文件的時間是在頁面被請求時,而且被引用文件不能包含某些JSP代碼(例如不能設置HTTP頭),示例如下:
<jsp:includepage="test.jsp"flush="true">
<jsp:paramname="name"value="value"/>
</jsp:include>
以上代碼表示在當前文件中可以引入test.jsp文件。
2)jsp:useBean。用來尋找或者實例化一個JavaBean。它使得開發(fā)人員既可以發(fā)揮Java組件重用的優(yōu)勢,同時也避免了損失JSP區(qū)別于Servlet的方便性,示例如下:
<jsp:useBeanid="car"scope="session"class="com.Car">
以上代碼表示實例化了一個com.Car類的實例。
3)jsp:setProperty。用來設置已經實例化的Bean對象的屬性,示例如下:
<jsp:setPropertyname="car"property="colour"value="red"/>
以上代碼用來將名字為car的實例的colour屬性設置為red。
4)jsp:getProperty。用來獲取某個JavaBean的屬性,示例如下:
Colour=<jsp:getPropertyname="car"property="colour"></jsp:getProperty>
以上代碼用來獲取名字為car的實例的colour屬性。
5)jsp:foward。用來把請求轉到一個新頁面,示例如下:
<jsp:forwardpage="/Servlet/login"/>
以上代碼用來把當前頁面重定向到/Servlet/login來處理。
6)jsp:plugin。用于在瀏覽器中播放或顯示一個對象。使用這個動作能插入所需的特定的瀏覽器的OBJECT或EMBED元素來指定瀏覽器運行一個JAVAApplet所需的插件,示例如下:
<jsp:plugintype="applet"codebase="/ch5"code="Hello.class"height="40"width="320">以上代碼用來在瀏覽器中運行一個applet插件。
23.
JSP中include指令和include動作有什么區(qū)別正確答案:include的主要作用是用來在當前文件中引入另外一個文件,以便在當前文件中使用,例如,當應用程序中的所有頁面的某些部分(例如標題、頁腳、導航欄等)都一模一樣時,就可以考慮把相同的部分提取出來寫入一個單獨的文件中,然后通過include方式引入。
include有兩種使用方法:include指令和include動作。其中,include指令的使用方法為:<%@includefile="test.jsp"%>,include動作的使用方法為:<jsp:includepage="test.jsp"flush="true">
include指令與include動作之間的根本性差異在于二者被調用的時間。include指令是編譯階段的指令,即在編譯時,編譯器會把指令所指向目標文件的內容復制到指令所在的位置,替換指令,最終形成一個文件,在運行時只有一個文件。也就是說,include指令所包含文件的內容是在編譯時插入到JSP文件中的,當文件內容有變化時就需要重寫編譯,因此適合于包含靜態(tài)頁面的情況,例如可以包含一個Servlet。而include動作是運行時的語法,在主頁面被請求時,才將用到的頁面包含進來,涉及兩個文件,類似于方法調用,因此更適用于包含動態(tài)頁面的情況。除此之外,二者的差別還有以下3點:
1)當使用include動作時,在頁面中聲明的變量不可用于另一文件,除非將變量放置在request、session、application作用域中;而在使用include指令時,當前頁面和被包含頁面可以共享變量。
2)當使用include指令時,新生成的JSP頁面要符合JSP語法要求,應該避免變量名的沖突;而在使用incl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國童話課件教學課件
- 眉毛設計課件教學課件
- 2024大型港口碼頭排水合同
- 2024年度技術轉讓合同:技術資料交付與技術支持期限
- 2024定制家具合同范本
- 2024義齒加工商與牙科診所之間的定制金屬義齒合同
- 2024崗位聘用合同不續(xù)簽崗位聘用合同
- 2024年度餐廳食材供應商采購合同
- 骨科課件介紹教學課件
- 2024年婚禮車輛租賃特別合同
- 《繼電保護培訓》課件
- 醫(yī)院裝飾工程服務方案
- 麻醉及應激反應調控
- 《數字經濟學》 課件 專題4:數字貨幣與數字金融研究
- 以瞄準我的妹妹沒剪板
- 0-36個月兒童中醫(yī)藥健康管理服務規(guī)范
- 《學習的本質》讀書會活動
- 國培教師個人成長案例3000字
- 浙江省寧波市寧??h六校聯考2023-2024學年九年級上學期11月月考數學試題
- Unit-4Natural-Disasters單元整體教學設計課件-高中英語人教版(2019)必修一
- 森林草原練習卷含答案
評論
0/150
提交評論