第一篇:JSP編程實驗報告
JSP編程實驗報告
學(xué)生姓名:學(xué)生班級:學(xué)生學(xué)號:指導(dǎo)教師:實驗n(n-實驗順序號):實驗名稱
一、實驗?zāi)康亩嶒瀮?nèi)容及步驟
三、源代碼
四、運行界面
五、收獲和體會
第二篇:JSP實驗報告
中南民族大學(xué)管理學(xué)院
學(xué)生實驗報告
課程名稱: JSP程序設(shè)計 年
級: 2010 專
業(yè): 姓 名: 學(xué) 號: 指導(dǎo)教師:
實驗地點: 管理學(xué)院綜合實驗室
學(xué)年至 學(xué)第 學(xué)期
第一章 JSP簡介
實驗 Tomcat服務(wù)器的安裝與配置
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生掌握怎樣設(shè)置Web服務(wù)目錄、怎樣訪問Web服務(wù)目錄下的JSP頁面、怎樣修改Tomcat服務(wù)器的端口號。
二、實驗要求
1、將下載的apache-tomcat-6.0.13.zip解壓到硬盤某個分區(qū),比如D。
2、在硬盤分區(qū)D下新建一個目錄,名字為student,見stuent設(shè)置為Web服務(wù)目錄,并為該Web服務(wù)目錄指定名字為good的虛擬目錄。
3、修改端口號為5678.在server.xml文件中找到修改端口號的部分,將端口號修改為5678.4、啟動Tomcat服務(wù)器。
5、用文本編輯器編寫一個簡單的JSP頁面biao.jsp,并保存到Web服務(wù)目錄student中。
6、用瀏覽器訪問Web服務(wù)目錄student中的jsp頁面biao.jsp。
三、實驗內(nèi)容
1、Tomcat安裝成功并運行
2、編碼實現(xiàn)乘法表 3.代碼
四、實驗結(jié)果
biao.jsp頁面
五、實驗結(jié)果分析
1、默認(rèn)的端口號為8080,若修改,在conf目錄下的server.xml文件中修改端口號。
2、設(shè)置虛擬目錄。在conf目錄下的server.xml中前加入:
3、Tomcat服務(wù)器必須保持啟動。第二章 JSP頁面與JSP標(biāo)記 實驗1 JSP頁面的基本結(jié)構(gòu)
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生掌握怎樣在JSP頁面中使用成員變量,怎樣使用Java程序片、Java表達(dá)式。
二、實驗要求
本實驗將用戶輸入的單詞按字典順序。需要編寫兩個JSP頁面,名字分別為inputWord.jsp和showDictionary.jsp。
1、inputWord.jsp的具體要求 該頁面有一個表單,用戶通過將該表單輸入若干個單詞,并提交給showDictionary.jsp頁面。
2、showDictionary.jsp的具體要求
該頁面負(fù)責(zé)排序單詞,并將排序的全部單詞顯示給用戶。
(1)該JSP頁面有個名字為dictionary、類型是TreeSet成員變量。
(2)該JSP頁面有public void addWord(String s)方法,該方法將參數(shù)s指定的字符串添加到成員變量dictionary中。
(3)該JSP頁面在程序片中操作dictionary,即顯示全部的單詞。
三、實驗內(nèi)容
1)inputWord.jsp頁面有一個表單,用戶通過該表單輸入若干個單詞,并提交給showDictionary.jsp頁面。
2)showDictionary.jsp負(fù)責(zé)排序單詞,并將排序的全部單詞顯示給用戶。3)代碼
四、實驗結(jié)果
inputWord.jsp頁面
showDictionary.jsp頁面
五、實驗結(jié)果分析
1、jsp頁面由html標(biāo)記、jsp標(biāo)記、成員變了和方法的聲明、java程序片和java表達(dá)式組成。
2、jsp頁面中的成員變量是被所有用戶共享的變量。Java程序片可以操作成員變了,任何一個用戶對jsp頁面成員變量操作的結(jié)果,都會影響到其他用戶。
實驗2 JSP指令標(biāo)記
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生掌握怎樣在JSP頁面中使用include指令標(biāo)記在JSP頁面中靜態(tài)插入一個文件內(nèi)容。
二、實驗要求
該實驗要求使用include指令標(biāo)記使得每個頁面都包含有導(dǎo)航條。在進(jìn)行實驗之前將名字是leader.txt的文件保存到本實驗所使用的web服務(wù)目錄中。實驗要求編寫3個JSP頁面,具體要求如下。first.jsp的具體要求
first.jsp使用include指令靜態(tài)插入leader.txt.second.jsp的具體要求
second.jsp使用include指令靜態(tài)插入leader.txt.third.jsp的具體要求
third.jsp使用include指令靜態(tài)插入leader.txt.三、實驗內(nèi)容
leader.txt編寫3個JSP頁面。
1)frist.jsp使用include指令靜態(tài)插入leader.txt文本文件。2)second.jsp使用include指令靜態(tài)插入leader.txt文件。3)third.jsp使用include指令靜態(tài)插入leader.txt。3)代碼 1
2.3.4.4)
四、實驗結(jié)果
frist.jsp頁面
second.jsp頁面
third.jsp頁面
五、實驗結(jié)果分析
1、include指令標(biāo)記是在jsp頁面出現(xiàn)該指令的位置處,靜態(tài)的插入一個文 件。被插入的文件必須是可訪問和可使用的。Include指令標(biāo)記是在編譯 階段就處理所需要的文件,被處理的文件在邏輯和語法上依賴與當(dāng)前jsp 頁面,優(yōu)點是執(zhí)行速度快。
實驗3 JSP動作標(biāo)記
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生掌握怎樣在JSP頁面中使用include標(biāo)記動態(tài)加載文件,使用forward實現(xiàn)頁面的轉(zhuǎn)向。
二、實驗要求
編寫3個JSP頁面:giveFileName.jsp、readFile.jsp和error.jsp。
1、giveFileName.jsp的具體要求
要求giveFileName.jsp頁面使用include動作標(biāo)記動態(tài)加載readFile.jsp頁面,并將一個文件的名字比如ok.txt傳遞給被加載的readFile.jsp頁面。
2、readFile.jsp的具體要求
要求readFile.jsp負(fù)責(zé)根據(jù)giveFileName.jsp頁面?zhèn)鬟f過來的文件名字進(jìn)行文件的讀取操作,如果該文件不存在就使用
Forward動作標(biāo)記將用戶轉(zhuǎn)向error.jsp頁面。
3、error.jsp的具體要求 負(fù)責(zé)顯示錯誤信息。
三、實驗內(nèi)容
1)giveFileName.jsp頁面使用include動作標(biāo)記動態(tài)加載readFtle.jsp頁面,并將一個文件的名字ok.txt傳遞給被加載的readFtle.jsp頁面。
2)readFile.jsp頁面負(fù)責(zé)根據(jù)giveFileName.jsp頁面?zhèn)鬟f過來的文件名字進(jìn)行文件的讀取操作,如果該文件不存在就使用forward動作標(biāo)記將用戶轉(zhuǎn)向error.jsp。
3)error.jsp負(fù)責(zé)顯示錯誤信息。4)代碼
四、實驗結(jié)果
giveFileName.jsp頁面
error.jsp頁面
五、實驗結(jié)果分析
1、include動作標(biāo)記是在jsp頁面運行時才處理加載的文件,被加載的文件在邏輯和語 法上獨立與當(dāng)前jsp頁面,include指令標(biāo)記可以使用param子標(biāo)記向被加載的jsp 文件傳遞信息。第三章 Tag文件與Tag標(biāo)記
實驗1 JSP頁面的基本結(jié)構(gòu)
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生靈活掌握在Tag標(biāo)記中使用標(biāo)記體。
二、實驗要求
編寫一個JSP頁面giveMess.jsp和一個Tag文件handleMess.tag。JSP頁面通過調(diào)用Tag文件在表格中的單元格顯示文本,該JSP頁面通過使用標(biāo)記體將要顯示的文件傳遞給被調(diào)用的Tag文件。
三、實驗內(nèi)容
1、giveMess.jsp頁面使用帶標(biāo)記體的Tag標(biāo)記來調(diào)用Tag文件,其中標(biāo)記體是一行文本,如下所示:
2、handelMess.tag使用
3、分別寫出giveMess.jsp和handelMess.tag的代碼。4.代碼
四、實驗結(jié)果
giveMess.jsp頁面
五、實驗結(jié)果分析
1、tag文件中可以有html標(biāo)記符、特殊的指令標(biāo)記、成員變了和方法、java程序片和java表達(dá)式。
2、jsp頁面使用tag標(biāo)記動態(tài)執(zhí)行一個tag文件。
3、當(dāng)jsp頁面調(diào)用一個tag文件時可能希望動態(tài)地向該tag文件傳遞信息,那么就可以使用帶有標(biāo)記體的tag標(biāo)記來執(zhí)行一個tag文件。
實驗2 使用attribute指令
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生靈活掌握在Tag標(biāo)記中使用attribute指令。
二、實驗要求
編寫一個ShowCalendar.tag文件,該Tag文件負(fù)責(zé)顯示日歷。編寫一個JSP頁面giveYearMonth.jsp,該JSP頁面使用Tag標(biāo)記調(diào)用ShowCalendar.tag文件,并且向ShowCalendar.tag文件傳遞年份和月份。
三、實驗內(nèi)容
1、giveYearMonth.jsp通過tag標(biāo)記調(diào)用ShowCalendar.tag文件,并且向ShowCalendar.tag文件傳遞年份和月份。
2、ShowCalendar.tag文件根據(jù)jsp頁面?zhèn)鬟f過來的年份和月份顯示日歷。該文件能對jsp頁面?zhèn)鬟f過來的數(shù)據(jù)進(jìn)行判斷,比如,如果jsp頁面?zhèn)鬟f過來的數(shù)據(jù)不是數(shù)值型數(shù)據(jù),tag文件負(fù)責(zé)顯示錯誤信息。4.代碼
四、實驗結(jié)果
giveYearMonth.jsp頁面
五、實驗結(jié)果分析
1、一個tag文件中通過使用attribute指令,使得jsp頁面在調(diào)用tag文件時,可以 向該tag文件中的對象傳遞一個引用。tag文件中使用attribute指令:
<%@ attribute name=“對象名字” required=“true”|“false” type=“對象的類型”%>
實驗3 使用variable指令
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生靈活掌握在Tag標(biāo)記中使用variable指令。
二、實驗要求
編寫一個Tag文件GetWord.tag,負(fù)責(zé)分解出字符串中的全部單詞,并將分解出的全部單詞返還給調(diào)用該Tag文件的JSP頁面。編寫一個JSP頁面giveSoring.jsp,該頁面負(fù)責(zé)向Tag文件傳遞一個由英文單詞構(gòu)成的字符串,并負(fù)責(zé)顯示Tag文件返回的全部單詞。
三、實驗內(nèi)容
1、giveSoring.jsp通過tag標(biāo)記調(diào)用GetWord.tag,并傳遞一個由英文單詞構(gòu)成的字符串,顯示tag文件返回的全部單詞。
2、GetWord.tag使用attibute指令得到j(luò)sp頁面?zhèn)鬟f過來的字符串,并用vatiable指令返回全部的單詞。
3.代碼
四、實驗結(jié)果 giveSoring.jsp頁面
五、實驗結(jié)果分析
1、Tag文件可以使用variable指令把一個對象返回給調(diào)用它的jsp頁面
Tag文件使用variable指令給出返回的對象的名字、類型和有效范圍:
<%@ variable name-given=“對象名字” variable-class=“對象的類型” scope=“有效范圍”%>
第4章 JSP內(nèi)置對象 實驗1 request對象
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生掌握怎樣在JSP中使用內(nèi)置對象request。
二、實驗要求
通過JSP頁面和Tag文件實現(xiàn)數(shù)字的四則運算,要求編寫兩個JSP頁面inputNumber.jsp和receiveNumber.jsp及一個Tag文件Computer.tag。receiveNumber.jsp使用內(nèi)置對象接受inputNumber.jsp提交的數(shù)據(jù),然后將計數(shù)任務(wù)交給Tag文件Computer.tag去完成。
三、實驗內(nèi)容
1)inputNumber.jsp頁面提供一個表單,用戶可以通過表單輸入兩個數(shù)、選擇四則運算符號,并將輸入的兩個數(shù)和所選擇的運算符號提交給receiveNumber.jsp頁面。
2)receiveNumber.jsp使用內(nèi)置對象inputNumber.jsp頁面提交的數(shù)據(jù),然后將計算任務(wù)交給Tag文件Computer.tag去完成。
3)要求Computer.tag使用attribute指令得到receiveNumber.jsp頁面?zhèn)鬟f過來的書和運算符號,使用variable指令將運算結(jié)果返回給receiveNumber.jsp頁面。
4)代碼
四、實驗結(jié)果
inputNumber.jsp頁面
receiveNumber.jsp頁面
五:實驗結(jié)果分析
1、內(nèi)置對象request的作用就是用來接收客戶端提交的請求
2、request對象用的比較多的方法是getParameter方法。
request對象的getParameter方法根據(jù)指定的參數(shù),獲取客戶端提交的信息。
其語法規(guī)則如下:
<% String name=request.getParameter(“txtName”)%>
其中,name是一個字符串變量。txtName是客戶端提交信息中的一個字段名。
3、下面的就是在實驗里面request的使用 <% String a=request.getParameter(“numberOne”);String b=request.getParameter(“numberTwo”);String operator=request.getParameter(“operator”)
實驗2 responese對象
一、實驗?zāi)康?/p>
本實驗的目的是掌握怎樣使用response對象動態(tài)響應(yīng)用戶的請求。
二、實驗要求
編寫兩個JSP頁面inputRadius.jsp和drawCircle.jsp頁面,drawCircle.jsp頁面使用response對象做出動態(tài)響應(yīng)。
三、實驗內(nèi)容
1)inputRadius.jsp提供表單,用戶在表單中輸入一個代表圓的半徑的數(shù)字,提交給drawCircle.jsp頁面。
2)drawCircle.jsp頁面首先使用request對象獲得inputRadius.jsp提交的數(shù)字,然后根據(jù)數(shù)字的大小做出不同的響應(yīng)。如果數(shù)字小于等于0或者大于100,response對象調(diào)用setCountType(String s)方法將contentType屬性的值設(shè)置為text/plain,同時輸出“半徑不合理”;如果數(shù)字大于0并且小于等于100,response對象調(diào)用setContentType(String s)方法將contentType屬性的值設(shè)置為image/jpeg,并繪制一個圓;如果用戶在inputRadius.jsp頁面輸入了非數(shù)字,response對象調(diào)用sendRedirect(URL url)方法將用戶重定向到inputRadius.jsp。
3)代碼
四、實驗結(jié)果
1、在輸入要求的范圍以內(nèi):
inputRadius.jsp頁面
drawCircle.jsp頁面
2、當(dāng)輸入的數(shù)據(jù)不符合要求的結(jié)果顯示:
inputRadius.jsp頁面
drawCircle.jsp頁面
五、實驗結(jié)果分析:
1、response的作用就是把服務(wù)器端的數(shù)據(jù)以HTTP的格式發(fā)送到客戶端瀏覽器
2、與request相比,它的功能和request對象的功能相反。request對象用于得到用戶提交的信息而response對象是向用戶發(fā)送信息,兩者結(jié)合起來完成動態(tài)頁面的交互功能。
3、response對象的主要方法:
sendRedirect():頁面重定向方法 setStatus():設(shè)置狀態(tài)行方法
setContentType():設(shè)置文本類型方法
實驗3 session對象
一、實驗?zāi)康?/p>
本實驗的目的是讓學(xué)生掌握怎樣使用session對象存儲和用戶有關(guān)的數(shù)據(jù)。
二、實驗要求
使用session對象模擬購物車。編寫兩個JSP頁面choiceBook.jsp和orderForm.jsp。
三、實驗內(nèi)容 1)用戶在choiceBook.jsp頁面通過超鏈接將自己要購買的圖書信息傳遞到orderForm.jsp頁面。
2)orderForm頁面將用戶購買的圖書信息存儲到session對象中,然后生成一個圖書訂單并顯示給用戶。
3)代碼
四、實驗結(jié)果:
choiceBook.jsp頁面
orderForm頁面
五、實驗結(jié)果分析:
1、session的作用就是記住客戶的連接信息,可以使用會話對象(session)。session對象記錄了每個客戶與服務(wù)器的連接信息
2、判斷session是否失效有三種情況1)、客戶是否關(guān)閉瀏覽器。2)、是否到達(dá)最大的發(fā)呆時間3)、是否調(diào)用validate()函數(shù)
3、session對象常用方法:
setAttribute(String name,java.lang.Object value):設(shè)定指定名字的屬性值,并且把它存儲在session對象中。getAttribute(String name):獲得指定名字的屬性,如果該屬性不存在,將會返回null
第5章 JSP中的文件操作(實驗)實驗1 使用文件字節(jié)流讀寫文件
1、相關(guān)知識點。
Fileunputstream流以字節(jié)(byte)為單位順序地讀取文件,只要不關(guān)閉流,每次調(diào)用read的方法就書訊地讀取源中其余的內(nèi)容,直接原到尾末或流被關(guān)閉。
Fileunputstream流以字節(jié)(byte)為單位順序地寫文件,只要不關(guān)閉流,每次調(diào)用writer方法就順序地向輸出流寫入內(nèi)容。2.實驗?zāi)康摹?/p>
本實驗的目的是掌握使用文件輸入,輸出字節(jié)流讀寫文件。3.實驗要求。
1)giveContent.jsp頁面提供一個表單,要求該表單提供一個text文件輸入框、select下拉列表和一個TextArea文本區(qū),用戶可以在text輸入框中輸入文件的名字、在select下拉列表選擇一個目錄、通過TextArea輸入多行文本。
2)writeContent.jsp頁面首先獲得giveContent.jsp頁面提交的文件所在目錄、名字以及TextArea文本區(qū)中的內(nèi)容傳遞給WriteTag.tag。
3)lookContent.jsp頁面提供一個表單,該表單提供兩個text文本輸入框,用戶可以在這兩個text文本框中輸入目錄和文件名字。單擊表單的“提交”按鈕將text中輸入的文件目錄以及文件名字提交給readContent.jsp。
4)readContent.jsp頁面首先獲得lookContent.jsp頁面提交的文件目錄、名字,然后使用Tag標(biāo)記調(diào)用Tag文件ReadTag.tag,并將文件所在目錄、名字傳遞給ReadTag.tag。
5)writeTag.tag文件使用attribute指令獲得writeCintent.jsp頁面?zhèn)鬟f過來的文件目錄 文件名字和文件內(nèi)容,然后使用文件字節(jié)輸入流將文件內(nèi)容寫入到文件中,給文件所在目錄就是writeCintent.jsp頁面?zhèn)鬟f過來的文家目錄,名字就是writeCintent.jsp頁面?zhèn)鬟f過來的文家名字。
6)ReadTag。Tag的具體要求
Read.Tag文件使用attribute指令獲得readContent.jsp頁面?zhèn)鬟f過來的文件目錄 文件名字和文件內(nèi)容,然后使用文件字節(jié)輸入流讀取文件,并負(fù)責(zé)現(xiàn)實所讀取的內(nèi)容。
7)代碼
4、實驗結(jié)果:
giveContent.jsp頁面
writeContent.jsp頁面
lookContent.jsp頁面
readContent.jsp頁面
5、實驗結(jié)果分析
1、把輸入流的指向稱做源,程序從指向源的輸入流中讀取源中的數(shù)據(jù)。而輸出流的指向是數(shù)據(jù)要去的一個目的地,程序通過向輸出流中寫入數(shù)據(jù)把信息傳遞到目的地。所有字節(jié)輸入流類都是InputStream(輸入流)抽象類的子類,而所有字節(jié)輸出流都是OutputStream(輸出流)抽象類的子類。
2、int read(): 輸入流調(diào)用該方法從源中讀取單個字節(jié)的數(shù)據(jù),該方法返 回字節(jié)值,如果未讀出字節(jié)就返回-1。
3、void write(int n): 輸出流調(diào)用該方法向輸出流寫入單個字節(jié)
實驗2 使用文件字節(jié)流加密文件
1、相關(guān)知識點
fileinputstream流和filereader流都是順序的讀取文件,只要不關(guān)閉,每次調(diào)用read方法就順序的讀取源中其余的內(nèi)容,只到源的末尾或流被關(guān)閉;二者的區(qū)別是fileinputstream流以字節(jié)為單位讀取文件,filereader流以字符為單位讀取文件
Fileoutstream流和filewtiter流順序地寫文件,只要不關(guān)閉流,每次調(diào)用writer方法的就順序的向輸出流寫入內(nèi)容,只到流被關(guān)閉。二者額區(qū)別是fileoutstream流以字節(jié)為單位些文件,filewtiter流以字符為單位文件
2、實驗?zāi)康?/p>
本實驗?zāi)康氖钦莆帐褂梦募址斎胼敵鲎x寫文件
3、實驗要求
編寫3個jsp頁面inputcontent,jsp write,jsp read.jsp ,兩個tag文件write.Tag和read.Tag 1).inputcontent,jsp的具體要求
inputcontent,jsp頁面提供一個表單,要求該表單提供textarea的輸入界面 用戶可以通過textarea的輸入界面多行文本提供交給write。Jsp界面 2.)write,jsp 的具體要求
write,jsp頁面調(diào)用一個tag文件write,jsp將inputcontent,jsp 頁面提交的文本信息加密后寫入文件save.txt中。
3)read.jsp 的具體要求
read.jsp 頁面提供一個表單,該表單提供兩個單選按鈕,名字分別是讀取加密的文件和讀取解密的文件 該頁面選中的單選按鈕的值提交給本頁面如果該頁面提交的值是單選按鈕讀取加密的文件的值 該頁面調(diào)用tag文件read.tag讀取文件save.txt如果該頁面提交的值是單選按鈕讀取解密文件的值,該頁面負(fù)責(zé)顯示read.tag文件返回的有關(guān)信息 4)write.Tag的具體要求
write.Tag文件使用attribute指令獲得write.jsp頁面?zhèn)鬟f過來的文本信息,并使用文本文件輸出流其寫入到文件save.txt 5)read.Tag的具體要求 read.Tag文件使用文件輸入流讀取文件save.txt,并根據(jù)read.jsp的要求決定是否進(jìn)行 6)代碼
四、實驗結(jié)果:
7)inputContent.jsp頁面
8)write.jsp頁面
9)read.jsp頁面
10)
五、實驗結(jié)果分析:
11)
1、FileInputStream流和FileReader流都是順序的讀取文件,只要不關(guān)閉流。每次調(diào)用read方法就順利的讀取源中其余的內(nèi)容,直到源的末尾或流被關(guān)閉。兩者的區(qū)別是Fileinputstream流以字節(jié)為單位讀取文件,F(xiàn)ileReader流以字符為單位讀取文件。
12)
2、FileOutStream流和FileReader流都是順序的寫文件,只要不關(guān)閉文件,每次調(diào)用write方法就順序的向輸出流寫入內(nèi)容,直到流被關(guān)閉。二者的區(qū)別是FileOutStream流以字節(jié)為單位讀取文件,F(xiàn)ileReader流以字符為單位讀取文件。
實驗3 使用數(shù)據(jù)流讀寫Java數(shù)據(jù)
1、實驗?zāi)康?/p>
本實驗的目的是掌握使用數(shù)據(jù)流讀寫Java數(shù)據(jù)。
2、實驗要求
編寫兩個JSP頁面writeData.jsp和readData.jsp。
3、實驗內(nèi)容
1)writeData.jsp頁面使用Java程序片將一個int型數(shù)據(jù)、一個long型數(shù)據(jù)、一個char型數(shù)據(jù)、一個String型數(shù)據(jù)和一個double型數(shù)據(jù)寫入到名字為javaData.data的文件中。
2)readData.jsp頁面讀取javaData.data文件中的數(shù)據(jù)并顯示出來。3)代碼
4、實驗結(jié)果
writeData.jsp頁面
readData.jsp頁面
5、實驗結(jié)果分析
1、Java使用流(stream)來執(zhí)行輸入輸出(I/O)的功能,流是一種數(shù)據(jù)的源頭和目的之 間的通信途徑.用于讀入數(shù)據(jù)稱為輸入流(input stream), 用于寫出數(shù)據(jù)稱為輸出流(output stream).2、當(dāng)使用流時需要使用java.io包,因此在涉及數(shù)據(jù)流操作的程序中都要先導(dǎo)入 java.io包:import java.io.*;
第六章 JSP中使用數(shù)據(jù)庫
要求在webapps目錄下新建一個web服務(wù)目錄chapter6。除特別要求外,本章實驗所涉及的jsp頁面均保存在chapter6中;tag文件保存在chapter6web-inttags目錄中。
實驗中用到的數(shù)據(jù)庫為book,其中的表為bookform表。在進(jìn)行實驗之前首先完成下列任務(wù):
1、使用microsoft access 2003 創(chuàng)建一個數(shù)據(jù)庫book(book.mdb)。
2、在數(shù)據(jù)庫book中創(chuàng)建名名字為bookform的表,表的字段及屬性如圖6-1所示。
3、講數(shù)據(jù)庫book設(shè)置為名字為information的數(shù)據(jù)源。
實驗1 查詢記錄
1、相關(guān)知識點
本實驗使用jdbc-odbc橋接器方式和數(shù)據(jù)庫建立連接,查詢數(shù)據(jù)庫中表的記錄的步驟是:(1)與數(shù)據(jù)庫information建立連接;
Connection con=DriverManager.get Connection(‘jdbc:odbc: information’);(2)返回Statement對象;
Statement sql=con.createStatement();(3)向數(shù)據(jù)庫發(fā)送關(guān)于查詢記錄的sql語句。返回查詢結(jié)果,即Resultset對象
2、實驗?zāi)康?/p>
本實驗的目的是掌握使用jdbc查詢數(shù)據(jù)庫中表的記錄。
3、實驗要求
編寫一個jsp頁面inputMess.jsp。編寫一個tag文件FindBook.tag。1)inputMess.jsp的具體要求
inputMess.jsp頁面提供表單。表單允許用戶輸入要查詢的內(nèi)容,以及選擇針對該內(nèi)容的查詢條件,比如,輸入“實用”,那么可以指定該內(nèi)容是書名的一部分或作者姓名等。inputMess.jsp頁面查詢條件條件提交給當(dāng)前頁面,當(dāng)前頁面調(diào)用FindBook.tag文件完成查詢操作。2)FindBook.tag的具體要求
FindBook.tag文件的使用attribute指令獲得inputMess.jsp頁面?zhèn)鬟^來的字段的查詢條件,然后與數(shù)據(jù)源information建立連接、根據(jù)得到的查詢條件查詢bookForm表。FindBook.tag文件使用variable指令的將查詢結(jié)果返回給inputMess.jsp頁面。
4、jsp頁面的效果示例
inputMess.jsp的效果如圖6-2所示。
5、參考代碼
可以按照實驗要求,參考本代碼編寫代碼。1)jsp頁面參考代碼、實驗結(jié)果
inputMess.jsp
7、實驗結(jié)果分析:
1、DriverManager類:用語跟蹤可用的JDBC驅(qū)動程序并產(chǎn)生數(shù)據(jù)庫連接。
2、Connection接口:用于取得數(shù)據(jù)庫信息、生成數(shù)據(jù)庫語句,并管理數(shù)據(jù)庫事務(wù)。
3、Statement接口:用于在基層連接上運行SQL語句,并且生成一個結(jié)果集。
4、查詢結(jié)果一般封裝在ResultSet對象中。ResultSet實際上是一張數(shù)據(jù)表。ResultSet對象有多種方法用來從查詢結(jié)果中讀取數(shù)據(jù)
5、在tag文件通過使用 attribute指令,就可以讓調(diào)用該tag文件的jsp頁面向該tag文件傳遞在jsp頁面輸入的查詢內(nèi)容的數(shù)據(jù)。tag文件通過使用variable屬性可以從tag文件向jap頁面返回符合查詢條件的內(nèi)容的數(shù)據(jù)
實驗2 更新記錄
1、相關(guān)知識點
本實驗使用jdbc-odbc橋接器方式和數(shù)據(jù)庫建立連接,查詢數(shù)據(jù)庫中表的記錄的步驟如下:(1)與數(shù)據(jù)庫information建立連接;
Connection con=DriverManager.get Connection(‘jdbc:odbc: information’);(2)返回Statement對象;
Statement sql=con.createStatement();(3)向數(shù)據(jù)庫發(fā)送關(guān)于更新記錄的sql語句: int m=sql.executeUpdate(更新記錄的sql語句);更新成功m的值為1,否則為0。
2、實驗?zāi)康?/p>
本實驗的目的是掌握使用jdbc更新數(shù)據(jù)庫中表的記錄。
3、實驗要求
編寫一個jsp頁面updateRecord.jsp和兩個tag文件UpdateRecord.tag、GetRecord.tag。updateRecord.jsp負(fù)責(zé)調(diào)用GetRecord.tag文件,顯示GetRecord.tag返回待更新的記錄的有關(guān)字段的值;updateRecord.jsp調(diào)用UpdateRecord.tag文件,并顯示UpdateRecord.tag返回的有關(guān)更新記錄是否成功的信息。1)updateRecord.jsp的具體要求 updateRecord.jsp頁面提供一個表單,該表單允許用戶輸入某種圖書的isbn號以及針對該isbn號的圖書的更新信息;該頁面負(fù)責(zé)將圖書的isbn號傳遞給GetRecord.tag,將圖書的更新信息傳遞給UpdateRecord.tag。2)GetRecord.tag的具體要求
GetRecord.tag文件使用attribute指令獲得updateRecord.jsp頁面?zhèn)鬟f過來的圖書的isbn號,并顯示和該圖書對應(yīng)的記錄。3)UpdateRecord.tag的具體要求
UpdateRecord.tag文件使用attribute指令獲得updateRecord.jsp頁面?zhèn)鬟f過來的圖書更新信息,然后更新數(shù)據(jù)庫中bookForm表中的記錄,并返回更新成功的消息給updateRecord.jsp頁面。
4、jsp頁面效果示例
updateRecord.jsp的效果如圖6-3所示。
5、參考代碼
6、實驗結(jié)果
updateRecord.jsp
7、實驗結(jié)果分析
1、在數(shù)據(jù)庫的連接于實驗一是一樣的,只是調(diào)用的方法不一樣,在查詢時Statement對象調(diào)用方法public int executeUpdate(String sql)
2、在jsp頁面輸入圖書的ISBN號,GetRecord.tag文件使用attribute指令獲得updateRecord.jsp頁面?zhèn)鬟f過來的圖書的ISBN號,在數(shù)據(jù)庫里進(jìn)行查找,并顯示和該圖書對應(yīng)的記錄
3、UpdateRecord.tag文件使用attribute指令獲得updateRecord.jsp頁面?zhèn)鬟f過來的圖書更新信息即圖書價錢的變化從39到25.5,然后更新數(shù)據(jù)庫中bookForm表中的記錄,并返回更新是否成功的消息給updateRecord.jsp頁面。這樣,如果在查詢該圖書,那么顯示的信息就是更新后的。
實驗3 刪除記錄
1、相關(guān)知識點
本實驗使用jdbc-odbc橋接器方式和數(shù)據(jù)庫建立連接,那么刪除數(shù)據(jù)庫中表的記錄的步驟如下:
(1)與數(shù)據(jù)庫information建立連接;
Connection con=DriverManager.get Connection(‘jdbc:odbc: information’);(2)返回Statement對象;
Statement sql=con.createStatement();(3)向數(shù)據(jù)庫發(fā)送關(guān)于刪除記錄的sql語句: int m=sql.executeUpdate(更新記錄的sql語句);刪除成功m的值為1,否則為0。
2、實驗?zāi)康?/p>
本實驗的目的是掌握使用jdbc刪除數(shù)據(jù)庫中表的記錄。
3、實驗要求
編寫一個jsp頁面inputDeletedISBN.jsp和一個tag文件DelRecord.jsp.1)inputDeletedISBN.jsp的具體要求
inputDeletedISBN.jsp頁面提供一個表單,該表單允許用戶圖書的ISBN提交到本頁面。2)DelRecord.jsp的具體要求
inputDeletedISBN.jsp頁面首先獲得本頁面提交的圖書的ISBN,然后使用tag標(biāo)記調(diào)用DelRecord.jsp刪除數(shù)據(jù)庫中表的相應(yīng)的記錄。
4、jsp頁面效果示例
inputDeletedISBN.jsp的效果如圖6-4所示:
5、參考代碼
可以按照實驗要求,參考本代碼編寫代碼。
6、實驗結(jié)果
inputDeletedISBN.jsp
7、實驗結(jié)果分析:
1、在連接方法和所用的方法都與更新語句相同,因為executeUpdate()方法執(zhí)行SQL的INSERT,UPDATE或DELETE語句,返回int值,給出受查詢影響的行數(shù)
2、將圖書的ISBN輸入到件jsp頁面,然后由tag文件進(jìn)行相應(yīng)的處理
3、將滿足條件的圖書直接刪除,并將結(jié)果顯示在本頁面。
第七章 jsp與javabean 要求在webapps目錄下新建一個web服務(wù)目錄chapter7。除特別要求外,本章實驗所涉及的jsp頁面均保存在chapter7中。實驗涉及的Javabean的包名均為bean.date,因此,要求在chapter7下建立子目錄webclassesbeandate,Javabean的字節(jié)碼文件保存在該子目錄中。
實驗1 有效范圍為request的bean 1.相關(guān)知識點
JSP頁面使用useBean標(biāo)記調(diào)用一個有效范圍是request的bean:
本實驗的目的是掌握使用有效范圍是request的bean的存儲信息。3.實驗要求 編寫一個JSP頁面inputAndShow.JSP和一個名字為computer的javabean,其中computer由pc.class類負(fù)責(zé)創(chuàng)建。 1)inputAndShow.jsp的具體要求 inputAndShow.jsp頁面提供一個表單。其中表單允許用戶輸入計算機(jī)的品牌 型號和生產(chǎn)日期,該表單將用戶輸入的信息提交給當(dāng)前調(diào)用名字為compter的bean,并使用表單提交的數(shù)據(jù)設(shè)置computer的有關(guān)屬性的值,然后顯示compter的各個屬性值。2)pc.java的具體要求 編寫的pc.java應(yīng)當(dāng)有描述計算機(jī)品牌 型號 生產(chǎn)日期的屬性,并提供相應(yīng)的getXxx和setXxx方法,來獲取和修復(fù)這些屬性的值。Pc.java中試用package語句,起的包名是bean.data。將pc.java編譯后的字節(jié)碼文件pc.class保存到chapter7WEB-INFclassesbeandata的目錄中、4.JSP頁面效果示列 inputAndShow.jsp的效果如圖: 5、參考代碼 可以按照實驗要求,參考本代碼編寫代碼。1)jsp頁面參考代碼、實驗結(jié)果 inputAndShow.jsp頁面 7、實驗結(jié)果分析 1、JavaBean是一種可復(fù)用,跨平臺的組件。 2、如果request的bean那么request是用戶請求訪問的當(dāng)前組件、以及和當(dāng)前web組件共享同一用戶請求的web組件。范圍是指在一個jsp網(wǎng)頁發(fā)出請求到另一個jsp網(wǎng)頁之間,隨后這個屬性就失效,設(shè)定request的范圍時可利用request對象中的setattribute()和getattribute(),簡單的講就是客戶端的一次請求。 實驗2 有效范圍為session的bean 1.相關(guān)知識點 JSP頁面使用useBean標(biāo)記調(diào)用一個有效范圍是session的bean: 本實驗?zāi)康氖亲寣W(xué)生掌握使用有效范圍是session的bean顯示計算機(jī)的信息,3.實驗要求 本實驗2要求和實驗1類似,但是和實驗1不同的是,要求編寫兩個jsp頁面input.jsp和show,jsp。編寫一個名字為compter的javabean,其中compter由pc.class類負(fù)責(zé)創(chuàng)建。 1)input.jsp的具體要求 input.jsp頁面提供一個表單。其中表單允許用戶輸入計算機(jī)的品牌 型號和生產(chǎn)日期,該表單將用戶輸入的信息提交給當(dāng)前調(diào)用名字為compter的bean,并使用表單提交的數(shù)據(jù)設(shè)置computer的有關(guān)屬性的值。要求在input.jsp提供一個超鏈接以便用戶單機(jī)這個超鏈接訪問show.jsp頁面。13)show.jsp的具體要求 Show.jsp調(diào)用名字為computer的bean,并顯示bean的各個屬性的值。3)pc.java的具體要求 編寫的pc.java應(yīng)當(dāng)有描述計算機(jī)品牌 型號 生產(chǎn)日期的屬性,并提供相應(yīng)的getXxx和setXxx方法,來獲取和修復(fù)這些屬性的值。Pc.java中試用package語句,起的包名是bean.data。將pc.java編譯后的字節(jié)碼文件pc.class保存到chapter7WEB-INFclassesbeandata的目錄中。4.JSP頁面效果示列 Input.jsp的效果如圖 show.jsp的效果如圖 6、實驗結(jié)果 input.jsp頁面 Show.jsp頁面 7、實驗結(jié)果分析 1、session就是JavaBean對象被創(chuàng)建后,一直存在于當(dāng)前回話中,在同一會話中,共享同一JavaBean 2、session基于會話的,當(dāng)用戶網(wǎng)頁關(guān)閉的話,session就清空了或是到達(dá)了session最大的發(fā)呆時間。 實驗3 有效范圍application的bean 1.相關(guān)知識點 JSP頁面使用useBean標(biāo)記調(diào)用一個有效范圍是application的bean: 本實驗?zāi)康氖钦莆帐褂糜行Х秶莂pplication的bean制作一個簡單留言板。3.實驗要求 要求編寫兩個jsp頁面inputMess.jsp和show.jsp。編寫一個名字為board的javabean,其中board由MessBoard.class類負(fù)責(zé)創(chuàng)建.。第6章 inputMess.jsp的具體要求 inputMess.jsp頁面提供一個表單。其中表單允許用戶輸入留言者的姓名 留言標(biāo)題和留言內(nèi)容,該表單將用戶輸入的信息提交的當(dāng)前頁面,當(dāng)前頁面調(diào)用名字為board的bean,并使用表單提交的數(shù)據(jù)設(shè)置board的有關(guān)屬性的值。要求在inputMess.jsp中提供一個連接,已便用戶單擊這個超鏈接是訪問show.jsp頁面 第7章 show.jsp的具體要求 Show.jsp調(diào)用名字為board的bean,并顯示該bean的allMessage屬性的值 3)MessBoard.class的具體要求 編寫MessBoard.java應(yīng)當(dāng)有刻畫留言者的姓名.留言標(biāo)題 和留言內(nèi)容屬性,并刻畫全部留言信息的屬性allMessage。將MessBoard.java保存到chapter7WEB-INFclassesbeandata的目錄中。4.JSP頁面效果示列 inputMess.jsp的效果如圖 show.jsp的效果如圖 5、參考代碼 6、實驗結(jié)果 inputMess.jsp頁面 show.jsp 頁面 7、實驗結(jié)果分析 1、如果在scope指定范圍內(nèi),該JavaBean已存在,則 3、Application:在服務(wù)器運行期間有效,當(dāng)運行Tomcat時,就會生成Application,而且所有用戶在訪問相同服務(wù)目錄項的文件時,application對象都是相同的,當(dāng)關(guān)閉Tomcat時,Application對象失效。 (1)創(chuàng)建名稱為“UserInfo.java”類文件,該文件的主要代碼如下: package com; public class UserInfo { private String username=“"; private String password=”“; private String repassword=”“; private String realname=”“; private String sex=”“; private String age=”“; private String born=”“; private String address=”“; private String introduce=”“; public String getUsername(){ return username; } public void setUsername(String username){ this.username = username; } public String getPassword(){ return password; } public void setPassword(String password){ this.password = password; } public String getRepassword(){ return repassword; } public void setRepassword(String repassword){ this.repassword = repassword; } public String getRealname(){ return realname; } public void setRealname(String realname){ this.realname = realname; } public String getSex(){ return sex; } public void setSex(String sex){ this.sex = sex; } public String getAge(){ return age; } public void setAge(String age){ this.age = age; } public String getBorn(){ return born; } public void setBorn(String born){ this.born = born; } public String getAddress(){ return address; } public void setAddress(String address){ this.address = address; } public String getIntroduce(){ return introduce; } public void setIntroduce(String introduce){ this.introduce = introduce; } } (2)用戶注冊頁面的代碼如下: <%@ page contentType=”text/html;charset=gb2312“ language=”java“ im port=”java.sql.*“ errorPage=”“%> JSP程序設(shè)計實驗報告 (三)院系:計算機(jī)科學(xué)與工程學(xué)院 【實驗題目】 JSP內(nèi)置對象 【實驗?zāi)康摹?/p> 1、了解JSP中4個內(nèi)置對象request、reponse、session、pagecontext的基本概念。 2、理解JSP內(nèi)置對象的常用方法的功能。 3、掌握J(rèn)SP內(nèi)置對象的應(yīng)用。 【實驗內(nèi)容】 1、request對象:客戶端的請求信息被封裝在request對象中,通過它才能了解到客戶的需求,然后做出響應(yīng)。它是HttpServletRequest類的實例。 2、response對象:response對象包含了響應(yīng)客戶請求的有關(guān)信息,但在JSP中很少直接用到它。它是HttpServletResponse類的實例。 3、session對象:session對象指的是客戶端與服務(wù)器的一次會話,從客戶連到服務(wù)器的一個WebApplication開始,直到客戶端與服務(wù)器斷開連接為止。 4、pageContext對象:pageContext對象提供了對JSP頁面內(nèi)所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的SESSION,也可以取本頁面所在的application的某一屬性值,他相當(dāng)于頁面中所有功能的集大成者。 5、練習(xí)(自己完成) 【實驗代碼】 實驗1 request對象使用 <%@ page language=“java” import=“java.util.*” pageEncoding=“GBK”%> <% %> 第三篇:JSP實驗報告(范文模版)
第四篇:JSP內(nèi)置對象實驗報告
+ request.getServerName()+ “:” + request.getServerPort()+ path + “/”;
請求方式:<%=request.getMethod()%>
請求的資源:<%=request.getRequestURI()%>
請求用的協(xié)議:<%=request.getProtocol()%>
請求的文件名:<%=request.getServletPath()%>
請求的服務(wù)器的IP:<%=request.getServerName()%>
請求服務(wù)器的端口:<%=request.getServerPort()%>
客戶端IP地址:<%=request.getRemoteAddr()%>
客戶端主機(jī)名:<%=request.getRemoteHost()%>
表單提交來的值:<%=request.getParameter(”qwe“)%>
<%
%> String str = ”“;if(request.getParameter(”qwe“)!= null){ Enumeration enumt = request.getParameterNames();while(enumt.hasMoreElements()){ str = enumt.nextElement().toString();out.println(str + ”:“ + request.getParameter(str)+ ”
");} }
第五篇:網(wǎng)絡(luò)編程實驗報告
實驗一 TCP Socket API程序設(shè)計
一、預(yù)備知識
1.網(wǎng)絡(luò)編程基本概念
網(wǎng)絡(luò)上的計算機(jī)間的通訊,實質(zhì)上是網(wǎng)絡(luò)中不同主機(jī)上的程序之間的通訊。在互聯(lián)網(wǎng)中使用IP地址來標(biāo)識不同的主機(jī),在網(wǎng)絡(luò)協(xié)議中使用端口號來標(biāo)識主機(jī)上不同進(jìn)程,即使用(IP地址,端口號)二元組。
套接字(Socket)用于描述IP地址和端口,是一個通信鏈的句柄,通信時一個網(wǎng)絡(luò)程序?qū)⒁獋鬏數(shù)囊欢涡畔懭胨谥鳈C(jī)的Socket中,該Socket通過與網(wǎng)絡(luò)接口卡相連的傳輸介質(zhì)將這段信息發(fā)送到另一臺主機(jī)的Socket中,以供其他程序使用。
圖1-1 TCP通信流程 2.TCP通信流程
TCP程序是面向連接的,程序運行后,服務(wù)器一直處于監(jiān)聽狀態(tài),客戶端與服務(wù)器通信之前必須首先發(fā)起連接請求,由服務(wù)器接收請求并在雙方之間建立連接后才可以互相通信。
二、實驗?zāi)康?/p>
1.了解Winsock API編程原理; 2.掌握TCP Socket程序的編寫; 3.了解C/S模式的特點; 4.學(xué)會解決實驗中遇到的問題。
三、實驗任務(wù)
使用Winsock API相關(guān)類實現(xiàn)TCP Socket通信程序,并能成功運行。
四、實驗環(huán)境及工具
1.Windows2000/XP/7 2.Visual C++開發(fā)平臺 3.Visual Studio2010
五、實驗內(nèi)容和步驟
參照《Visual C++網(wǎng)絡(luò)編程教程》書中81頁,TCP Socket API程序設(shè)計。連接:
void CChatClientDlg::OnConnect(){
WSADATA wsd;
//WSADATA結(jié)構(gòu)
WSAStartup(MAKEWORD(2,2),&wsd);
//加載協(xié)議,使用Winsock 2.2版
m_client = socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建流式套接字
//服務(wù)器地址
sockaddr_in serveraddr;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“請指定服務(wù)器IP!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“請指定端口!”);
return;
}
//獲取服務(wù)器進(jìn)程的IP和端口
BYTE nFild[4];
CString sIP;
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//設(shè)置服務(wù)器地址結(jié)構(gòu)的內(nèi)容
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//發(fā)起連接須指明要訪問的服務(wù)器進(jìn)程地址,這個地址存儲在serveraddr中
if(connect(m_client,(sockaddr*)&serveraddr,sizeof(serveraddr))!= 0)
{
MessageBox(“連接失敗”);
return;
}
else
{
m_ListWords.AddString(“連接服務(wù)器成功!”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();}
“發(fā)送”按鈕事件過程代碼如下:
void CChatClientDlg::OnSend(){
//向服務(wù)器發(fā)送信息
UpdateData();
if(m_sWords.IsEmpty())
{
AfxMessageBox(“發(fā)送的消息不能為空!”);
return;
}
//開始發(fā)送數(shù)據(jù)
int i = send(m_client,m_sWords.GetBuffer(0),m_sWords.GetLength(),0);
m_ListWords.AddString(“發(fā)送:” + m_sWords);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);
ServerIP.EnableWindow();
ServerPort.EnableWindow();
m_ButtonConnect.EnableWindow();
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);
m_ButtonExit.EnableWindow();} “清空”按鈕的事件過程: m_ListWords.ResetContent();“關(guān)于”按鈕的事件過程: CAboutDlg dlgAbout;dlgAbout.DoModal();
服務(wù)器端: 開始監(jiān)聽代碼:
void CChatServerDlg::OnListen(){
WSADATA wsd;
//WSADATA結(jié)構(gòu)
WSAStartup(MAKEWORD(2,2),&wsd);
//加載協(xié)議棧,使用Winsock 2.2版
m_server = socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建流式套接字
//將網(wǎng)絡(luò)中的事件關(guān)聯(lián)到窗口的消息函數(shù)中,定義消息號為20000,偵測客戶端的連接請求
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);
m_client = 0;
BYTE nFild[4];
CString sIP;
UpdateData();
if(ServerIP.IsBlank())
{
AfxMessageBox(“請設(shè)置IP地址!”);
return;
}
if(sPort.IsEmpty())
{
AfxMessageBox(“請設(shè)置監(jiān)聽端口!”);
return;
}
ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
sIP.Format(“%d.%d.%d.%d”,nFild[0],nFild[1],nFild[2],nFild[3]);
//服務(wù)器地址
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
serveraddr.sin_port = htons(atoi(sPort));
//綁定地址
if(bind(m_server,(sockaddr*)&serveraddr,sizeof(serveraddr)))
{
MessageBox(“綁定地址失敗.”);
return;
}
//監(jiān)聽開始,服務(wù)器等待連接請求的到來
listen(m_server,5);
m_ListWords.AddString(“監(jiān)聽開始:”);
m_ListWords.AddString(“地址” + sIP + “ 端口” + sPort);
m_ListWords.AddString(“等待客戶端連接??”);
//界面完善
m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);
ServerIP.EnableWindow(false);
ServerPort.EnableWindow(false);
m_ButtonListen.EnableWindow(false);
m_ButtonStopListen.EnableWindow();
m_ButtonClear.EnableWindow();
m_ButtonExit.EnableWindow(false);} “停止監(jiān)聽”按鈕事件過程代碼如下: void CChatServerDlg::OnStopListen(){
//停止監(jiān)聽
closesocket(m_server);
m_ListWords.AddString(“停止監(jiān)聽”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);} “斷開”按鈕事件過程代碼如下: void CChatServerDlg::OnDisconnect(){
closesocket(m_client);
m_ListWords.AddString(“與客戶端斷開”);
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
//界面完善
m_ButtonDisconnect.EnableWindow();
m_EditWords.EnableWindow();
m_ButtonSend.EnableWindow();} ReceiveData()函數(shù)代碼如下:
void CChatServerDlg::ReceiveData(){
//接收客戶端的數(shù)據(jù)
char buffer[1024];
int num = recv(m_client,buffer,1024,0);
buffer[num] = 0;
CString sTemp;
sTemp.Format(“收到:%s”,buffer);
m_ListWords.AddString(sTemp);//顯示信息
m_ListWords.SetTopIndex(m_ListWords.GetCount()1);
closesocket(m_client);//關(guān)閉與客戶端通信的Socket
WSAAsyncSelect(m_server,m_hWnd,20000,FD_ACCEPT);//準(zhǔn)備接收新的客戶端連接
//界面完善
m_ButtonDisconnect.EnableWindow(false);
m_EditWords.EnableWindow(false);
m_ButtonSend.EnableWindow(false);} 服務(wù)器的初始化代碼如下: //界面初始化
m_ButtonStopListen.EnableWindow(false);m_ButtonDisconnect.EnableWindow(false);m_ButtonClear.EnableWindow(false);m_EditWords.EnableWindow(false);m_ButtonSend.EnableWindow(false);
運行結(jié)果:
六、思考題
1.用Winsock API編程時,主要進(jìn)行哪些通行的操作步驟? 2.闡述C/S模式的通信過程。答:
1.通行的操作
1.Winsock的打開(WSAStartup())。2.建立套接字(socket()或WSASocket())。3.地址綁定(bind())。
4.服務(wù)器監(jiān)聽連接(listen())。
5.客戶端提出連接申請(connect()或WSAConnect())。6.服務(wù)器接收客戶端的連接請求(accept()或WSAAccept())。7.數(shù)據(jù)的發(fā)送(send()或WSASend(),sendto()或WSASendTo())。8.數(shù)據(jù)的接收(recv()或WSARecv(),recvfrom()或WSARecvfrom())。9.關(guān)閉套接字(closesocket())。10.關(guān)閉Winsock(WSACleanup())。
2通信過程