《JavaWeb編程技術(shù)》課后習(xí)題答案_第1頁(yè)
《JavaWeb編程技術(shù)》課后習(xí)題答案_第2頁(yè)
《JavaWeb編程技術(shù)》課后習(xí)題答案_第3頁(yè)
《JavaWeb編程技術(shù)》課后習(xí)題答案_第4頁(yè)
《JavaWeb編程技術(shù)》課后習(xí)題答案_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

[鍵入文字]

JavaWeb編程習(xí)題解析

習(xí)題解析

i.略。

什么是URL,什么是URL它們都由哪幾個(gè)部分組成,URL和URI之間有什么關(guān)系?

2.答:URL稱為統(tǒng)一資源定位符,URL通常由4部分組成:協(xié)議名稱、頁(yè)面所在主

機(jī)的DNS名、可選的端口號(hào)和資源的名稱。URI稱為統(tǒng)一資源標(biāo)識(shí)符,是以特定語(yǔ)法標(biāo)識(shí)

一個(gè)資源的字符串。URI由模式和模式特有的部分組成,它們之間用冒號(hào)隔開(kāi),一般格式

如下:

schema:schema-specific-part

URI是URL和URN的超集。

3.答:①是URL,①和②都是URL③是URN

動(dòng)態(tài)web文檔技術(shù)有哪些?服務(wù)器端動(dòng)態(tài)文檔技術(shù)的客戶端動(dòng)態(tài)文檔技術(shù)有何不同?

4.答:動(dòng)態(tài)Web文檔技術(shù)包括服務(wù)器端動(dòng)態(tài)文檔技術(shù)和客戶端動(dòng)態(tài)文檔技術(shù),前者

包括CGI技術(shù)、服務(wù)器擴(kuò)展技術(shù)和HTML頁(yè)面中嵌入腳本技術(shù)。其中HTML頁(yè)面中嵌入

腳本技術(shù)包括ASP,PHP和JSP技術(shù)。

最流行的客戶端動(dòng)態(tài)文檔技術(shù)是在HTML頁(yè)面中嵌入JavaScript腳本代碼。使用

JavaScript可以設(shè)計(jì)交互式頁(yè)面。.與服務(wù)器端動(dòng)態(tài)文檔不同,JavaScript腳本是在客戶端執(zhí)

行的。

什么是Servlet?什么是Servlet容器?它的主要作用是什么?

5.答:Servlet是用ServletAPI開(kāi)發(fā)的Java程序,它運(yùn)行在Servlet容器中。Servlet容

器是運(yùn)行Servlet的軟件,主要用來(lái)擴(kuò)展Web服務(wù)器的功能。

簡(jiǎn)述開(kāi)發(fā)一個(gè)Servlet的上體步驟

6.答:開(kāi)發(fā)Servlet的一般步驟包括:(1)編寫Servlet源程序;(2)編譯;(3)將

Servlet部署到Servlet容器中;(4)訪問(wèn)執(zhí)行Servlet。

要使一個(gè)Servlet能夠正確編譯的運(yùn)行,應(yīng)該將什么文件加到CLASSPATH環(huán)境變量中?

7.答:<fonjcaf-i”ss〃>\lib\servlet-api.jar文件。

web應(yīng)用程序的部署描述文件名是什么?它是什么類型的文件?應(yīng)該存放在什么

目錄中?

8.答:部署描述文件名是web.xml,它是XML文件,應(yīng)該存放在Web應(yīng)用程序的

WEB-INF目錄中。

什么是404錯(cuò)誤?

9.答:當(dāng)服務(wù)器找不到用戶請(qǐng)求的資源時(shí)將發(fā)生404錯(cuò)誤。

什么是JSP頁(yè)面?它與HTML頁(yè)面有什么關(guān)系?

10.答:JSP頁(yè)面是嵌入了Java腳本元素的HTML頁(yè)面。

Servlet與JSP各適用于什么場(chǎng)合?

11.答:Servlet主要用來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯和控制邏輯,JSP頁(yè)面主要用來(lái)實(shí)現(xiàn)表示邏輯。

歲章習(xí)題解析

Servlet接口中定義了哪幾個(gè)方法?

I.答:Servlet接口定義了下面5個(gè)方法:

publicvoidinit(ServletConfigconfig)

publicvoidservice(ServletRequestrequest,ServletResponseresponse)

throwsServletException,lOException

publicvoiddestroy()

publicServletConfiggetServletConfig()

publicStringgetServletInfo()

簡(jiǎn)述Servlet的生命周期,生命周期方法有哪幾個(gè)?

2.答:Servlet是在容器中運(yùn)行的組件,有一個(gè)從創(chuàng)建到銷毀的過(guò)程,其中包括加載和

實(shí)例化、初始化、提供服務(wù)以及銷毀幾個(gè)階段。其中生命周期方法有init()、service()和destroy。

等3個(gè)。

發(fā)生哪些事件,瀏覽器會(huì)向服務(wù)器發(fā)出請(qǐng)求?

3.答:發(fā)生下列事件,瀏覽器向服務(wù)器發(fā)出請(qǐng)求。

(1)用戶點(diǎn)擊了HTML頁(yè)面中的超鏈接;

(2)用戶在HTML頁(yè)面中填寫一個(gè)表單并點(diǎn)擊提交按鈕;

(3)用戶在瀏覽器的地址欄中輸入U(xiǎn)RL并按回車鍵。

4.答:查詢串

5.答:HTTP請(qǐng)求結(jié)構(gòu)由請(qǐng)求行、請(qǐng)求頭、空行和請(qǐng)求數(shù)據(jù)組成。請(qǐng)求行由方法名、

請(qǐng)求資源的URI和使用的HTTP版本3部分組成。

6.答:HTTP響應(yīng)結(jié)構(gòu)由狀態(tài)行、響應(yīng)頭和響應(yīng)數(shù)據(jù)3部分組成。狀態(tài)行由HTTP版本、

狀態(tài)碼和簡(jiǎn)短描述3部分組成。

7.答:GET清求主要用來(lái)從服務(wù)器檢索資源,POST請(qǐng)求主要用來(lái)向服務(wù)器發(fā)送數(shù)據(jù)。

它們的詳細(xì)比較請(qǐng)參閱教材的表2.8。

8.答:在ServletRequet接口中定義了setAttribute。、getAttribute()>getAttributeNames()

和removeAttribute()方法來(lái)處理請(qǐng)求作用域的屬性。

9.答:forward。方法轉(zhuǎn)發(fā)請(qǐng)求是服務(wù)器端控制權(quán)的轉(zhuǎn)向,客戶端地址欄中不顯示轉(zhuǎn)發(fā)

后的資源地址。sendRedirect。方法是服務(wù)器向?yàn)g覽器發(fā)送302狀態(tài)碼,它使瀏覽器連接到新

的位置,瀏覽器地址欄可看到地址的變化。使用重定向,資源不能位于WEB-INF目錄中。

10.答:可先通過(guò)請(qǐng)求對(duì)象的getParameterNames()方法得到Enumeration對(duì)象,然后在

其上得到每個(gè)請(qǐng)求參數(shù)名,再通過(guò)getParameter。得到請(qǐng)求參數(shù)值。

11.答:A12.答:B13.答:E

14.答:

action=ncourseServlet.do"

HttpServlet

com.demo.CourseServlet

courseServlet

15.答:①E②D③C?B⑤A

駕章習(xí)題解析

1.答:Web應(yīng)用程序是運(yùn)行在應(yīng)用服務(wù)器之中的。應(yīng)用服務(wù)器為Web應(yīng)用程序提供一

種簡(jiǎn)單的和可管理的對(duì)系統(tǒng)資源的訪問(wèn)機(jī)制。

2.答:web.xmlbankapp\WEB-INF

3.答:D4.答:A5.答:D

6.答:F7.答:E8.答:D

9.答:getServletConfig().getServletContext()或getServletContext()

10.答:B11.答:B12.答:D

13.答:因?yàn)锳pplet只能運(yùn)行在客戶端,所以可以將它放在Web應(yīng)用程序的文檔根目

錄的任何位置,但不能將其放在WEB4NF目錄或其子目錄中。

14.答:不能這樣做,至少不能直接這樣。部署描述文件不允許為一個(gè)名稱指定多個(gè)

參數(shù),所以必須像下面這樣:

<init-param>

<param-name>countries</param-name>

<param-value>Australia,Brazil,India,UK,US</param-value>

<init-param>

然后在Servlet中解析param-value串的值并解釋字符串中列出的多個(gè)值。

15.答:

packagecom.demo;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjava.io.

publicclassHelioCounterServletextendsHttpServlet{

privateIntegervisits=0;

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwslOException,ServletException{

response.setContentType(ntext/html;charset=gb2312");

PrintWriterout=response.getWriter();

visits=visits+1;

try(

Thread.sleep(2000);

}catch(InterruptedExceptione){

log(uExceptionduringsleeping.;

)

out.printin(H<html><body>n);

out.printin("歡迎您!<br>"+”該Servlet已被訪問(wèn)”+visits+”次。n);

out.printin(H</body></html>n);

}

}

修改后的Servlet如下:

packagecom.demo;

importjavax.servlet.*;

importjavax.servlet.http.*;

importjava.io.*;

publicclassHelloCounterServletextendsHttpServlet{

privateIntegervisits=0;

privateStringdbPath=null;

publicvoidinit(){

try{

dbPath=getServletContext().getRealPath(n/WEB-INF/counter.dbn);

FileInputStreamfis=newFileinputstream(dbPath);

DataInputStreamdis=newDatalnputStream(fis);

visits=dis.readlnt();

dis.close();

}catch(Exceptione){

log(nErrorloadingpersistentcounter'1,e);

)

}

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwslOException,ServletException{

response.setContentType(ntext/html;charset=gb2312");

Printwriterout=response.getWriter();

synchronized(this){

visits=visits+1;

out.printIn(H<html><body>");

out.printin("歡迎您!<br>H+”該Servlet已被訪問(wèn)”+visits+”次?!?;

out.printIn(n</body></html>n);

}

|

publicvoiddestroy(){

try{

FileOutputStreamfos=newFileOutputStream(dbPath);

DataOutputStreamdos=newDataOutputStream(fos);

dos.writelnt(visits);

dos.close();

}catch(Exceptione){

log(*'Errorstoringpersistentcounter'*,e);

}

)

}

號(hào)章習(xí)題解析

1.答:使用請(qǐng)求對(duì)象(即HttpServletRequest接口)的getSession。方法。

2.答:如果客戶在指定時(shí)間內(nèi)沒(méi)有訪問(wèn)服務(wù)器,則該會(huì)話超時(shí)。對(duì)超時(shí)的會(huì)話對(duì)象,

服務(wù)器使其失效。通過(guò)會(huì)話對(duì)象的setMaxInactivelnterval。方法設(shè)置會(huì)話最大超時(shí)時(shí)間。

web.xml文件使用<session-config>元素的子元素vsession-timeouA設(shè)置最大超時(shí)時(shí)間,

如下所示。

<session-config>

<session-timeout>20</session-timeout>

</session-config>

這里的最大超時(shí)時(shí)間是對(duì)整個(gè)應(yīng)用程序的所有會(huì)話有效,<session-timeout>元素指定的

時(shí)間單位是分鐘。setMaxInactivelnterval。方法參數(shù)單位是秒。

3.答:有些客戶瀏覽器可能不支持Cookie或用戶阻止所有的Cookie,此時(shí)不能用Cookie

實(shí)現(xiàn)會(huì)話。

4.答:使用響應(yīng)對(duì)象(即HttpServletResponse接口)的encodeURL()方法或

encodeRedirectURL。方法。

5.答:不能。因?yàn)樵S多用戶是通過(guò)代理服務(wù)器訪問(wèn)Internet的,此時(shí)服務(wù)器得到的是代

理服務(wù)器的IP地址而不是實(shí)際用戶的IP地址,因此這些用戶的IP地址不唯一。

6.答:D7.答:A,B8.答:A,D

9.答:C10.答:A,C11.答:C

12.答:C,D13.答:B,C14.答:C

15.答:B16.答:A17.答:C

18.答:A,B,D,F

19.答:具有很大的影響。該應(yīng)用程序?qū)⒉荒芫S護(hù)用戶的狀態(tài)。Servlet容器將為每個(gè)

客戶的每次請(qǐng)求都創(chuàng)建一個(gè)新的會(huì)話。修改這個(gè)問(wèn)題的唯一方法是修改Servlet代碼加入

URL重寫功能。

駕章習(xí)題解析

1.答:包含JSP指令、JSP小腳本和JSP表達(dá)式。

2.答:合法的JSP表達(dá)式:

<%=500%>

<%=anlnt*3.5/100-500%>

<%=aBool%>

<%=false%>

<%=!false%>

<%=getChar()%>

<%=Math.random()%>

<%=aFloatObj%>

<%=aFloatObj.floatValue()%>

<%=aFloatObj.toString()%>

不合法的JSP表達(dá)式:

<%=aVector%>

<%=aBool;%>

<%=inti=20%>

<%=sBuff.setLength(12);%>

3.答:C

4.答:正確聲明應(yīng)為:

<%!inti=5;%>

<%!intgetI(){returni;}%>

5.答:B是合法的。解析:JSP表達(dá)式中百分號(hào)和等號(hào)之間不能有空格。

6.答:D。解析:A中import的屬性值中應(yīng)該有等號(hào)。B的import屬性值應(yīng)該在一個(gè)字

符串中指定。C,屬性之間不允許有逗號(hào)。E,bgcolor不是合法的屬性名。F,true不是buffer

屬性合法值。G,指令名、屬性名和值都是大小寫敏感的,Page應(yīng)為page。

7.答:B,C

A.非法:等號(hào)表明它是表達(dá)式,但表達(dá)式不能以分號(hào)結(jié)束,產(chǎn)生的Servlet代碼將發(fā)生

語(yǔ)法錯(cuò)誤。

out.print(myObj.ml(););

B.合法:<%=x=y%>將被轉(zhuǎn)換成:

out.print(x=y);//y的值5賦給x并將其打印輸出

C.合法:這是合法的小腳本,因?yàn)樵诜椒ㄕ{(diào)用語(yǔ)句的后面有分號(hào)。即使該方法返回一

個(gè)值,它也是合法的,因?yàn)榉祷氐闹祵⒈缓雎浴?/p>

8.答:不能在小腳本中定義方法。上面代碼一旦被轉(zhuǎn)換成Servlet,」spService()方法

就會(huì)像下面這樣:

publicvoid_jspService(...){

//其他代碼

intx=0;

intincr(){return++x;}

out.write(nThevalueofxis*');

out.print(incr());

)

由于incr()方法定義在」spService()方法內(nèi),所以代碼不能編譯。

9.答:Thevalueofiis3

注意:如果代碼寫成下面形式:

<%int1;%>

<%for(i=0;i<3;i++)%>Thevalueofiis<%=i%>

輸出結(jié)果將為:

ThevalueofiisThevalueofiisThevalueofiis3

10.答:不能在japlnit()方法中使用application對(duì)象。

11.答:Thesumofxandyis9

變量x將被聲明兩次:一次是作為類的全局變量,因?yàn)槭褂昧?lt;%!由1*=5;%>語(yǔ)句,

另一次是在」spService。方法中聲明的局部變量,因?yàn)槭褂玫拇a是<%intx=3;%>o

1答

24.卷:B13.答:C,E

口:②③⑥④①⑤

5.答

out.write(n<html><body>\r\nn);

intcount=0;

out.write(nThepagecountisnow:\r\nn);

out.print(++count);

out.write("</body>〈/html>\r\n");

16.答:

Page改為page

<%1intcount=0%>//聲明缺少分號(hào)

<%count++;%>//去掉分號(hào)

17.答:D

18.答:

<%Floatone=newFloat(88.88)%>小腳本

<%!inty=3;聲明

<%@pageimport='*java.util.*n%>}'旨令

<jsp:includepage=Mfoo.jsp"/>動(dòng)作

<%=pageContext.getAttribute(ufoo")表達(dá)式

email:${applicationscope.mail}EL表達(dá)式

19.答:A,B,C,E20.答:A,B,C,D

21.答:D22.答:C

23.答:

request(javax.servlet.http.HttpServletRequest)

response(javax.servlet.http.HttpServletResponse)

out(javax.servlet.jsp.JspWriter)

session(javax.servlet.http.HttpSession)

application(javax.servlet.ServletContext)

config(javax.servlet.ServletConfig)

exception(java.lang.Throwable)

pageContext(javax.servlet.jsp.PageContext)

page(java.lang.Object)

24.答:共有4個(gè)作用域?qū)ο螅篴pplication>session、request和pageContext。fflsetAttribute()

方法和getAltribute。方法在這些對(duì)象上設(shè)置和獲得屬性。在叩plication作用域上的對(duì)象可以

被Servlet容器的所有的Web應(yīng)用程序訪問(wèn)。

25.答:可以使用pageContext的findAttribute。方法,該方法將依次在頁(yè)面作用域、請(qǐng)

求作用域、會(huì)話作用域和應(yīng)用作用域中查找指定名稱的屬性。

第。章習(xí)題解析

1.答:B2.答:⑤

3.答:這兩種表示等價(jià),但第?種表示使用了JSP腳本元素,第二種表示使用的是動(dòng)

作。它們的功能類似,但有一點(diǎn)細(xì)微的差別。pageContext.include。方法在包含其他組件之

前總是刷新當(dāng)前頁(yè)面的輸出,而vjsp:include>只有在flush屬性值明確設(shè)置為true時(shí)才刷新

當(dāng)前頁(yè)面的輸出,如下所示:

<jsp:includepage="other.jsp*'flush=ntrueH/>

4.答:請(qǐng)求對(duì)象的getParameter。方法的返回值類型是String,因此display.jsp中的

Integer應(yīng)改為String0使用vjsp:param>和request.getParameter()機(jī)制只能傳遞和梅索String

類型的參數(shù)。要傳遞其他對(duì)象類型的參數(shù),必須在包含頁(yè)面中使用request.setAttribute(),

在被包含頁(yè)面中使用request.getAttribute()0

5.答:D6.答:C7.答:B

8.答:可以。頁(yè)面customerDisplay.jsp文件可以使用vjsp:getProperty>輸出bean的屬性

值,只要它也包含一個(gè)與customerlnput.jsp相同的vjsp:useBean>聲明并且該聲明出現(xiàn)在

<jsp:getProperty>明前面即可。

9.答:

<%@pageimport=ncom.model.CustomerBean,com.model.BusinessCustomerBean'1%>

<jsp:useBeanid=ncustomerHclass=ncom.model.BusinessCustomerBean**

type=ncom.model.CustomerBean”scope=Happlicationn/>

<jsp:setPropertyname=Hcustomer"value=HSH/>

<jsp:setPropertyname=,,customernva1ue=118899123'*/>

</jsp:useBean>

10.答:不能在同一個(gè)vjsp:useBean>聲明中同時(shí)使用beanName和class屬性。

11.答:必須使用property指定bean的屬性。param用來(lái)指定請(qǐng)求參數(shù),并且不能在

同一個(gè)vjsp:setProperty>動(dòng)作中同時(shí)指定param和value屬性。

12.答:使用代碼段1是只有在指定作用域中找不到customer的bean對(duì)象時(shí)才執(zhí)行標(biāo)簽

體,使用代碼段2在任何時(shí)候都執(zhí)行屬性設(shè)置標(biāo)簽。

13.答:可以在一個(gè)動(dòng)作中設(shè)置bean的全部屬性:

<jsp:setPropertyname=nbeanNamenproperty=n*"/>

但不能在一個(gè)動(dòng)作中獲得全部屬性值。

14.答:C

15.答:MVC模式稱為模型-視圖-控制器模式。該模式將Web應(yīng)用的組件分為模型、

視圖和控制器,每種組件完成各自的任務(wù)。該模型將業(yè)務(wù)邏輯和數(shù)據(jù)訪問(wèn)從表示層分離出

來(lái)。實(shí)現(xiàn)MVC模式的一般步驟:(1)定義JavaBeans表示數(shù)據(jù);(2)使用Servlet處理請(qǐng)

求;(3)填寫JavaBeans對(duì)象數(shù)據(jù);(4)將結(jié)果存儲(chǔ)在作用域?qū)ο笾?;?)將請(qǐng)求轉(zhuǎn)發(fā)到

JSP頁(yè)面;(6)最后在JSP頁(yè)面中從JavaBeans中取出數(shù)據(jù)。

雪章習(xí)題解析

1.答:兩層模型即客戶機(jī)/服務(wù)器模型,在兩層模型中應(yīng)用程序直接通過(guò)JDBC驅(qū)動(dòng)程

序訪問(wèn)數(shù)據(jù)庫(kù)。三層模型是瀏覽器/應(yīng)用服務(wù)器/數(shù)據(jù)庫(kù)服務(wù)器結(jié)構(gòu),在該結(jié)構(gòu)中瀏覽器向

應(yīng)用服務(wù)器發(fā)出請(qǐng)求,應(yīng)用服務(wù)器通過(guò)JDBC驅(qū)動(dòng)程序訪問(wèn)數(shù)據(jù)庫(kù)。

2.答:傳統(tǒng)的數(shù)據(jù)庫(kù)連接的一般步驟是:(1)加載JDBC驅(qū)動(dòng)程序。(2)建立連接對(duì)

象。(3)創(chuàng)建語(yǔ)句對(duì)象,語(yǔ)句對(duì)象有3種:StatementsPreparedStatement和CallableStatement(,

(4)執(zhí)行SQL語(yǔ)句得到結(jié)果集對(duì)象,調(diào)用ResultSet的有關(guān)方法就可以完成對(duì)數(shù)據(jù)庫(kù)的操

作。(5)關(guān)閉建立的各種對(duì)象。

缺點(diǎn)是每次訪問(wèn)數(shù)據(jù)庫(kù)都要建立連接對(duì)象,請(qǐng)求結(jié)束需關(guān)閉連接對(duì)象。這將耗費(fèi)大量

的時(shí)間,可能導(dǎo)致增大請(qǐng)求的響應(yīng)時(shí)間。

3.答:連接Oracle數(shù)據(jù)庫(kù)代碼如下。

Class.forName("oracle.jdbc.driver.OracleDriver");

Stringdburl="jdbc:oracle:thin:@:1521:ORCL";

Connectionconn=Drivermanager.getConnection(dburl,"scott","tiger");

上述代碼中,oracle.jdbc.driver.OracleDriver為JDBC驅(qū)動(dòng)程序名,jdbc:oracle:thin:@

:1521:ORCL為JDBCURL。

4.答:使用數(shù)據(jù)源是目前Web應(yīng)用開(kāi)發(fā)中建立數(shù)據(jù)庫(kù)連接的首選方法。這種方法是

事先建立如干連接對(duì)象,存放在連接池中。當(dāng)應(yīng)用程序需要一個(gè)連接對(duì)象時(shí)就從連接池中

取出一個(gè),使用完后再放回連接池。這樣就可避免每次請(qǐng)求都創(chuàng)建連接對(duì)象,從而降低請(qǐng)

求的響應(yīng)時(shí)間,提高效率。

使用數(shù)據(jù)源建立連接是通過(guò)JNDI技術(shù)實(shí)現(xiàn)的。這需要首先配置數(shù)據(jù)源(可以是局部

數(shù)據(jù)源或全局?jǐn)?shù)據(jù)源),然后在應(yīng)用程序中通過(guò)Context對(duì)象查找數(shù)據(jù)源對(duì)象。假設(shè)己經(jīng)

配置了名為sampleDS的數(shù)據(jù)源,建立連接代碼如下:

Contextcontext=newInitialcontext();

DataSourcedataSource=context.lookup("java:comp/env/jdbc/sampleDS*');

ConnectiondbConnection=dataSource.getConnection();

5.答:可滾動(dòng)的ResultSet是指在結(jié)果集對(duì)象上不但可以向前訪問(wèn)結(jié)果集中的記錄,

還可以向后訪問(wèn)結(jié)果集中的記錄??筛碌腞esultSet是指不但可以訪問(wèn)結(jié)果集中的記錄,

還可以通過(guò)結(jié)果集對(duì)象更新數(shù)據(jù)庫(kù)。

要?jiǎng)?chuàng)建可滾動(dòng)、可更新的ResultSet對(duì)象,必須使用Connection對(duì)象的帶兩個(gè)參數(shù)的

createStatement()方法創(chuàng)建的Statement,第一個(gè)參數(shù)用下面兩個(gè)常量之一:

?ResultSet.TYPE_SCROLL_SENSITIVE

?ResultSet.TYPE_SCROLL_INSENSITIVE

第二個(gè)參數(shù)使用下面常量:

?ResultSet.CONCUR_UPDATABLE

6.參考程序如下:

packagecom.control;

importjava.io.*;

importjava.sql.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassBookQueryServletextendsHttpServlet{

Connectiondbconn;

publicvoidinit(){

Stringdriver=norg.postgresql.Driver,';

Stringdburl=*'jdbc:postgresql://:5432/bookstore";

Stringusername="bookstore";

Stringpassword="bookstore”;

try(

Class.forName(driver);

dbconn=DriverManager.getConnection(

dburl,username,password);

}catch(ClassNotFoundExceptionel){

}catch(SQLExceptione2){}

)

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,lOException{

response.setContentType("text/html;charset=gb2312n);

Printwriterout=response.getWriter();

out.printin(n<html><body>");

out.printin(n<table>");

try(

Stringsql=nSELECT*FROMbooks";

Statementstmt=dbconn.createStatement();

ResultSetrst=stmt.executeQuery(sql);

while(rst.next()){

out.printin(n<tr><td>n+rst.getString(1)+n</td>n);

out.printin(n<td>n+rst.getString(2)+”</td>“);

out.printin(n<td>n+rst.getString(3)+n</td>n);

out.printin(n<td>n+rst.getString(4)+”</td>“);

out.printin(n<td>n+rst.getDouble(5)+n</td></tr>n);

)

}catch(SQLExceptione){

e.printStackTrace();

)

out.printin(“〈/table〉”);

out.printin(n</body></html>,');

)

publicvoiddestroy(){

try(

dbconn.close();

}catch(Exceptione){

e.printStackTrace();

}

)

}

7.JSP頁(yè)面如下:

<%@pagecontentType=ntext/html;charset=gb2312n%>

<%0pageimport=njava.sql.*,java.io.*n%>

<htmlxbody>

<%

Stringdriver=norg.postgresql.Driver,';

Stringdburl=njdbc:postgresql://:5432/bookstoren;

Stringusername="bookstore";

Stringpassword="bookstore";

try(

Class.forName(driver);

Connectiondbconn=DriverManager.getConnection(

dburl,username,password);

DatabaseMetaDatadbmd=dbconn.getMetaData();

out.printsIn("數(shù)據(jù)庫(kù)名:H+dbmd.getDatabaseProductName()+n</br>n);

out.printin("數(shù)據(jù)庫(kù)版本:"+dbmd.getDatabaseProductVersion()+n</br>n);

out.printIn("連接的用戶:"+dbmd.getUserName()+n</br>");

out.printin("數(shù)據(jù)庫(kù)URL:n+dbmd.getURL()+H</br>n);

out.printin("馬區(qū)動(dòng)程序名:"+dbmd.getDriverName()+"</br>n);

out.printin("馬區(qū)動(dòng)程序版本:n+dbmd.getDriverVersion()+n</br>,T);

}catch(ClassNotFoundExceptionel){

out.printin(el);

}catch(SQLExceptione2){

out.printin(e2);

)

%>

</body></html>

8.JSP頁(yè)面如下:

<%@pagecontentType=Htext/html;charset=gb2312"%>

<%@pageimport=njava.sql.*,java.io.**'%>

<htmlxbody>

<%

Stringdriver=norg.postgresql.DriverM;

Stringdburl="jdbc:postgresql://:5432/bookstore°;

Stringusername="bookstore";

Stringpassword="bookstore";

try{

Class.forName(driver);

Connectiondbconn=DriverManager.getConnection(

dburl,username,password);

Stringsql=nSELECT*FROMpublic.books";

Statementstmt=dbconn.createStatement();

ResultSetrst=stmt.executeQuery(sql);

ResuitSetMetaDatarstmd=rst.getMetaData();

out.printin("結(jié)果集歹U數(shù):n+rstmd.getColumnCount()+”</br>");

out.printIn("第3歹U標(biāo)題:"4-rstmd.getColumnLabel(3)+”</br>”);

out.printin3列名:n+rstmd.getColumnName(3)+n</br>");

out.printin("第3歹U類型:"+rstmd.getColumnType(3)+”</br>");

out.printIn(n3歹U類型名:n+rstmd.getColumnTypeName(3)+H</br>n);

}catch(ClassNotFoundExceptionel){

out.printin(el);

}catch(SQLExceptione2){

out.printIn(e2);

}

%>

</body></html>

9.按教材7.7.2節(jié)建立局部或全局?jǐn)?shù)據(jù)源sampleDS。創(chuàng)建程序7.9的CustomerBean.java

程序和程序7.10的SampleDAO.java程序。

SelectCustomerServlet.java代碼如下:

packagecom.control;

importjava.io.*;

importjava.sql.*;

importjava.util.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

importcom.model.CustomerBean;

importcom.model.SampleDAO;

publicclassSelectCustomerServletextendsHttpServlet{

publicvoiddoGet(HttpServletRequestrequest,

HttpServletResponseresponse)

throwsServletException,lOException{

SampleDAOdao=newSampleDAO();

ArrayList<CustomerBean>custs=dao.selectCustomer();

request.setAttribute("custs",custs);

RequestDispatcherview=getServletContext().

getRequestDispatcher("/displaycustomer.jsp");

view.forward(request,response);

)

)

displayCustomer.jsp頁(yè)面代碼如卜:

<%0pagecontentType=,,text/html;charset=gb2312n%>

<%0pageimport=ncom.model.CustomerBean,java.util.*n%>

<html><head><title>DisplayCustomer</title></head>

<body>

<%

ArrayList<CustomerBean>custs=

(ArrayList<CustomerBean>)request.getAttribute("custs");

for(CustomerBeancb:custs){

out.printIn(cb.getCustName()+**"+cb.getEmail()+*'"

+cb.getPhone()+'*</br>n);

}

%>

</body></html>

10.首先在SampleDAO類中定義下面兩個(gè)字符串常量:

privatestaticfinalStringDELETE_SQL=

“DELETEFROMcustomerWHEREcustName=?n;

privatestaticfinalStringUPDATE_SQL=

"UPDATEcustomerSETemail=?,phone=?WHEREcustName=?H;

下面是刪除客戶和修改客戶的方法:

//按姓名刪除客戶記錄

publicbooleandeleteCustomer(StringcustName){

Connectionconn=null;

PreparedStatementpstmt=null;

ResultSetrst=null;

CustomerBeancustomer=null;

try{

conn=dataSource.getConnection();

pstmt=conn.prepareStatement(DELETE_SQL);

pstmt.setstring(1,custName);

intn=pstmt.executeUpdate();

if(n==1){

returntrue;

}else{

returnfalse;

}

}catch(SQLExceptionse){

returnfalse;

}finally{

try(

pstmt.close();

conn.close();

}catch(SQLExceptionse){}

)

)

//修改客戶記錄

publicbooleanupdateCustomer(CustomerBeancustomer){

Connectionconn=null;

PreparedStatementpstmt=null;

try(

conn=dataSource.getConnection();

pstmt=conn.prepareStatement(UPDATE_SQL);

pstmt.setstring(1,customer.getEmail());

pstmt.setstring(2,customer.getPhone());

pstmt.setstring(3,customer.getCustName());

intn=pstmt.executeUpdate();

if(n==1){

returntrue;

}else{

returnfalse;

)

}catch(SQLExceptionse){

returnfalse;

}finally{

try(

pstmt.close();

conn.close();

}catch(SQLExceptionse){}

)

}

11.首先在PostgreSQL數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)求整數(shù)階乘的函數(shù)my_factorial(),代碼如下:

CREATEORREPLACEFUNCTIONmy_factorial(valueinteger)

RETURNSintegerAS$$

DECLARE

arginteger;

BEGIN

arg:=value;

IFargISNULLORarg<0THEN

RAISENOTICE*InvalidNumber1;

RETURNNULL;

ELSE

IFarg=1THEN

RETURN1;

ELSE

DECLARE

next_valueinteger;

BEGIN

next_value:=my_factorial(arg-1)*arg;一函數(shù)遞歸調(diào)用

RETURNnext_value;

END;

ENDIF;

ENDIF;

END;

$$LANGUAGE'plpgsql';

創(chuàng)建JSP頁(yè)面compute.jsp,連接數(shù)據(jù)庫(kù),調(diào)用存儲(chǔ)過(guò)程:

<%@pagecontentType=ntext/html;charsets=gb2312n%>

nH

<%0pageimport=java.sql.★fjava.io.*%>

<htmlxbody>

<formaction=Mnmethod="postH>

請(qǐng)輸入一個(gè)整數(shù):<inputtype=Htextnname="paramnsize=,,5H/>

<inputtype=wsubmitu確定”/>

</form>

<%

Stringdriver=Horg.postgresql.Driver;

Stringdburl=*'jdbc:postgresql://:5432/bookstoren;

Stringusername="bookstore";

Stringpassword="bookstore";

try{

Class.forName(driver);

Connectiondbconn=DriverManager.getConnection(

dburl,username,password);

Integernum=0;

if(request.getParameter("param")!=null)

num=Integer.parseInt(request.getParameter(nparamn));

Stringsql=H{?=callmy_factorial(?)}n;

CallableStatementcstmt=dbconn.prepareCall(sql);

cstmt.setInt(2,num);

cstmt.registerOutParameter(1,java.sql.Types.INTEGER);

cstmt.execute();

intresult=cstmt.getInt(1);

request.setAttribute(nresultn,result);

}catch(ClassNotFoundExceptionel){

out.printIn(el);

}catch(SQLExceptione2){

out.printIn(e2);

}catch(NumberFormatExceptione3){

out.printIn("輸入未合法!n);

}

%>

<p><%=request.getParameter("param”)宅>的階乘為:

<%=request.getAttribute("resultn)%></p>

</body></html>

該頁(yè)面的運(yùn)行結(jié)果如下:

地址U/http://1ocalhost:8080/helloapp/compute.jsp

請(qǐng)輸入一個(gè)整數(shù):5|晅

5的階乘為:120

12.略。

雪章習(xí)題解析

1.答:表達(dá)式語(yǔ)言是JSP頁(yè)面中使用的一種簡(jiǎn)潔的數(shù)據(jù)訪問(wèn)語(yǔ)言。它定義了運(yùn)算符實(shí)

現(xiàn)算術(shù)、關(guān)系等運(yùn)算;可以對(duì)作用域變量、JavaBeans對(duì)象、集合的元素、請(qǐng)求參數(shù)、Cookie

等進(jìn)行簡(jiǎn)單的訪問(wèn);還可以訪問(wèn)Java語(yǔ)言定義的函數(shù)(靜態(tài)方法)。

2.答:使用點(diǎn)(.)運(yùn)算符可以訪問(wèn)Map對(duì)象一個(gè)鍵的值和bean對(duì)象的屬性值。使用

方括號(hào)([])運(yùn)算符還可以List對(duì)象和數(shù)組對(duì)象的元素。

3.答:(1)作用域變量;(2)JavaBeans的屬性;(3)訪問(wèn)集合元素;(4)訪問(wèn)

隱含變量。

4.答:(1)定義public類和靜態(tài)方法;(2)創(chuàng)建標(biāo)簽庫(kù)描述文件(TLD);(3)

在JSP頁(yè)面中訪問(wèn)EL函數(shù)。

5.答:將page指令的isELIgnored屬性設(shè)置為true,如下所示:

<%@pageisELIgnored='*truen%>

6.答:A7.答:A8.答:E

9.答:B,E10.答:B

11.答:由于paramValues返回的是包含String口的Map,所以需要訪問(wèn)數(shù)組的單個(gè)元

素。使用${paramValues.result[O]}和${paramValues.resultJ'O"]}都可以,但使用

${paramValues.result.O}不可以。

記住,paramValues和headerValues返回String]]的Map對(duì)象。

12.答:A,C13.答:C14.答:A

15.答:D16.答:B

17.答:${(5+3>0)?true:false}

18.參考程序如下:

(1)定義Java函數(shù)

packagecom.demo;

publicclassFunctions{

publicstaticbooleanpalindrome(Strings){

intlow=0;

inthigh=s.length()-1;

while(low<high){

if(s.charAt(low)!=s.charAt(high))

returnfalse;

low++;

high——;

)

returntrue;

)

)

(2)創(chuàng)建標(biāo)簽庫(kù)描述文件

<?xmlversion=H1.0"encoding=**UTF-8*'?>

<taglibxmlns=n/xml/ns/j2een

xmlns:xsi=,,/2001/XMLSchema-instance"

xsi:schemaLocation=*'/xml/ns/j2ee

/xml/ns/j2ee/web-jsptaglibrary_2_0.xsdn

version='*2.0',>

<description>ASimpleTagLibrary</description>

<tlib-version>l.0</tlib-version>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論