




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
-36-
前言隨著互聯(lián)網(wǎng)逐步普及,人們的生活和工作也越來(lái)越離不開信息網(wǎng)絡(luò)的支持,而聊天室是人們最常見,最直接的網(wǎng)上交流方式。在網(wǎng)絡(luò)中,人們不需要知道對(duì)方真實(shí)的姓名,年齡,只要是在同一個(gè)軟件或者同一個(gè)聊天室里,大家都可以放下身心的包袱,無(wú)拘無(wú)束的交友、抒發(fā)自己的感想來(lái)緩減壓力。不會(huì)因?yàn)橐恍┎缓侠淼脑?,限制住自己的語(yǔ)言??梢赃@么說(shuō),網(wǎng)絡(luò)帶動(dòng)了信息的交流,而聊天帶來(lái)了人們更多的朋友和伙伴。人們?cè)谏睢W(xué)習(xí)、工作中難免會(huì)遇到各種各樣的問(wèn)題,比如生活中的不愉快、學(xué)習(xí)上的困惑、工作中的不順利都會(huì)使人們的心情變得很糟糕,當(dāng)人們無(wú)法解決這些困惑時(shí),就需要找個(gè)人來(lái)聊天釋放心中的不愉快。那么聊天室就是一個(gè)不錯(cuò)的選擇,在這聊天室里盡管說(shuō)出自己心中的困惑,因?yàn)檫@里是無(wú)拘無(wú)束的。聊天系統(tǒng)以聊天交流為主,為廣大用戶提供一個(gè)借助網(wǎng)絡(luò)進(jìn)行人際交往的平臺(tái),也是網(wǎng)絡(luò)與現(xiàn)實(shí)最貼近的實(shí)用型網(wǎng)站。本文所介紹的聊天系統(tǒng)是基于web開發(fā)設(shè)計(jì)的,其主要特性是能動(dòng)態(tài)、實(shí)時(shí)的完成信息的傳遞,其運(yùn)行所需環(huán)境及其工作流程將在本文依次介紹,并且文中提供了部分程序源代碼。根據(jù)當(dāng)前網(wǎng)絡(luò)的需求,網(wǎng)絡(luò)聊天越來(lái)越受到各種網(wǎng)民的青睞。因此開發(fā)網(wǎng)絡(luò)聊天是相當(dāng)有必要,而且在網(wǎng)站內(nèi)增加聊天功能,它不僅可以提高網(wǎng)站的訪問(wèn)量,同時(shí)還可以留住訪客,更重要的是讓訪客通過(guò)聊天室進(jìn)行實(shí)時(shí)的互相交流。當(dāng)前的聊天室都是嵌在一些大型的網(wǎng)站中,比如,新浪、搜狐網(wǎng)站把聊天室嵌入到當(dāng)中。就針對(duì)人們?cè)谏?、學(xué)習(xí)、工作中遇到的問(wèn)題,這些網(wǎng)站就沒(méi)有設(shè)立一個(gè)供人們討論解決問(wèn)題的聊天室。所以本文介紹的聊天室系統(tǒng)就針對(duì)這一問(wèn)題提供了一個(gè)很好的交流平臺(tái),具有很好的現(xiàn)實(shí)意義和實(shí)用價(jià)值。
第1章系統(tǒng)使用的技術(shù)概述1.1JSP的概述JSP技術(shù)提供了一種簡(jiǎn)單快速的方法來(lái)創(chuàng)建顯示動(dòng)態(tài)生成內(nèi)容的Web頁(yè)面。也就是在MVC中充當(dāng)V(View)的角色。由業(yè)界處于領(lǐng)先地位的Sun公司制定了相關(guān)的JSP技術(shù)規(guī)范,該規(guī)范定義了如何在服務(wù)器和JSP頁(yè)面間進(jìn)行交互,還描述了頁(yè)面的格式和語(yǔ)法。JSP頁(yè)面使用XML標(biāo)簽和scriptlets(一種使用Java語(yǔ)言編寫的腳本代碼),封裝了生成頁(yè)面內(nèi)容的邏輯。它將各種格式的標(biāo)簽(HTML或者XML)直接傳遞回響應(yīng)頁(yè)面。通過(guò)這種方式,JSP頁(yè)面實(shí)現(xiàn)了頁(yè)面邏輯與其設(shè)計(jì)和顯示的分離。JSP技術(shù)是Java系列技術(shù)的一部分。JSP頁(yè)面被編譯成servlet,并調(diào)用JavaBeans組件(beans)或EnterpriseJavaBeans組件(企業(yè)beans),以便在服務(wù)器端處理。因此,JSP技術(shù)在構(gòu)建可升級(jí)的基于web的應(yīng)用程序時(shí)扮演了重要角色。JSP技術(shù)是行業(yè)協(xié)作的結(jié)果,它的設(shè)計(jì)是開放的,符合行業(yè)標(biāo)準(zhǔn)的,并支持絕大多數(shù)的服務(wù)器、瀏覽器和相關(guān)工具。由于使用可重用的組件和標(biāo)簽取代了對(duì)頁(yè)面本身腳本語(yǔ)言的嚴(yán)重依賴,JSP技術(shù)大大加快了開發(fā)的速度。所有JSP的實(shí)現(xiàn)均支持以Java編程語(yǔ)言為基礎(chǔ)的腳本語(yǔ)言,它有與生俱來(lái)的可適應(yīng)性,支持復(fù)雜的操作。針對(duì)本聊天室也是使用了JSP技術(shù),沒(méi)有JSP的支持那么在顯示層就無(wú)法顯示數(shù)據(jù),即使系統(tǒng)做的再好那也無(wú)濟(jì)于事。1.2STRUTS的概述當(dāng)建筑師開始一個(gè)建筑項(xiàng)目時(shí),首先要設(shè)計(jì)該建筑的框架結(jié)構(gòu),有了這份藍(lán)圖,接下來(lái)的實(shí)際建筑過(guò)程才會(huì)有條不紊,井然有序。同樣,軟件件開發(fā)者開始一個(gè)軟件項(xiàng)目時(shí),首先也應(yīng)該構(gòu)思該軟件應(yīng)用的框架,規(guī)劃軟件模塊,并定義這些模塊之間的接口和關(guān)系??蚣芸梢蕴岣哕浖_發(fā)的速度和效率,并且使軟件更便于維護(hù)。對(duì)于開發(fā)web應(yīng)用,要從頭設(shè)計(jì)并開發(fā)一個(gè)可靠,穩(wěn)定的框架并不是一件容易的事。幸運(yùn)的是,隨著Web開發(fā)技術(shù)的日趨成熟,在Web開發(fā)領(lǐng)域出現(xiàn)了一些現(xiàn)成的優(yōu)秀的框架,開發(fā)者可以直接使用他們,Struts就是一種不錯(cuò)的選擇,他是基于MVC的Web應(yīng)用框架。Struts實(shí)質(zhì)上就是在JSPModel2的基礎(chǔ)上實(shí)現(xiàn)的一個(gè)MVC框架。在Struts框架中,模型由實(shí)現(xiàn)業(yè)務(wù)邏輯的javaBean或者EJB組件構(gòu)成,控制器ActionServlet和Action來(lái)實(shí)現(xiàn),視圖由一組JSP文件構(gòu)成。1.2.1視圖視圖就是一組JSP文件,在這些JSP文件中沒(méi)有業(yè)務(wù)邏輯,也沒(méi)有模型信息,只有標(biāo)簽,這些標(biāo)簽可以是標(biāo)準(zhǔn)的JSP標(biāo)簽或客戶化標(biāo)簽,如Sturts標(biāo)簽庫(kù)的標(biāo)簽。此外,通常把Struts框架中的ActionFormBean的也劃分到視圖模塊中。ActionFormBean也是一種javaBean,除了具有一些javaBean的常規(guī)方法,還包含一些特殊的方法,用于驗(yàn)證HTML表單數(shù)據(jù)以及將其屬性重新設(shè)置為默認(rèn)值。Struts框架把用戶輸入的表單數(shù)據(jù)保存在ActionFormBean中,把它傳遞給控制器,控制器可以對(duì)ActionFormBean中的數(shù)據(jù)進(jìn)行修改,JSP文件使用Struts標(biāo)簽讀取修改后的ActionFormBean的信息,重新設(shè)置HTML表單。1.2.2模型模型表示應(yīng)用程序的狀態(tài)和業(yè)務(wù)邏輯。對(duì)于大型應(yīng)用,業(yè)務(wù)邏輯通常由javaBean或者EJB組件來(lái)實(shí)現(xiàn)。1.2.3控制器控制器由ActionServlet類和Action類來(lái)實(shí)現(xiàn)。ActionServlet類是Struts框架中的核心組件。ActionServlet繼承了javax.servlet.http.HttpServlet類,它在MVC模型中扮演中央控制器的角色。ActionServlet主要負(fù)責(zé)接受HTTP請(qǐng)求信息,根據(jù)配置文件strut-config.xml的配置信息,把請(qǐng)求轉(zhuǎn)發(fā)給適當(dāng)?shù)腁ction對(duì)象,如果該Action對(duì)象不存在,ActionServlet會(huì)先創(chuàng)建這個(gè)Action對(duì)象。Action類負(fù)責(zé)調(diào)用模型的方法,更新模型的狀態(tài),并幫助控制應(yīng)用程序的流程。對(duì)于小型簡(jiǎn)單的應(yīng)用,Action充當(dāng)用戶請(qǐng)求和業(yè)務(wù)邏輯處理之間的適配器(Adaptor),其功能就是將請(qǐng)求與業(yè)務(wù)邏輯分開,Action根據(jù)用戶請(qǐng)求調(diào)用相關(guān)的業(yè)務(wù)邏輯組件。業(yè)務(wù)邏輯由javaBean或者EJB來(lái)完成,Action類側(cè)重于控制應(yīng)用程序的流程,而不是實(shí)現(xiàn)應(yīng)用程序的邏輯。通過(guò)將業(yè)邏輯放在單獨(dú)的java包或EJB中,可以提高程序的靈活性和可充用性。當(dāng)actionServlet控制器收到用戶請(qǐng)求后,把請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)Action實(shí)例。如果這個(gè)實(shí)例不存在,控制器會(huì)首先創(chuàng)建它,然后調(diào)用這個(gè)Action實(shí)例的execute()方法。Action的execute()方法返回ActionForward對(duì)象,它封裝了把用戶請(qǐng)求在轉(zhuǎn)發(fā)給其他Web組件的信息。用戶定義自己的Action類。即Action基類的子類時(shí),必須覆蓋execute()方法。在Action基類中該方法返回null。 圖1-1MVC模型圖MVC模式的出現(xiàn)不僅實(shí)現(xiàn)了功能模塊和顯示模塊的分離,同時(shí)它還提高了應(yīng)用系統(tǒng)的可維護(hù)性、可擴(kuò)展性、可移植性和組件的可復(fù)用性。早期的程序中,如果不注意模塊與模塊之間的耦合性,常常會(huì)增加程序的復(fù)雜性以及難以維護(hù)性。盡管MVC設(shè)計(jì)模式很早就提出,但在Web項(xiàng)目的開發(fā)中引入MVC卻是步履維艱。主要原因:一是在早期的Web項(xiàng)目的開發(fā)中,程序語(yǔ)言和HTML的分離一直難以實(shí)現(xiàn)。CGI程序以字符串輸出的形式動(dòng)態(tài)地生成HTML內(nèi)容。后來(lái)隨著腳本語(yǔ)言的出現(xiàn),前面的方式又被倒了過(guò)來(lái),改成將腳本語(yǔ)言書寫的程序嵌入在HTML內(nèi)容中。這兩種方式有一個(gè)相同的不足之處即它們總是無(wú)法將程序語(yǔ)言和HTML分離。二是腳本語(yǔ)言的功能相對(duì)較弱,缺乏支持MVC設(shè)計(jì)模式的一些必要的技術(shù)基礎(chǔ)。直到基于J2EE的JSPModel2問(wèn)世時(shí)才得以改觀。它用JSP技術(shù)實(shí)現(xiàn)視圖的功能,用Servlet技術(shù)實(shí)現(xiàn)控制器的功能,用JavaBean技術(shù)實(shí)現(xiàn)模型的功能。1.3AJAX的概述Ajax技術(shù)就是所謂的Web2.0技術(shù)的重要組成部分,Ajax技術(shù)既是對(duì)傳統(tǒng)Web技術(shù)的革命,也是對(duì)傳統(tǒng)Web技術(shù)的一種改良和發(fā)展。引入Ajax技術(shù)后,不僅改進(jìn)了Web應(yīng)用的性能,也改善了用戶的體驗(yàn)。下面就從幾個(gè)方面談?wù)剛鹘y(tǒng)Web應(yīng)用與Ajax之間的不同。用戶體驗(yàn)方面:這是Ajax技術(shù)最大的改善之處,對(duì)于傳統(tǒng)的Web應(yīng)用,用戶只能發(fā)送獨(dú)占式請(qǐng)求,一旦請(qǐng)求發(fā)送出去,頁(yè)面就處于等待狀態(tài),等待服務(wù)器響應(yīng)完成,在服務(wù)器響應(yīng)完成之前,客戶端的瀏覽器只能是一片空白;而Ajax技術(shù)則完全不同,它允許采用異步的方法發(fā)送請(qǐng)求,請(qǐng)求的發(fā)送完全不會(huì)阻塞當(dāng)前的瀏覽器線程,瀏覽器可以繼續(xù)下一步操作,例如繼續(xù)瀏覽,甚至再次發(fā)送異步請(qǐng)求。對(duì)于用戶的體驗(yàn)而言,Ajax提供了一種重大的改善,它讓用戶不會(huì)處于等待狀態(tài),用戶會(huì)感覺自己一直與應(yīng)用處于交互狀態(tài)。響應(yīng)速度:就響應(yīng)速度而言,一般人會(huì)認(rèn)為Ajax應(yīng)用的速度比傳統(tǒng)Web應(yīng)用要快,實(shí)際上這種說(shuō)法并不完全正確。正如前面見到的,基于Ajax的應(yīng)用需要大量增加JavaScript代碼,大量增加JavaScript代碼后的Web頁(yè)面在第一次加載時(shí)速度將比傳統(tǒng)Web頁(yè)還慢(因?yàn)楸仨毾螺d大量的JavaScript代碼)。一旦進(jìn)入該頁(yè)后,響應(yīng)速度便會(huì)明顯提高,因?yàn)闊o(wú)須頻繁地在各頁(yè)面之間跳轉(zhuǎn),從服務(wù)器獲得的僅是必須改變的數(shù)據(jù),因此減少了冗余數(shù)據(jù)的下載,從而大幅度提高響應(yīng)速度。有的人說(shuō),Ajax包含的大量JavaScript代碼會(huì)占用用戶的大量帶寬,這是相當(dāng)錯(cuò)誤的說(shuō)法,Ajax應(yīng)用讓頁(yè)面一次下載,但可以多次重復(fù)使用。表面上看,一次下載的JavaScript代碼量雖然增大,但從長(zhǎng)時(shí)間來(lái)看,傳統(tǒng)Web應(yīng)用需要多次下載Web頁(yè)面,需要的帶寬更大。應(yīng)用架構(gòu):傳統(tǒng)Web應(yīng)用主要由3層組成,而增加Ajax技術(shù)的Web應(yīng)用將在傳統(tǒng)的Web應(yīng)用上額外增加一個(gè)Ajax引擎,其實(shí)質(zhì)就是一層JavaScript代碼。開發(fā)的代碼量:Ajax技術(shù)的大部分功能都依賴于JavaScript語(yǔ)言實(shí)現(xiàn),大量的JavaScript代碼嚴(yán)重降低了程序員的開發(fā)速度。服務(wù)器的負(fù)擔(dān):大量使用Ajax技術(shù)的Web應(yīng)用將導(dǎo)致服務(wù)器的負(fù)擔(dān)大大加重,因?yàn)锳jax技術(shù)往往比傳統(tǒng)Web應(yīng)用需要發(fā)送更多的請(qǐng)求。Ajax技術(shù)是一種非常優(yōu)秀的技術(shù),但應(yīng)該理性對(duì)待,絕不能在整個(gè)應(yīng)用中盲目增加大量的Ajax交互。1.4JDBC的概述JDBC是Sun提供的一套數(shù)據(jù)庫(kù)編程接口API函數(shù),由Java語(yǔ)言編寫的類、界面組成。用JDBC寫的程序能夠自動(dòng)地將SQL語(yǔ)句傳送給相應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng)。不但如此,使用Java編寫的應(yīng)用程序可以在任何支持Java的平臺(tái)上運(yùn)行,不必在不同的平臺(tái)上編寫不同的應(yīng)用。Java和JDBC的結(jié)合可以讓開發(fā)人員在開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí)真正實(shí)現(xiàn)“WriteOnce,RunEverywhere!”1.4.1JDBC驅(qū)動(dòng)程序的類型(1)JDBC-ODBC橋加ODBC驅(qū)動(dòng)程序:JavaSoft橋產(chǎn)品利用ODBC驅(qū)動(dòng)程序提供JDBC訪問(wèn)。注意,必須將ODBC二進(jìn)制代碼加載到使用該驅(qū)動(dòng)程序的每個(gè)客戶機(jī)上。(2)本地API-部份用Java來(lái)編寫的驅(qū)動(dòng)程序:這種類型的驅(qū)動(dòng)程序把客戶機(jī)API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、Informix、DB2或其它DBMS的調(diào)用。注意,象橋驅(qū)動(dòng)程序一樣,這種類型的驅(qū)動(dòng)程序要求將某些二進(jìn)制代碼加載到每臺(tái)客戶機(jī)。(3)JDBC網(wǎng)絡(luò)純Java驅(qū)動(dòng)程序:這種驅(qū)動(dòng)程序?qū)DBC轉(zhuǎn)換為與DBMS無(wú)關(guān)的網(wǎng)絡(luò)協(xié)議,之后這種協(xié)議又被某個(gè)服務(wù)器轉(zhuǎn)換為一種DBMS協(xié)議。這種網(wǎng)絡(luò)服務(wù)器中間件能夠?qū)⑺募僇ava客戶機(jī)連接到多種不同的數(shù)據(jù)庫(kù)上。所用的具體協(xié)議取決于提供者。(4)本地協(xié)議純Java驅(qū)動(dòng)程序:這種類型的驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這將允許從客戶機(jī)機(jī)器上直接調(diào)用DBMS服務(wù)器,是Intranet訪問(wèn)的一個(gè)很實(shí)用的解決方法。1.4.2Connection對(duì)象Connection對(duì)象代表與數(shù)據(jù)庫(kù)的連接。連接過(guò)程包括所執(zhí)行的SQL語(yǔ)句和在該連接上所返回的結(jié)果。一個(gè)應(yīng)用程序可與單個(gè)數(shù)據(jù)庫(kù)有一個(gè)或多個(gè)連接,或者可與許多數(shù)據(jù)庫(kù)有連接。打開連接與數(shù)據(jù)庫(kù)建立連接的標(biāo)準(zhǔn)方法是調(diào)用DriverManager.getConnection方法。該方法接受含有某個(gè)URL的字符串。DriverManager類(即所謂的JDBC管理層)將嘗試找到可與那個(gè)URL所代表的數(shù)據(jù)庫(kù)進(jìn)行連接的驅(qū)動(dòng)程序。DriverManager類存有已注冊(cè)的Driver類的清單。當(dāng)調(diào)用方法getConnection時(shí),它將檢查清單中的每個(gè)驅(qū)動(dòng)程序,直到找到可與URL中指定的數(shù)據(jù)庫(kù)進(jìn)行連接的驅(qū)動(dòng)程序?yàn)橹埂river的方法connect使用這個(gè)URL來(lái)建立實(shí)際的連接。1.4.3Statement對(duì)象Statement對(duì)象用于將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中。實(shí)際上有三種Statement對(duì)象,它們都作為在給定連接上執(zhí)行SQL語(yǔ)句的包容器:Statement、PreparedStatement和CallableStatement。它們都專用于發(fā)送特定類型的SQL語(yǔ)句:Statement對(duì)象用于執(zhí)行不帶參數(shù)的簡(jiǎn)單SQL語(yǔ)句;PreparedStatement對(duì)象用于執(zhí)行帶或不帶IN參數(shù)的預(yù)編譯SQL語(yǔ)句;CallableStatement對(duì)象用于執(zhí)行對(duì)數(shù)據(jù)庫(kù)已存儲(chǔ)過(guò)程的調(diào)用。Statement接口提供了執(zhí)行語(yǔ)句和獲取結(jié)果的基本方法。PreparedStatement接口添加了處理IN參數(shù)的方法;而CallableStatement添加了處理OUT參數(shù)的方法。1.4.4ResultSet對(duì)象ResultSet包含符合SQL語(yǔ)句中條件的所有行,并且它通過(guò)一套get方法(這些get方法可以訪問(wèn)當(dāng)前行中的不同列)提供了對(duì)這些行中數(shù)據(jù)的訪問(wèn)。
第2章聊天室的需求分析2.1需求分析“基于web的聊天室”是一種基于B/S即Browser/Server(瀏覽器/服務(wù)器)的結(jié)構(gòu)模式,它是對(duì)C/S結(jié)構(gòu)的一種變化或者改進(jìn)的結(jié)構(gòu)。在這種結(jié)構(gòu)下,用戶界面完全通過(guò)WWW瀏覽器實(shí)現(xiàn),一部分事務(wù)邏輯在前端實(shí)現(xiàn),但是主要事務(wù)邏輯在服務(wù)器端實(shí)現(xiàn)。B/S結(jié)構(gòu),主要是利用了不斷成熟的WWW瀏覽器技術(shù),結(jié)合瀏覽器的多種Script語(yǔ)言(JavaScript)和Ajax技術(shù),用通用瀏覽器就實(shí)現(xiàn)了原來(lái)需要復(fù)雜專用軟件才能實(shí)現(xiàn)的強(qiáng)大功能,并節(jié)約了開發(fā)成本,是一種全新的軟件系統(tǒng)構(gòu)造技術(shù)。隨著各種操作系統(tǒng)將瀏覽器技術(shù)植入操作系統(tǒng)內(nèi)部,這種結(jié)構(gòu)更成為當(dāng)今應(yīng)用軟件的首選體系結(jié)構(gòu)。顯然B/S結(jié)構(gòu)應(yīng)用程序相對(duì)于傳統(tǒng)的C/S結(jié)構(gòu)應(yīng)用程序?qū)⑹蔷薮蟮倪M(jìn)步。針對(duì)本聊天室所采用的B/S結(jié)構(gòu)模式,給用戶帶來(lái)了很大方便。用戶不再需要像基于C/S模式開發(fā)出的軟件,需要把客戶端程序安裝在本機(jī)上才可以使用。而本聊天室只需要用戶的電腦上安裝有瀏覽器就可以聊天,實(shí)際上每臺(tái)電腦上都有瀏覽器,這樣用戶可以走到哪聊到哪,大大的方便了用戶。2.2總體設(shè)計(jì)思想該聊天室的設(shè)計(jì)主要采用Ajax的設(shè)計(jì)思想,主要是異步通信。就該系統(tǒng)使用的技術(shù)就是IT行業(yè)比較流行的技術(shù),如:Struts,Ajax,Jdbc,Oracle等,這些技術(shù)都是根植于Java的,有很好的平臺(tái)移植性。在這當(dāng)中會(huì)用到一些架構(gòu),比如開源的Struts等,服務(wù)器采用Tomcat5比較好用。當(dāng)然其它技術(shù)也是可以做聊天室的。從管理者考慮,該系統(tǒng)提供聊天室前臺(tái)和后臺(tái),從功能上考慮聊天室必定要有房間,所以聊天室的前臺(tái)要有房間分類和不同分類下的不同房間和用戶注冊(cè)登錄聊天室的功能。在聊天室的主界面上設(shè)置的功能有:公聊和私聊、發(fā)送表情、字體顏色、屏蔽和解蔽講話,在線列表,管理員(踢人)以及返回最近的聊天記錄。在聊天室的后臺(tái),要提供的功能有房間分類的添加與刪除,房間的添加與刪除以及編輯功能,還有對(duì)注冊(cè)用戶的編輯和刪除以及修改權(quán)限的功能。2.3系統(tǒng)功能描述2.3.1前臺(tái)功能(1)房間分類與選擇房間:從聊天室的特點(diǎn)上考慮,聊天室必定有房間,所以設(shè)計(jì)了房間分類,和該分類下的不同房間。(2)注冊(cè)登錄:用戶只有先選擇某一個(gè)房間分類下的一個(gè)房間才可以轉(zhuǎn)到登錄界面,然后登錄進(jìn)行聊天。(3)用戶聊天:用戶可以選擇公聊還是私聊。當(dāng)選擇公聊時(shí),用戶可以直接在輸入框中輸入要說(shuō)話的內(nèi)容,這時(shí)所有的用戶都能看到你的聊天內(nèi)容。當(dāng)選擇私聊時(shí),用戶先選擇要私聊的對(duì)象,然后在選中“悄悄話”這一選項(xiàng)就可以聊天了,聊天內(nèi)容其他人是不會(huì)看到的。用戶還可選擇各種字體顏色以及各種表情。用戶還可以屏蔽某人講話,當(dāng)用戶不想看到某人的講話是可以先選擇該人,然后在點(diǎn)擊“屏蔽”,該人的講話就不再顯示。當(dāng)點(diǎn)擊“解屏”時(shí)該人的講話又可以顯示。用戶還可以查看最近的聊天記錄,為了防止用戶刷屏是不允許用戶發(fā)送同一句話的。如果以管理員身份登錄聊天時(shí),管理員可以把某人請(qǐng)出房間。2.3.2聊天室的后臺(tái)在后臺(tái)只有一個(gè)管理員,對(duì)聊天室和用戶進(jìn)行管理。(1)聊天室的管理:管理員可以添加房間類別和刪除房間類別的名稱,以及添加該房間類別下的房間,房間信息有:房間名稱,房間介紹,房間的最大人數(shù),當(dāng)然還可以修改和刪除房間信息。(2)用戶的管理:管理員還可以對(duì)用戶進(jìn)行修改和刪除,把用戶的權(quán)限修改為管理員時(shí),用戶就變成了管理員可以對(duì)聊天室和用戶進(jìn)行管理。之后登錄聊天室就可以把某人請(qǐng)出房間了。2.4系統(tǒng)的用例圖本系統(tǒng)包括三個(gè)用例:分別是用戶的注冊(cè)與登陸,用戶聊天,后臺(tái)管理。下面這三張圖分別對(duì)應(yīng)這三個(gè)用例的用例圖。選擇房間選擇房間用戶注冊(cè)用戶登錄圖2-1用戶登錄用例圖公聊公聊私聊屏蔽講話查看聊天記錄離開圖2-2用戶聊天的用例圖添加類別添加類別刪除類別查看房間編輯房間添加房間修改擁護(hù)信息圖2-3后臺(tái)管理用例圖2.5性能需求(1)系統(tǒng)要有良好移植性,不受操作系統(tǒng)的限制。(2)系統(tǒng)要有良好的可維護(hù)行,編寫代碼要規(guī)范。(3)系統(tǒng)要有一定的健壯性。(4)系統(tǒng)運(yùn)行必須穩(wěn)定,盡量少占用內(nèi)存資源。(5)運(yùn)行環(huán)境操作系統(tǒng):Windows7操作系統(tǒng),1G內(nèi)存。數(shù)據(jù)庫(kù):Oracle10數(shù)據(jù)庫(kù)。服務(wù)器:Tomcat6.0
第3章聊天室系統(tǒng)詳細(xì)設(shè)計(jì)3.1數(shù)據(jù)庫(kù)設(shè)計(jì)數(shù)據(jù)庫(kù)設(shè)計(jì)就是設(shè)計(jì)程序所需數(shù)據(jù)的類型、格式、長(zhǎng)度和組織方式。因?yàn)閿?shù)據(jù)庫(kù)應(yīng)用系統(tǒng)主要是處理大量的數(shù)據(jù),所以數(shù)據(jù)庫(kù)設(shè)計(jì)的優(yōu)劣,直接影響整個(gè)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)的性能和執(zhí)行速率。根據(jù)本系統(tǒng)的功能需求分析,本系統(tǒng)的數(shù)據(jù)庫(kù)可包括三個(gè)表,分別是房間分類表(classify_info),房間表(room_info),用戶表(user_room).房間分類表:房間分類ID,房間分類名稱兩個(gè)字段。房間信息表:房間ID,房間分類,房間名稱,房間介紹,房間最大人數(shù)五個(gè)字段。用戶表:用戶ID,用戶名,用戶密碼,用戶權(quán)限(1:代表管理員,0:代表用戶)。3.2數(shù)據(jù)庫(kù)的需求分析根據(jù)本聊天室的特點(diǎn),只有房間和用戶關(guān)系,所以設(shè)計(jì)的表不多,只有三張表。NO名稱定義描述位置D1用戶信息表userid+name+pass+type記錄注冊(cè)用戶的基本信息DBD2房間信息表roomid+classify+name+introduction+maxuser記錄房間信息DBD3房間分類表classify+name記錄房間分類名DBD4useridauto_increment唯一標(biāo)識(shí)用戶DBD5Namevarchar(16)用戶名字DBD6Passvarchar(12)用戶密碼DBD7Typeint(2)區(qū)分普通用戶于管理員DBD8roomidauto_increment唯一標(biāo)識(shí)房間DBD9classifyvarchar(20)房間分類名D10Namevarchar(16)房間名字DBD11introductionvarchar(100)房間介紹DBD12maxuserint(3)房間最大人數(shù)DBD13classifyidauto_increment唯一表示房間分類DBD14Namevarchar(12)房間分類名DB表3-1數(shù)據(jù)字典表數(shù)據(jù)項(xiàng)條目(D1—D16)1、用戶表(user_info)位序名稱與標(biāo)識(shí)頻度類型與有效范圍輸入媒體安全性D1編號(hào)(userid)低Int(自動(dòng))系統(tǒng)無(wú)D2名字(name)低Varchar(16)鍵盤無(wú)D3密碼(pass)低Varchar(12)鍵盤無(wú)D4添加時(shí)間(type)低Int(2)鍵盤無(wú)2、房間表(room_info)D7房間編號(hào)(roomid)中Int(自動(dòng))系統(tǒng)無(wú)D8房間分類(classify)中Varchar(16)鍵盤無(wú)D9房間名稱(name)中Varchar(50)鍵盤無(wú)D10房間介紹(introduction)中Varchar(100)鍵盤無(wú)D11房間最大人數(shù)(maxuser)中Int(2)鍵盤無(wú)3、房間分類表(classify_info)D15房間分類編號(hào)(classifyid)低Int(自動(dòng))系統(tǒng)無(wú)D16房間分類名(name)低Char(12)鍵盤無(wú)(1)數(shù)據(jù)庫(kù)輸入項(xiàng)目表表3-2數(shù)據(jù)庫(kù)輸入項(xiàng)目表(2)輸出項(xiàng)目1)聊天室前臺(tái)選擇房間:在聊天界面可以顯示房間名稱游客登錄:在聊天界面可以顯示游客登陸的名稱用戶注冊(cè)登錄:在聊天界面可以顯示用戶登錄的名稱管理員入口:進(jìn)入后臺(tái)的通道 2)聊天室后臺(tái) a.聊天室的管理 添加類別:由管理員添加房間的類別。 刪除類別:由管理員把房間的類別刪除。 添加房間:由管理員添加一些房間的信息。 查看房間:管理員可以對(duì)房間進(jìn)行增刪改查。b.用戶管理 查看會(huì)員:管理員可以對(duì)會(huì)員進(jìn)行編輯和刪除。3.3軟件硬件接口
(1)硬件接口 除服務(wù)器、客戶端硬件設(shè)備的支持外,最重要的是需要連接到互聯(lián)網(wǎng)、局域網(wǎng)等相關(guān)網(wǎng)絡(luò)的支持,此外還要確保機(jī)器的常用端口(如8888)的連通。(2)軟件接口本系統(tǒng)數(shù)據(jù)庫(kù)信息大部分是來(lái)自手動(dòng)輸入。用戶數(shù)據(jù)庫(kù)接口:用于用戶在登錄聊天時(shí)使用;管理員數(shù)據(jù)庫(kù)接口:用于管理房間和用戶使用;3.4系統(tǒng)流程圖系統(tǒng)的流程圖 圖3-1系統(tǒng)流程圖3.5軟接結(jié)構(gòu)(1)聊天室前臺(tái)功能圖 聊天室前聊天室前臺(tái)tai臺(tái)選擇房間用戶注冊(cè)用戶登錄聊天界面圖3-2聊天室前臺(tái)功能圖(2)聊天室后臺(tái)功能圖 聊天室聊天室后臺(tái)選擇房間用戶注冊(cè)用戶登錄聊天界面選擇房間選擇房間選擇房間圖3-3聊天室后臺(tái)功能圖
第4章聊天室系統(tǒng)的實(shí)現(xiàn)4.1房間列表的實(shí)現(xiàn)用戶首先進(jìn)入系統(tǒng),來(lái)到房間列表的頁(yè)面,在這里用戶首先要選擇房間才能進(jìn)入登錄界面。在這個(gè)頁(yè)面上能看到的信息有:房間分類名稱和該房間分類下的所有房間,以及當(dāng)前房間里有多少人。 圖4-1聊天室房間列表圖4.2登錄頁(yè)面的實(shí)現(xiàn)用戶根據(jù)用戶名和密碼進(jìn)行登錄聊天,系統(tǒng)會(huì)判斷用戶名是否正確,若正確則進(jìn)行下一步的操作,否則重新輸。如果用戶沒(méi)有注冊(cè),那么用戶要進(jìn)入注冊(cè)頁(yè)面進(jìn)行注冊(cè)。注冊(cè)時(shí)會(huì)檢查用戶名有沒(méi)有已經(jīng)被使用,如果使用會(huì)提示“用戶名已被注冊(cè)”。密碼不能少于6位,若少于6位會(huì)提示“密碼不能少于6位”.當(dāng)用戶進(jìn)入登錄頁(yè)面時(shí),如果沒(méi)有注冊(cè)過(guò)的用戶,需要進(jìn)行注冊(cè)才能聊天。 圖4-2注冊(cè)頁(yè)面圖用戶注冊(cè)成功時(shí),跳轉(zhuǎn)到顯示成功的頁(yè)面,如下圖: 圖4-3注冊(cè)成功后的跳轉(zhuǎn)頁(yè)面當(dāng)用戶點(diǎn)擊某一個(gè)房間時(shí),會(huì)跳轉(zhuǎn)到登錄頁(yè)面,如果沒(méi)有注冊(cè)返回到圖。4-2進(jìn)行注冊(cè),如果已經(jīng)注冊(cè)過(guò),則可以直接登錄。 圖4-4用戶登錄界面圖4.3chat頁(yè)面的實(shí)現(xiàn) 當(dāng)用戶成功登錄后就可以聊天了,在這里用戶可以進(jìn)行私聊和公聊,發(fā)送表情,查看最近的聊天信息和屏蔽講話等功能。下圖是用戶成功登錄以后進(jìn)入聊天界面的頁(yè)面圖。 圖4-5聊天頁(yè)面圖在下圖中顯示了用戶聊天的的各種功能,包括:公聊、私聊、屏蔽講話、刷屏等功能,當(dāng)某人頻繁操作類似騷擾時(shí)會(huì)提醒不能刷屏,如下圖: 圖4-6防止刷屏頁(yè)面圖 頁(yè)面下方有聊天記錄按鈕,通過(guò)點(diǎn)擊該按鈕可以查看歷史記錄,如下圖: 圖4-7查看聊天記錄頁(yè)面圖4.4管理員登錄界面的實(shí)現(xiàn) 系統(tǒng)首頁(yè)下方有一個(gè)管理入口,是管理員登錄的入口,點(diǎn)擊彈出如下頁(yè)面,管理員以管理員的身份登錄進(jìn)入后臺(tái)對(duì)系統(tǒng)進(jìn)行操作管理,若用戶名或密碼錯(cuò)誤則會(huì)跳轉(zhuǎn)到錯(cuò)誤頁(yè)面,反之登錄到后臺(tái)管理頁(yè)面進(jìn)行操作,登陸界面如下圖: 圖4-8管理員登錄界面4.5后臺(tái)管理也頁(yè)面的實(shí)現(xiàn)管理員成功登錄后就可以對(duì)后臺(tái)進(jìn)行管理了,管理員可以添加房間類別和刪除類別,添加房間信息和修改以及刪除房間信息,也可對(duì)用戶編輯和修改。下圖是管理員成功登錄以后的后臺(tái)頁(yè)面圖。圖4-9后臺(tái)頁(yè)面圖如上圖左邊列表,添加類別是對(duì)聊天室類別類型的添加,添加聊天室是對(duì)房間的添加,管理員添加房間的頁(yè)面如下圖:圖4-10添加房間頁(yè)面圖在后臺(tái)管理頁(yè)面的查看編輯中,可以查詢用戶,并對(duì)用戶的管理權(quán)限進(jìn)行管理,下圖顯示的是管理員查看用戶列表的頁(yè)面:圖4-11用戶列表圖點(diǎn)擊編輯跳出如下頁(yè)面可以修改用戶的權(quán)限,用戶權(quán)限分為普通用戶和管理員兩種,選擇好要賦予該用戶的權(quán)限后,點(diǎn)擊修改,顯示修改成功即權(quán)限完成。圖4-12用戶修改頁(yè)面
第5章測(cè)試與運(yùn)行5.1軟件測(cè)試的目的和原則在開發(fā)大型軟件系統(tǒng)的過(guò)程中,需要面對(duì)錯(cuò)綜復(fù)雜的問(wèn)題,因此,在軟件生存周期的每個(gè)階段都不可避免地會(huì)產(chǎn)生錯(cuò)誤。要力求在每個(gè)階段結(jié)束之前通過(guò)嚴(yán)格的技術(shù)審查,盡可能早的發(fā)現(xiàn)并糾正錯(cuò)誤。測(cè)試的目的就是在軟件投入生產(chǎn)性運(yùn)行之前,盡可能多地發(fā)現(xiàn)軟件中的錯(cuò)誤。目前軟件測(cè)試仍然是保證軟件質(zhì)量的關(guān)鍵步驟,它是對(duì)軟件規(guī)格說(shuō)明、設(shè)計(jì)和編碼的最后復(fù)審。盡管面向?qū)ο蠹夹g(shù)的基本思想保證了軟件應(yīng)該有更高的質(zhì)量,但無(wú)論采用什么樣的編程技術(shù),編程人員的錯(cuò)誤都是不可避免的,而且由于面向?qū)ο蠹夹g(shù)開發(fā)的軟件代碼重用率高,更需要嚴(yán)格測(cè)試,避免錯(cuò)誤的繁衍。因此,軟件測(cè)試在面向?qū)ο缶幊汤锔哂兴闹匾浴Ec開發(fā)過(guò)程類似,測(cè)試過(guò)程也必須分步驟進(jìn)行,每個(gè)步驟在邏輯上是前一個(gè)步驟的繼續(xù)。大型軟件系統(tǒng)通常由若干個(gè)子系統(tǒng)組成,每個(gè)子系統(tǒng)又由許多模塊組成。此大型軟件系統(tǒng)的測(cè)試的基本層次如圖所示。圖5-1測(cè)試的基本層次(1)單元測(cè)試單元測(cè)試的用例從單元詳細(xì)設(shè)計(jì)中導(dǎo)出。在單元測(cè)試中可以采用功能性測(cè)試和結(jié)構(gòu)性測(cè)試兩種。(2)集成測(cè)試在這個(gè)測(cè)試步驟中所發(fā)現(xiàn)的往往是概要設(shè)計(jì)的錯(cuò)誤。(3)系統(tǒng)測(cè)試在這個(gè)測(cè)試步驟中所發(fā)現(xiàn)的往往是需求規(guī)格說(shuō)明的錯(cuò)誤。一般來(lái)說(shuō),系統(tǒng)測(cè)試是功能性測(cè)試,不是結(jié)構(gòu)性測(cè)試。(4)白盒測(cè)試在知道程序代碼的情況下進(jìn)行,主要是測(cè)試代碼邏輯(5)黑盒測(cè)試在不關(guān)心代碼的情況下進(jìn)行,主要是測(cè)試系統(tǒng)功能。5.1.1測(cè)試環(huán)境(1)硬件條件:PC機(jī)(2)運(yùn)行環(huán)境:Windows7、Tomcat6.0、Oracle10、MozillaFirewox(3)開發(fā)軟件:JSP+Struts+Ajax+JDBC+oracle5.1.2測(cè)試結(jié)果(1)聊天室前臺(tái)測(cè)試 表5-1功能測(cè)試表1功能預(yù)定功能實(shí)際功能達(dá)到目標(biāo)用戶注冊(cè),登錄提供用戶注冊(cè),登錄聊天室的功能能夠登錄,能注冊(cè)達(dá)到驗(yàn)證用戶名和密碼提供驗(yàn)證用戶名和密碼能夠驗(yàn)證用戶名和密碼達(dá)到登陸后顯示提示用戶登陸后在提示用戶登錄用戶登陸后在提示用戶登錄達(dá)到用戶退出用戶離開時(shí)通知給所有用戶用戶離開時(shí)通知給所有用戶達(dá)到向全體用戶發(fā)送消息能夠把聊天信息發(fā)送給所有用戶能夠把聊天信息發(fā)送給所有用戶達(dá)到向指定用戶發(fā)送消息能夠把聊天信息向所指定的用戶發(fā)送能夠把聊天信息向所指定的用戶發(fā)送達(dá)到返回聊天記錄能夠?qū)崿F(xiàn)返回最近的聊天記錄能夠?qū)崿F(xiàn)返回最近的聊天記錄達(dá)到清除聊天內(nèi)容能夠報(bào)當(dāng)前的聊天內(nèi)容清除能夠報(bào)當(dāng)前的聊天內(nèi)容清除達(dá)到屏蔽/解蔽能夠屏蔽/解蔽講話能夠屏蔽/解蔽講話達(dá)到清空屏蔽能夠把所有的屏蔽清空能夠把所有的屏蔽清空達(dá)到字體顏色能夠更改字體顏色能夠更改字體顏色達(dá)到表情能夠發(fā)送表情能夠發(fā)送表情達(dá)到在線列表能夠顯示在線人員能夠顯示在線人員達(dá)到踢人管理員能夠踢人管理員能夠踢人達(dá)到(2)聊天室后臺(tái)功能測(cè)試表5-2功能測(cè)試表2功能預(yù)定效果實(shí)際效果添加房間分類添加成功后能夠在前臺(tái)顯示添加成功后能夠在前臺(tái)顯示刪除房間類別能夠刪除已經(jīng)存在的房間類別能夠刪除已經(jīng)存在的房間類別添加房間信息添加成功后能夠在前臺(tái)顯示添加成功后能夠在前臺(tái)顯示編輯房間信息能夠修改、刪除房間信息并在前臺(tái)顯示能夠修改、刪除房間信息并在前臺(tái)顯示編輯用戶信息能夠修改、刪除用戶信息能夠修改、刪除用戶信息修改權(quán)限能夠修改用戶權(quán)限修改權(quán)限5.2軟件的運(yùn)行與安裝5.2.1應(yīng)用程序的構(gòu)建、部署在J2EE框架下,有很多的應(yīng)用服務(wù)器可以使用,比如:BEA的WebLogic、IBM的WebSphere和源代碼開放組織的JBoss、Tomcat應(yīng)用服務(wù)器。而一些小型的,數(shù)據(jù)量不大的軟件可以部署在開源的Tomcat服務(wù)器上,那些大型的,分布式的應(yīng)用才部署到WebLogic,WebSphare等服務(wù)器上。由于本軟件的業(yè)務(wù)邏輯不是復(fù)雜,所以把該系統(tǒng)部署到了Tomcat服務(wù)器上了。5.2.2系統(tǒng)運(yùn)行過(guò)程啟動(dòng)Tomcat6應(yīng)用服務(wù)器后,在URL地址中輸入http://localhost:8888/Chatroom__ldd/,即可運(yùn)行此系統(tǒng)。5.3運(yùn)行和維護(hù)經(jīng)過(guò)綜合的測(cè)試后,本系統(tǒng)就可以運(yùn)行了,經(jīng)過(guò)運(yùn)行測(cè)試本系統(tǒng)運(yùn)行狀態(tài)良好。軟件維護(hù)是軟件生命周期的最后一個(gè)階段,它處于系統(tǒng)投入生產(chǎn)性運(yùn)行以后的時(shí)期中,因此不屬于系統(tǒng)開發(fā)過(guò)程。所謂軟件維護(hù)就是在軟件交付使用之后,為了改正錯(cuò)誤或滿足新的需要而修改軟件的過(guò)程??梢酝ㄟ^(guò)描述軟件交付使用后可能進(jìn)行的四項(xiàng)活動(dòng),具體定義軟件維護(hù)。(1)改正性維護(hù)因?yàn)檐浖y(cè)試不可能暴露出一個(gè)大型軟件系統(tǒng)的所有潛在錯(cuò)誤,所以必然會(huì)有第一項(xiàng)維護(hù)活動(dòng):在任何軟件的使用期間,用戶必然發(fā)現(xiàn)程序,并且把他們遇到的問(wèn)題報(bào)告給維護(hù)人員。把診斷和改正錯(cuò)誤的過(guò)程稱為改正性維護(hù)。(2)適應(yīng)性維護(hù)計(jì)算機(jī)科學(xué)技術(shù)的各個(gè)方面都在迅速進(jìn)步,大約每36個(gè)月就有新一代的硬件出現(xiàn),因此,適應(yīng)性維護(hù),也就是為了和變化的環(huán)境適當(dāng)?shù)呐浜隙M(jìn)行的修改軟件的活動(dòng),是既必要又經(jīng)常的維護(hù)活動(dòng)。(3)完善性維護(hù)當(dāng)一個(gè)軟件系統(tǒng)順利的進(jìn)行時(shí),在使用軟件的過(guò)程中用戶往往提出增加新功能或修改已有功能的建議,還可能提出一般性修改意見。為了滿足這類要求,需要進(jìn)行完善性維護(hù)。這項(xiàng)維護(hù)活動(dòng)通常占軟件維護(hù)的大部分工作。(4)預(yù)防性維護(hù)為了改進(jìn)未來(lái)可維護(hù)性或可靠性,或?yàn)榱私o未來(lái)的改進(jìn)奠定更好的基礎(chǔ)而修改軟件時(shí)出現(xiàn)的維護(hù)活動(dòng),把它稱為預(yù)防性維護(hù)。上述四類軟件維護(hù)活動(dòng)都必須應(yīng)用于整個(gè)軟件配置,維護(hù)軟件文檔和維護(hù)軟件的可執(zhí)行代碼是同樣重要的。
結(jié)論本系統(tǒng)實(shí)現(xiàn)了對(duì)用戶的管理,包括:用戶登錄,用戶注冊(cè),以及后臺(tái)的用戶管理。房間的管理,包括房間信息的曾刪改查。用戶聊天,包括:用戶可以選擇公聊和私聊,發(fā)送表情,屏蔽講話,返回最近的聊天記錄等功能。聊天室系統(tǒng)的優(yōu)點(diǎn)就是方便快捷和即時(shí)通訊。本系統(tǒng)具有如下特點(diǎn):(1)采用Browser/Server三層體系結(jié)構(gòu),使系統(tǒng)具有很好的可維護(hù)性和可重用性。(2)在本系統(tǒng)的開發(fā)過(guò)程中采用的是JSP+Struts+Ajax+Jdbc模式,此模式將明顯的把顯示和邏輯分離,使代碼容易管理,適合于大型項(xiàng)目的開發(fā)。(3)中間層使用JDBC來(lái)連接數(shù)據(jù)庫(kù),JDBC對(duì)于大批量的數(shù)據(jù)有很快的處理速度,和數(shù)據(jù)庫(kù)服務(wù)器交互的效率會(huì)更高。(4)后臺(tái)數(shù)據(jù)庫(kù)采用的Oracle,它功能比較強(qiáng)大,除了可以處理包含在各種平臺(tái)上運(yùn)行的數(shù)據(jù)庫(kù)管理系統(tǒng)內(nèi)核之外,還包括了數(shù)據(jù)復(fù)制、數(shù)據(jù)庫(kù)系統(tǒng)管理、Internet網(wǎng)關(guān)支持、在線分析處理、多媒體支持和各種并行處理能力。聊天室系統(tǒng)實(shí)現(xiàn)了簡(jiǎn)單的實(shí)時(shí)聊天功能,經(jīng)過(guò)細(xì)心的調(diào)試和排錯(cuò)解決了絕大部分的問(wèn)題。但幾乎每一個(gè)計(jì)算機(jī)程序都會(huì)有這樣那樣的不足,尤其是未經(jīng)過(guò)精心維護(hù)的非商業(yè)軟件。本聊天室系統(tǒng)對(duì)于初涉此領(lǐng)域的畢業(yè)設(shè)計(jì)課題來(lái)說(shuō),尤其在開始初期,感覺邏輯復(fù)雜,難以控制,因此至今還有許多未能解決的缺陷,如:(1)由于MozillaFirefox瀏覽器是單線程的,所以在該瀏覽器上進(jìn)行測(cè)試回出現(xiàn)問(wèn)題;(2)沒(méi)有詳細(xì)考慮聊天室管理功能。本系統(tǒng)會(huì)進(jìn)一步完善上述的不足,使之成為一套深受歡迎的聊天系統(tǒng)。
參考文獻(xiàn)[1]張海蕃.軟件工程導(dǎo)論.北京:清華大學(xué)出版社.2005:160-171[2]孫衛(wèi)琴.精通struts:基于MVC的Javaweb設(shè)計(jì)與開發(fā).北京.電子工業(yè)出版社.2004:71-204[3]劉斌.精通JavaWeb整合開發(fā).北京.電子工業(yè)出版社.2007:229-287[4]RyanAsleson.金靈譯.Ajax基礎(chǔ)教程.北京.人民郵電出版社.2006:23-149[5]ToddCook.JSP從入門到精通.北京.電子工業(yè)出版社,2003:1-385.[6]曾春平,王超,張鵬XML編程從入門到精通.北京.希望電子出版社.2002[7]伍俊良.J2EE課程設(shè)計(jì)與系統(tǒng)開發(fā)案例.北京.清華大學(xué)出版社.2004:36-41[8]何鵬飛.J2EE程序設(shè)計(jì)教程.北京.清華大學(xué)出版社.2003:92-97[9]賈燕楓,張桂元.Struts開發(fā)入門與項(xiàng)目實(shí)踐.北京.人民郵電出版社.2006:8-9[10]孫衛(wèi)琴.Java面向?qū)ο缶幊?北京.電子工業(yè)出版社.2006:46-58[11]邱哲等.STRUTSWeb設(shè)計(jì)與開發(fā)大全.北京.清華大學(xué)出版社[12]姚淑珍,李虎.UML和模式應(yīng)用-面向?qū)ο蠓治雠c設(shè)計(jì)導(dǎo)論.北京.機(jī)械工業(yè)出版社.2002[13]PhilipMcCarthy.AjaxforJavadevelopers:JavaobjectserializationforAjax./developerworks/xml/library.04Oct2005。[14]BrettMcLaughlin.MasteringAjax,Part1:IntroductiontoAjax./developerworks/xml/library.06Dec2005[15]BrettMcLaughlin.MasteringAjax,Part2:MakeasynchronousrequestswithJavaScriptandAjax./developerworks/xml/library.06Dec2005[16]BrettMcLaughlin.MasteringAjax,Part3:AdvancedrequestsandresponsesinAjax./developerworks/xml/library.14Feb2006[17]閻宏.Java與模式.電子工業(yè)出版社.2002[18]柳永坡.Jsp應(yīng)用開發(fā).人民郵電出版設(shè).2005
致謝緊張而忙碌的畢業(yè)設(shè)計(jì)就要結(jié)束了,在完成了系統(tǒng)的功能設(shè)計(jì)后,我感到由衷的喜悅和自豪。在我做畢業(yè)設(shè)計(jì)期間,許多老師,同學(xué)和朋友給了我無(wú)私的關(guān)懷和幫助,在此,我要向他們表示衷心的感謝。首先要感謝我的指導(dǎo)老師甄磊老師。在整個(gè)課題的設(shè)計(jì)過(guò)程中,甄磊老師對(duì)我熱心指導(dǎo)、嚴(yán)格要求,在課題的各方面都給予了我寶貴的意見和建議,幫助我建立正確的設(shè)計(jì)思想,保證了課題的研究和開發(fā)工作的順利完成。同時(shí)還要感謝培育我四年的太原科技大學(xué)以及杰普培訓(xùn)機(jī)構(gòu),感謝各位老師對(duì)我的栽培。學(xué)校給我提供了很好的學(xué)習(xí)和生活環(huán)境,讓我在這四年里學(xué)習(xí)到了很多計(jì)算機(jī)方面的相關(guān)知識(shí),在這里我非常感謝我的母校。當(dāng)然,完成這次的設(shè)計(jì)工作也得到學(xué)多同學(xué)的幫助。最后,請(qǐng)?jiān)试S我再一次向在畢業(yè)設(shè)計(jì)過(guò)程中無(wú)私幫助過(guò)我的老師,同學(xué),在這里我對(duì)他們表示最衷心的感謝。
附錄IAjaxforJavadevelopers:JavaobjectserializationforAjaxPhilipMcCarthy04Oct2005Ifyou'redoingJava?WebdevelopmentusingAsynchronousJavaScriptandXML(Ajax),thendeliveringdatafromtheservertotheclientisprobablyyourtopconcern.InthissecondarticleintheAjaxforJavadevelopersseries,PhilipMcCarthywalksyouthroughfiveapproachestoJavaobjectserializationandgivesyoualltheinformationyouneedtochoosethedataformatandtechnologybestsuitedtoyourapplication.Inthefirstarticleinthisseries,IintroducedyoutothebuildingblocksofAjax:HowtouseaJavaScriptXMLHttpRequestobjecttosendanasynchronousrequesttoaserverfromaWebpageHowtohandleandrespondtothatrequestwithaJavaservletreturninganXMLdocumenttotheclientHowtousethatresponsedocumentontheclienttoupdateyourpageviewThistime,I'llcontinuediscussingthedevelopmentfundamentalsofAjax,butI'mfocusingonwhatmattersmostformanyJavaWebdevelopers:producingdatafortheclient.MostJavadevelopershaveappliedtheModel-View-Controller(MVC)patterntotheirWebapplications.InatraditionalWebapplication,theviewcomponentiscomposedofJSPs,orperhapsanotherpresentationtechnologysuchasVelocitytemplates.ThesepresentationcomponentsupdatetheuserinterfacebydynamicallyproducingawholenewpageofHTMLtoreplacewhattheuserwaspreviouslylookingat.InthecaseofaJavaWebapplicationwithanAjaxUI,however,theJavaScriptclientcodehasultimateresponsibilityforupdatingwhattheusersees,basedondatareceivedinresponsetoanXMLHttpRequest.Fromtheperspectiveoftheserver,theviewbecomesthedatarepresentationitsendsinresponsetoclientrequests.ProducingXMLfromJavaclassesThereareplentyofreasonstodeliverAjaxresponsesasXML:everyAjax-capablebrowserhasmethodsfornavigatingXMLdocuments,andtherearemanyserver-sidetechnologiesforworkingwithXMLdata.It'seasytodefinethecontractbetweenyourAjaxclientandserverbyproducingaschematodescribethetypesofdocumentsthatwillbeexchanged,andifyoutakeaservice-orientedapproachtoyourserver-sidearchitecture,usingXMLallowsnon-Ajaxclientstoconsumeyourdatafeedsaswell.I'llconsiderthreeofthewaysyoucanproduceXMLdatafromyourJavaobjectsanddiscusstheprosandconsofeach.Roll-your-ownserializationFirstofall,youcouldgenerateXMLprogramaticallyfromyourobjectgraph.ThisapproachcanbeassimpleasimplementingatoXml()methodineachofyourJavaBeanclasses.YouwouldthenpickasuitableXMLAPIandhaveeachbeanemitelementstorepresentitsstateandrecursivelycalldowntheobjectgraphtoitsmembers.Clearly,thisapproachdoesn'tscalewelltoalargenumberofclassesbecauseeachoneneedstohaveitsownXML-generatingcodespeciallywritten.Ontheupside,it'sasimpleapproachtoimplement,there'snooverheadintermsofextraconfigurationoramore-complexbuildprocess,andanygraphcomposedofyourJavaBeanscanbeturnedintoanXMLdocumentwithacoupleofcalls.XMLbindingframeworksInrecentyears,severalJavaAPIshavebeendevelopedtosimplifytheprocessofbindingXMLdocumentstoJavaobjectgraphrepresentations.MostprovidebothXMLmarshalingandunmarshaling;thatis,theyperformtwo-wayconversionsbetweenJavaobjectgraphsandXML.TheseframeworksencapsulatealltheworkofhandlingXML,meaningthatapplicationcodeonlyhastodealwithplainJavaobjects.Theytendtoprovideusefulancillaryfunctionsaswell,suchasdocumentvalidation.Broadly,theseframeworkstaketwodifferentapproaches:codegenerationandobject-to-XMLmapping.I'llexplainboth.Thecode-generationapproachBindingframeworksthatemploycodegenerationincludeXMLBeans,JAXB,Zeus,andJBind.Castorcanalsoemploythistechnique.ThestartingpointforanyoftheseframeworksisanXMLschemathatdescribesthedatatypesofyourdocuments.Usingtoolsprovidedbytheframework,youthengenerateJavaclassesthatrepresenttheseschema-definedtypes.Finally,youwriteyourapplicationusingthesegeneratedclassestorepresentyourmodeldataandserializethemtoXMLthroughsomeconvenientmechanismprovidedbytheframework.ThecodegenerationapproachisagoodoneifyourapplicationemploysalargeXMLgrammar.ThescalingproblemofwritingcustomXML-serializationmethodsacrosstensofclassesvanishes.Ontheotherhand,younolongergettodefineyourownJavaBeans.Theframework-generatedJavaclassestypicallyfollowtheXML'sstructuresveryclosely,whichcanresultinthembeingratherunwieldytocodeagainst.Also,thegeneratedclassesbecomedumbdatacontainersbecauseyoucan'tgenerallyaddbehaviortothem.Broadlyspeaking,youneedtomakecompromisesinyourapplicationcodetoplaynicelywiththeschema-generatedtypes.Anotherpitfallisthatachangeintheschemacauseschangestothegeneratedclasses,whichinturnhasaknock-oneffecttoanycodeyou'vewrittenaroundthem.XMLbindingframeworksofthistypearemostusefulindataunmarshaling(i.e.,consumingXMLdocumentsandconvertingthemintoJavaobjects).Unlessyouhaveahugedatamodelandwouldbenefitfromhavingclassesgeneratedforyou,code-generation-basedframeworksareprobablyoverkillforanAjaxapplication.ThemappingapproachFrameworksthatemploymappingincludeCastorandApacheCommonsBetwixt.Mappingisgenerallyamoreflexibleandlightweightsolutionthancodegeneration.First,youcodeyourJavaBeansasyouusuallywould,includinganybehaviorandwhateverconveniencemethodsyoulike.Then,atruntime,youcallontheframework'sintrospection-basedmarshaler,anditproducesanXMLdocumentbasedonthetypes,names,andvaluesofyourobjects'members.Bydefiningmappingfilesforyourclasses,youcanoverridethedefaultbindingstrategyandadvisethemarshalerhowyou'dlikeyourclassestoberepresentedinXML.Thisapproachisagoodcompromisebetweenscalabilityandflexibility.YougettowriteyourJavaclassesthewayyoulikethem,andthemarshalersavesyoufromdealingwithXML.However,althoughthemappingdefinitionfilesaresimpletowriteandscalereasonablywell,themappingrulescanonlychangethestandardbindingbehaviorsomuch,andsomedegreeofcouplingbetweenthestructureofyourobjectsandtheirXMLrepresentationwillalwaysremain.Ultimately,youmayhavetocompromiseeitheryourJavarepresentationsoryourXMLformatforthemappingapproachtowork.DatabindingsummaryDennisSosnoskihaswrittenindepthonthesubjectofXMLdatabindingAPIsofboththecode-generationandcode-mappingflavors.I'drecommendhisexcellentarticlesonCastorandonthecode-generationframeworksifyouwanttoinvestigatethisareafurtherOnthewhole,thecode-generationapproachtradesofftoomuchflexibilityandconveniencetobeusefulforthetypicalAjaxapplication.Ontheotherhand,themapping-basedframeworksmayserveyouwell,aslongasyoucantailortheirmappingstrategiesenoughtoproducetheXMLyouwantfromyourobjects.AlloftheXMLbindingAPIsshareamajordrawbackwiththemanualserializationtechnique:thecouplingofmodelandview.BeinglimitedtoasingleXMLrepresentationofeachobjecttypemeansitislikelythattherewillalwaysbesomeredundantdatatravelingacrossthenetwork.Amoreseriousproblemisthattheclientcodecannotobtainaspecializedviewwhenthesituationdemandsitandmayhaveanawkwardtimetryingtodealwiththecompromisedone-size-fits-allviewofagivenobjectgraph.IntraditionalWebapplicationdevelopment,pagetemplatingsystemsareusedtocleanlyseparateviewgenerationfromcontrollerlogicandmodeldata.It'sanapproachthatcanhelpinanAjaxscenarioaswell.
面向Java開發(fā)人員的Ajax:Ajax的Java對(duì)象序列化PhilipMcCarthy2005年10月24日如果您正在使用異步JavaScript和XML(Ajax)進(jìn)行Java?Web開發(fā),那么您最關(guān)心的問(wèn)題可能就是把數(shù)據(jù)從服務(wù)器傳遞給客戶機(jī)。在面向Java開發(fā)人員的Ajax系列的第二篇文章中,PhilipMcCarthy介紹了Java對(duì)象序列化的五種方式,并提供了選擇最適合應(yīng)用程序的數(shù)據(jù)格式和技術(shù)所需要的全部信息。在這個(gè)系列的第一篇文章中,我介紹了Ajax的構(gòu)造塊: (1)如何用JavaScriptXMLHttpRequest對(duì)象從Web頁(yè)面向服務(wù)器發(fā)送異步請(qǐng)求。 (2)如何用Javaservlet處理和響應(yīng)請(qǐng)求(向客戶機(jī)返回XML文檔)。 (3)如何在客戶端用響應(yīng)文檔更新頁(yè)面視圖。這一次,我將繼續(xù)討論Ajax開發(fā)的基礎(chǔ)知識(shí),但是將側(cè)重于許多JavaWeb開發(fā)人員最關(guān)心的問(wèn)題:為客戶機(jī)生成數(shù)據(jù)。多數(shù)Java開發(fā)人員已經(jīng)把模型-視圖-控制器(MVC)模式應(yīng)用在他們的Web應(yīng)用程序上。在傳統(tǒng)的Web應(yīng)用程序中,視圖組件由JSP或者其他表示技術(shù)(例如Velocity模板)構(gòu)成。這些表示組件動(dòng)態(tài)地生成全新的HTML頁(yè)面,替代用戶以前正在查看的頁(yè)面,從而更新用戶界面。但是,在JavaWeb應(yīng)用程序使用AjaxUI的情況下,基于從XMLHttpRequest的響應(yīng)接收到的數(shù)據(jù),JavaScript客戶端代碼對(duì)于更新用戶看到的內(nèi)容負(fù)有最終責(zé)任。從服務(wù)器的角度來(lái)看,視圖成為它響應(yīng)客戶機(jī)請(qǐng)求而發(fā)送的數(shù)據(jù)表示。從Java類產(chǎn)生XML把Ajax響應(yīng)作為XML來(lái)傳遞有許多原因:每個(gè)支持Ajax的瀏覽器都有導(dǎo)航XML文檔的方法,也有許多服務(wù)器端技術(shù)可以處理XML數(shù)據(jù)。通過(guò)制定一個(gè)方案,描述要交換的文檔類型,在Ajax客戶端和服務(wù)器端之間很容易定義合約,而且如果服務(wù)器端架構(gòu)采用面向服務(wù)的方式,那么使用XML也可以允許非Ajax客戶機(jī)使用您提供的數(shù)據(jù)。自行進(jìn)行序列化首先,可以從對(duì)象圖以編程的方式生成XML。這種方式可以簡(jiǎn)單到只是在每個(gè)JavaBean類中實(shí)現(xiàn)toXml()方法即可。然后就可以選擇合適的XMLAPI,讓每個(gè)bean提供表示自己狀態(tài)的元素,并遞歸地對(duì)自己的成員調(diào)用對(duì)象圖。顯然,這種方式無(wú)法擴(kuò)展到大量的類,因?yàn)槊總€(gè)類都需要專門編寫自己的XML生成代碼。從好的方面來(lái)看,這是一個(gè)實(shí)現(xiàn)起來(lái)簡(jiǎn)單的方式,沒(méi)有額外的配置支出或者更復(fù)雜的構(gòu)建過(guò)程支出,任何JavaBean圖都可以只用幾個(gè)調(diào)用就變成XML文檔。XML綁定框架近些年來(lái),已經(jīng)開發(fā)了多個(gè)JavaAPI來(lái)簡(jiǎn)化XML文檔到Java對(duì)象圖的綁定過(guò)程。多數(shù)都提供了XML編排和拆解;也就是說(shuō),它們可以在Java對(duì)象圖和XML之間執(zhí)行雙向會(huì)話。這些框架封裝了XML處理的全部工作,這意味著應(yīng)用程序代碼只需要處理普通的Java類。它們還希望提供有用的輔助功能,例如文檔驗(yàn)證?;\統(tǒng)來(lái)說(shuō),這些框架采用了兩種不同的方式:代碼生成和對(duì)象到XML映射。我將分別解釋這兩種方式。代碼生成方式使用代碼生成的框架包括XMLBeans、JAXB、Zeus和JBind。Castor也能使用這項(xiàng)技術(shù)。這類框架的起點(diǎn)是描述文檔數(shù)據(jù)類型的XML方案。使用框架提供的工具,就可以生成代表這些方案定義類型的Java類。最后,用這些生成的類編寫應(yīng)用程序,表示自己的模型數(shù)據(jù),并通過(guò)框架提供的一些輔助機(jī)制把數(shù)據(jù)序列化成XML。如果應(yīng)用程序要使用大型XML語(yǔ)法,那么代碼生成方式是個(gè)很好的方法。在數(shù)十個(gè)類上編寫定制XML序列化代碼的可伸縮性問(wèn)題由此消除。另一方面,也不再需要定義自己的JavaBean??蚣苌傻腏ava類通常非常符合XML的結(jié)構(gòu),所以對(duì)它們進(jìn)行編碼很難。而且,生成的類變成啞數(shù)據(jù)容器,因?yàn)橐话悴荒芟蛩鼈兲砑有袨?。一般?lái)說(shuō),在應(yīng)用程序代碼中要做些妥協(xié),才能很好地處理方案生成的類型。另一個(gè)缺陷是如果修改方案,會(huì)造成生成的類也要修改,所以也就會(huì)對(duì)圍繞它們編寫的代碼帶來(lái)相應(yīng)的影響。這種類型的XML綁定框架在數(shù)據(jù)拆解時(shí)最有用(例如,使用XML文檔并把它們轉(zhuǎn)化成Java對(duì)象)。除非擁有大型數(shù)據(jù)模型而且有可能從生成的類中獲益,否則基于代碼生成的框架對(duì)于Ajax應(yīng)用程序來(lái)說(shuō)可能有很大的殺傷力。映射方式采用映射方式的框架包括Castor和ApacheCommonsBetwixt。映射通常是比代碼生成更靈活和更輕量的解決方案。首先,可以像通常一樣編寫JavaBean,包括任何行為以及任何自己喜歡的方便的方法。然后,在運(yùn)行時(shí),調(diào)用框架中基于內(nèi)省的編排器,并根據(jù)對(duì)象成員的類型、名稱和值生成XML文檔。通過(guò)定義類的映射文件,可以覆蓋默認(rèn)的綁定策略,并就類在XML中的表示方式對(duì)編排器提出建議。這種方法是在可伸縮性與靈活性之間的良好折中??梢园凑兆约合矚g的方式編寫Java類,編排器負(fù)責(zé)處理XML。雖然映射定義文件編寫起來(lái)簡(jiǎn)單,可伸縮性也足夠好,但是映射規(guī)則最多只能改變標(biāo)準(zhǔn)的綁定行為,而且在對(duì)象結(jié)構(gòu)和它們的XML表示之間總要?dú)埩粢恍詈?。最終,可能不得不在Java表示或XML格式之間任選一個(gè)做些折中,才能讓映射方法起作用。數(shù)據(jù)綁定總結(jié)DennisSosnoski就XML數(shù)據(jù)綁定API的主題,在代碼生成和代碼映射兩個(gè)方面寫了深入的文章。如果想進(jìn)一步研究這個(gè)領(lǐng)域,我推薦他在Castor和代碼生成框架方面的精彩文章。總之,代碼生成方式損失了過(guò)多的靈活性和方便性,對(duì)于典型的Ajax應(yīng)用程序用處不大。另一方面,基于映射的框架可能工作得很好,但是要恰到好處地調(diào)整它們的映射策略,以便從對(duì)象生成需要的XML。所有的XML綁定API都具有手工序列化技術(shù)的一個(gè)主要不足:模型和視圖的耦合。被限制為一個(gè)類型一個(gè)XML表示,就意味著在網(wǎng)絡(luò)上總要有冗余數(shù)據(jù)傳輸。更嚴(yán)重的問(wèn)題是,在情況要求客戶端代碼使用專門視圖時(shí),客戶端代碼卻無(wú)法得到它,所以可能要費(fèi)力地處理給定對(duì)象圖的一成不變的視圖。在傳統(tǒng)的Web應(yīng)用程序開發(fā)中,采用頁(yè)面模板系統(tǒng)把視圖生成與控制器邏輯和模型數(shù)據(jù)干凈地分離。這種方法在Ajax場(chǎng)景中也會(huì)有幫助。PAGE43-
附錄II(1)web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appversion="2.5"xmlns="/xml/ns/javaee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <context-param> <param-name>configFile</param-name> <param-value>WEB-INF/InitChatroom.xml</param-value> </context-param> <listener> <listener-class>com.kzf.struts.listener.InitChatroom</listener-class> </listener> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <jsp-config> <taglib> <taglib-uri>/adminTag</taglib-uri> <taglib-location>/WEB-INF/AdminTag.tld</taglib-location> </taglib> <taglib> <taglib-uri>/userTag</taglib-uri> <taglib-location>/WEB-INF/UserTag.tld</taglib-location> </taglib> </jsp-config> <session-config> <session-timeout>3</session-timeout> </session-config> <filter> <filter-name>SetCharacterEncoding</filter-name> <filter-class>com.kz
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 瀝青路面白改黑施工方案
- 日海智能:擬質(zhì)押日海通服服務(wù)有限公司股權(quán)涉及其股東全部權(quán)益價(jià)值項(xiàng)目資產(chǎn)評(píng)估報(bào)告
- 電動(dòng)門干掛石材施工方案
- 巴中地下室防潮層施工方案
- 寧鄉(xiāng)鋼筋套筒施工方案
- 2025年安徽省阜陽(yáng)市阜陽(yáng)市重點(diǎn)中學(xué)中考一模歷史試題(原卷版+解析版)
- 【專精特新】激光雷達(dá)企業(yè)專精特新“小巨人”成長(zhǎng)之路(智研咨詢)
- 高中語(yǔ)文學(xué)術(shù)性論著閱讀“四維三層”教學(xué)設(shè)計(jì)體系探究
- 中外美術(shù)32講知到課后答案智慧樹章節(jié)測(cè)試答案2025年春西安工業(yè)大學(xué)
- 三級(jí)人力資源管理師-《企業(yè)人力資源管理師(理論知識(shí))》考前強(qiáng)化模擬卷8
- 《S中學(xué)宿舍樓工程量清單計(jì)價(jià)編制(附三維圖)》30000字
- 全國(guó)運(yùn)動(dòng)員注冊(cè)協(xié)議書范本(2篇)
- 2024年03月浙江南潯銀行春季招考筆試歷年參考題庫(kù)附帶答案詳解
- 執(zhí)行立案申請(qǐng)書模版
- 《高點(diǎn)全景視頻監(jiān)控聯(lián)網(wǎng)技術(shù)要求》
- 智能建筑外掛電梯安裝方案
- 2024屆廣東省廣州市高三一??荚囉⒄Z(yǔ)試題講評(píng)課件
- 數(shù)字電子技術(shù)(廣東工業(yè)大學(xué))知到智慧樹章節(jié)測(cè)試課后答案2024年秋廣東工業(yè)大學(xué)
- 安徽省淮北一中2025屆高三沖刺模擬數(shù)學(xué)試卷含解析
- 白云山生態(tài)停車場(chǎng)工程施工組織設(shè)計(jì)施工方案
- 2022年CSCO軟組織肉瘤診療指南
評(píng)論
0/150
提交評(píng)論