已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第7章Struts2綜合應(yīng)用實例,7.1建立項目,7.2運行主界面的實現(xiàn),7.3實現(xiàn)“登錄”功能,7.4實現(xiàn)“借書”功能,7.5實現(xiàn)“圖書管理”功能,第7章Struts2綜合應(yīng)用實例,這里只介紹圖書管理系統(tǒng)的兩個功能:讀者借書和圖書管理,它已經(jīng)包含了操作數(shù)據(jù)庫的主要內(nèi)容,其他功能讀者可以根據(jù)所學(xué)知識自行完成。本系統(tǒng)運行時的初始主界面如圖7.1所示。,圖7.1運行主界面,第7章Struts2綜合應(yīng)用實例,在沒“登錄”之前,操作功能的圖片是灰色的,不能被單擊。而當(dāng)?shù)卿洺晒?,操作功能的圖片就亮起來,登錄的輸入框及“登錄”按鈕被置灰,表示不可再進行“登錄”操作。登錄有兩種角色,使用“管理員”登錄名登錄,操作功能所有圖片都會亮,表示所有操作都可以進行,如圖7.2所示。,圖7.2管理員身份登錄后的界面,第7章Struts2綜合應(yīng)用實例,如果是“學(xué)生”登錄,登錄成功后,前面兩個圖片會亮,表示可以進行操作,后面的圖片還是灰色的,表示不能操作,如圖7.3所示。,圖7.3學(xué)生身份登錄后的界面,7.1建立項目,首先,在MyEclipse中建立項目Struts2_Example,加載Struts2所需的5個類庫、SQLServer所需的類庫及文件上傳所需的兩個類庫(這兩個類庫在Struts2的文件上傳部分已經(jīng)講解)。然后修改web.xml文件,在第一個Struts2的例子中已經(jīng)給出,不再贅述。接著在src下創(chuàng)建Struts2的核心配置文件struts.xml,并編寫其框架代碼:./此處以后添加action配置,7.2運行主界面的實現(xiàn),上面已經(jīng)展示了初始系統(tǒng)的主頁面,文件名為index.jsp,要實現(xiàn)這個功能,采用表格方式把頁面分成3行1列。其中,第1行是頁面的頭部,由于比較復(fù)雜,進行專門設(shè)計,文件名為head.jsp。結(jié)構(gòu)分布如下所示:,index.jsp,7.2運行主界面的實現(xiàn),為了設(shè)計圖書管理系統(tǒng)上部頁面,可以先采用Adobe公司的Photoshop或者Illustrator軟件設(shè)計出整幅圖頁面,如圖7.4所示。,圖7.4上部頁面整幅圖,然后采用Photoshop或者Illustrator或者FireWorks(建議采用)的圖片“切片”工具,進行切片分隔,切片后如圖7.5所示。,圖7.5切片分隔后,7.2運行主界面的實現(xiàn),選擇“導(dǎo)出”功能,設(shè)置導(dǎo)出為“HTML和圖像”;選擇“選項”,對表格進行設(shè)置,如圖7.6所示。,圖7.6導(dǎo)出設(shè)置,7.2運行主界面的實現(xiàn),進行“導(dǎo)出”操作后生成的圖片文件如圖7.7所示。,圖7.7生成的圖片文件,7.2運行主界面的實現(xiàn),同時,對系統(tǒng)自動生成的HTML文件進行如下處理:刪除注釋及img標(biāo)記中對本例沒有用的屬性;為了HTML代碼閱讀方便,把系統(tǒng)生成的有關(guān)的圖片文件改名;加入系統(tǒng)登錄和圖片對應(yīng)功能的超鏈接代碼;把擴展名改成“head.jsp”。修改后的head.jsp代碼。除了上面介紹的切割圖片的方法外,HTML還提供了在圖片上制作熱點區(qū)域的方法,就是可以在一幅完整的圖片上面,制作出一塊區(qū)域用于超鏈接,該區(qū)域是用坐標(biāo)來實現(xiàn)的。應(yīng)用這種方法,只需將上面所說的頭部的圖片切割成上下兩部分,如圖7.8所示。,圖7.8頭部圖片切割情況,7.2運行主界面的實現(xiàn),然后,把上面一幅圖作為背景,而下面一幅圖作為插入在表格中的圖片,該圖片可以制作熱點區(qū)域來實現(xiàn)圖片的超鏈接。制作完成后代碼。頭部實現(xiàn)后,運行的主界面就簡單了,index.jsp代碼實現(xiàn)為。,7.3實現(xiàn)“登錄”功能,由于登錄時要對數(shù)據(jù)庫進行查詢,故在編寫“登錄功能”的代碼之前,要先編寫連接數(shù)據(jù)庫的代碼。連接數(shù)據(jù)庫的文件DBConn.java代碼實現(xiàn)為??梢钥闯?,數(shù)據(jù)庫的連接與關(guān)閉使用的是靜態(tài)方法,要對數(shù)據(jù)庫連接或關(guān)閉,只需用“類名.方法名”即可。登錄頁面在“index.jsp”中已經(jīng)包含,可以看出,當(dāng)單擊“提交”時,交給了“l(fā)ogin.action”,故需要在“struts.xml”中配置該action來處理請求:/index.jsp/index.jsp,7.3實現(xiàn)“登錄”功能,處理請求的Action類LoginAction.java代碼為。該Action中應(yīng)用了模型傳值,Login.java代碼為:packageorg.model;publicclassLoginprivateintid;privateStringname;privateStringpassword;privatebooleanrole;/省略上述屬性的get和set方法在Action中引用了LoginDao.java,該類負(fù)責(zé)登錄信息與數(shù)據(jù)庫的交互。DAO即為數(shù)據(jù)訪問對象,在一般的項目開發(fā)中都會有DAO的存在,這樣便于維護,所以,登錄信息與數(shù)據(jù)庫的交互由LoginDao來處理。LoginDao這樣的命名方式可以使程序員根據(jù)該名稱就清楚它的功能,同時可以方便地找到它。LoginDao.java代碼實現(xiàn)。,7.4實現(xiàn)“借書”功能,當(dāng)用管理員身份“登錄”后,“圖片”鏈接就可用了,單擊“借書”,出現(xiàn)如圖7.9所示的界面。,圖7.9借書界面,7.4實現(xiàn)“借書”功能,要實現(xiàn)這個功能,采用表格方式把頁面分成3行2列。其中,第1行與第3行占兩列,然后在第2行的兩列中分別放兩個表格,左邊的表格非常簡單,不多介紹了,關(guān)鍵是右邊的表格,右邊的表格又分為3行1列,第1行是“圖書信息”字樣及一個簡單的表單,第2行中又插入了一個表格,這個表格顯示圖書的信息,第3行是分頁的信息。基本結(jié)構(gòu)如下所示:,lend.jsp,lend.jsp,7.4實現(xiàn)“借書”功能,從該頁面可以看出,左邊是“查詢”功能,輸入借書證號后,單擊“查詢”按鈕,就可以查出該借書證號的讀者借了哪些書籍,而剛進入頁面時,借書功能是不可用的,但當(dāng)輸入了借書證號后,單擊“查詢”按鈕,會在右邊顯示該讀者所借書籍,同時“借書”功能變亮,表示可以進行借書操作了,如圖7.10所示。,圖7.10查詢借書信息,7.4實現(xiàn)“借書”功能,輸入正確的ISBN及圖書ID,單擊“借書”按鈕,就可以借得此書,如圖7.11所示。,圖7.11借書成功頁面,7.4.1查詢已借圖書,單擊“借書”鏈接后,出現(xiàn)了圖7.4的界面供用戶操作,從head.jsp中的代碼:可以看出,單擊該操作,提交到“l(fā)end.jsp”,故圖7.4所示的頁面的代碼實現(xiàn)應(yīng)該為lend.jsp:讀者可能會感覺這么長的代碼怎么看,其實代碼非常簡單,總體來說就四個部分,第一部分:,7.4.1查詢已借圖書,導(dǎo)入頭部,具體內(nèi)容前面已經(jīng)講解,不再贅述。第二部分就是頁面左邊的查詢功能部分:內(nèi)容選擇借書證號:,7.4.1查詢已借圖書,當(dāng)輸入正確的借書證號,單擊“查詢”時,提交到“selectBook.action”,根據(jù)struts.xml配置下面的代碼:/lend.jsp處理的Action為LendAction中的selectAllLend方法,LendAction.java的該部分代碼。,7.4.1查詢已借圖書,由于用到了模型傳值,而且在后面的與數(shù)據(jù)庫交互時把查詢的數(shù)據(jù)記錄都轉(zhuǎn)化為該類中的屬性,故模型代碼Lend.java為:packageorg.model;importjava.util.Date;publicclassLendprivateStringbookId;privateStringreaderId;privateStringbookName;privateStringpublisher;privatefloatprice;privateStringISBN;privateDatelTime;/生成上述屬性的get和set方法,7.4.1查詢已借圖書,該Action中應(yīng)用了3個其他類,有StudentDao、LendDao及Pager,Dao是用來和數(shù)據(jù)庫交互的,該Action類中應(yīng)用了StudentDao的“selectByReaderId”方法。該方法是用來根據(jù)借書證號,查詢學(xué)生信息,如果有該學(xué)生信息就查詢該學(xué)生已借圖書;如果沒有就添加“不存在該學(xué)生”的信息到“message”,然后返回到頁面,頁面會輸出該信息,告知用戶輸入了錯誤的借書證號。StudentDao.java的代碼實現(xiàn)為。,7.4.1查詢已借圖書,該Dao中的方法selectByReaderId的作用就是根據(jù)借書證號,查詢學(xué)生信息;如果有就返回該學(xué)生,如果沒有就返回null。當(dāng)然,在應(yīng)用Student類之前要先編寫該類的代碼,Student.java就是student表對應(yīng)的模型:packageorg.model;importjava.util.Date;publicclassStudentprivateStringreaderId;privateStringname;privateStringspec;privatebooleansex;privateDateborn;privateintnum;privateintsnum;privatebytephoto;/省略上面屬性的get和set方法,7.4.1查詢已借圖書,判斷完成后,如果輸入了正確的借書證號,就會分頁查詢,先來看看在LendDao中的查詢方法。當(dāng)在Action中調(diào)用這個查詢方法后,就會得到對應(yīng)借書證號在lend表中的“pageSize”條記錄,返回查詢結(jié)果的List集。接下來就是Pager.java,即分頁功能。其實,分頁功能的處理有很多方法,不同的程序員寫的方法可能不一樣,但都能達到目的。本例的分頁功能代碼。Pager類中構(gòu)造方法中要傳入兩個參數(shù),一個是“pageNow”,另一個是“totalSize”,而“totalSize”是數(shù)據(jù)庫中對應(yīng)記錄的總條數(shù),故需要查詢數(shù)據(jù)庫,所以在創(chuàng)建Pager對象時:Pagerpage=newPager(pageNow,lendDao.selectLendSize(lend.getReaderId();,7.4.1查詢已借圖書,在LendDao中加入查詢總記錄的方法。在Action中調(diào)用方法查詢完成后,把要保存的信息保存到request中,然后根據(jù)返回值在struts.xml中的配置返回到“l(fā)end.jsp”頁面。此時由于request保存了該信息,就會在頁面輸出信息,輸出代碼就是要說的lend.jsp的第三部分:圖書IDISBN書名出版社價格借書時間,7.4.1查詢已借圖書,上面內(nèi)容是顯示存儲在request中的list,但在做這部分功能時每次只查詢了“pageSize”條記錄,故在頁面中應(yīng)用了分頁。下面看分頁代碼。當(dāng)單擊要顯示的頁面時,就把pageNow值傳到了Action,Action就會根據(jù)pageNow的值查詢要顯示的list集,這樣查詢功能就基本完成了。在Action處理之前做了一些判斷工作,如果輸入的借書證號不合法或不存在就會直接返回并保存一些信息。在“l(fā)end.jsp”中也有相應(yīng)的輸出:,7.4.2“借書”功能,前面講解了“l(fā)end.jsp”根據(jù)借書證號查詢已借圖書的功能,“l(fā)end.jsp”中還有最后一個功能就是借書,首先看看其實現(xiàn)代碼。讀者可以發(fā)現(xiàn),借書的輸入框中也進行了判斷,如果“readerId”沒有值就讓輸入框不可編輯,這是因為如果沒有“readerId”就不知道誰要借書了,這個很容易理解。輸入了“借書證號”(即readerId),查詢該學(xué)生已借圖書后,“readerId”就被保存到了request中,這時該部分就變成可操作了,輸入要借書籍的“ISBN”及“圖書ID”,單擊“借書”按鈕,提交到“l(fā)endBook.action”,該請求在struts.xml中配置為:/lend.jsp,7.4.2“借書”功能,從“method=lendBook”可以看出,處理該功能的是LendAction中的lendBook方法,下面看該方法的實現(xiàn)。因為是在同一頁面顯示,故當(dāng)借書時還要顯示前面查詢的已借圖書,所以獲取已借圖書信息的代碼和前面一樣,不再多說。本功能在判斷是否有用戶輸入的“ISBN”時應(yīng)用了BookDao的“selectBook”方法。,7.4.2“借書”功能,圖書模型Book.java代碼為:packageorg.model;publicclassBookprivateStringISBN;privateStringbookName;privateStringauthor;privateStringpublisher;privatefloatprice;privateintcnum;privateintsnum;privateStringsummary;privatebytephoto;/省略上面屬性的get和set方法,7.4.2“借書”功能,調(diào)用該方法,如果返回的是null,就表示輸入的“ISBN”不存在,也就表示不存在該種圖書。同樣,在判斷圖書ID時,因為同一本書不能被同時借兩次或多次,故在已經(jīng)借的書中不能包含剛剛輸入的圖書ID,判斷方法為LendDao中的“selectByBookId”方法,代碼實現(xiàn)。如果返回“l(fā)end”,表示已經(jīng)存在,將返回錯誤信息。通過判斷都合法后,將應(yīng)用LendDao中的“addLend”方法對其進行插入操作。由于該“ISBN”的圖書被借出去一本,故該圖書的庫存量應(yīng)該減少一本,所以在插入一條lend記錄的同時要修改book的庫存量:Bookbook=bookDao.selectBook(lend.getISBN();/取得該ISBN的圖書對象book.setSnum(book.getSnum()-1);/設(shè)置庫存量-1bookDao.updateBook(book);,7.4.2“借書”功能,在BookDao中的updateBook方法。同時,學(xué)生的借書量應(yīng)該多出一本,故有這樣的代碼:StudentDaostudentDao=newStudentDao();Studentstu=studentDao.selectByReaderId(lend.getReaderId();stu.setNum(stu.getNum()+1);/設(shè)置學(xué)生的借書量+1studentDao.updateStudent(stu);,7.4.2“借書”功能,所以,在StudentDao中要編寫修改學(xué)生信息的方法:publicvoidupdateStudent(Studentstu)tryconn=DBConn.getConn();PreparedStatementpstmt=conn.prepareStatement(updatestudentsetnum=?wherereaderId=?);pstmt.setInt(1,stu.getNum();pstmt.setString(2,stu.getReaderId();pstmt.executeUpdate();catch(Exceptione)e.printStackTrace();finallyDBConn.CloseConn();,7.5實現(xiàn)“圖書管理”功能,單擊“圖書管理”,跳轉(zhuǎn)到“bookmanage.jsp”,出現(xiàn)如圖7.12所示的頁面。,圖7.12圖書管理頁面,7.5.1“圖書追加”功能,在實現(xiàn)該功能之前,先來看看“bookmanage.jsp”的實現(xiàn)。當(dāng)填寫完要添加的圖書信息后,顯示界面如圖7.13所示。,圖7.13圖書添加界面,7.5.1“圖書追加”功能,可以發(fā)現(xiàn),“圖書追加”提交按鈕代碼:由于4個按鈕均提交到“book.action”,故該提交代碼中定義了“method=addBook”,表示提交后由Action類中的“addBook”方法來處理,struts.xml中關(guān)于action的配置為:/bookmanage.jsp/bookmanage.jsp*addBook,updateBook,7.5.1“圖書追加”功能,通過該配置文件,系統(tǒng)會應(yīng)用BookAction來處理請求,并根據(jù)提交的方法名來決定用哪個方法進行處理。Book的模型在借書部分已經(jīng)給出,這里不再列舉。本例中把照片傳入數(shù)據(jù)庫中用二進制流保存,而在頁面中,由于用到文件上傳,故“form”中要加入屬性“enctype=multipart/form-data”,文件部分代碼為:命名為“photo”,故在Action中有:privateFilephoto;,7.5.1“圖書追加”功能,接收傳過來的值,后面“onchange”表示當(dāng)選擇好圖片的路徑時,把:width=100height=120中“src”值設(shè)置為選中的圖片的路徑。這樣,當(dāng)我們選擇了圖片時,就會在“img”的地方顯示該圖片。if(this.getPhoto()!=null)FileInputStreamfis=newFileInputStream(this.getPhoto();bytebuffer=newbytefis.available();fis.read(buffer);b.setPhoto(buffer);,7.5.1“圖書追加”功能,這段代碼是處理傳入的文件,把文件轉(zhuǎn)化為字節(jié)數(shù)組,完成后調(diào)用BookDao的“addBook”方法進行插入操作。該方法的代碼。因為當(dāng)添加記錄時,需要對數(shù)據(jù)進行驗證,本部分采用驗證框架來處理,驗證框架文件“BookAction-validation.xml”配置。struts.xml中的action配置為:/bookmanage.jsp/bookmanage.jsp*addBook,updateBook,7.5.1“圖書追加”功能,黑體部分是配置該action應(yīng)用的攔截器,我們知道,action默認(rèn)使用的攔截器是“defaultStack”,本例為action配置該攔截器,但加入了兩個參數(shù):*表示對所有方法都不驗證,而addBook,updateBook表示驗證“addBook”、“updateBook”兩個方法,通過這樣的設(shè)置,系統(tǒng)就會只驗證“addBook”、“updateBook”兩個方法。,7.5.2“圖書刪除”功能,圖書刪除功能非常簡單,輸入“ISBN”后,單擊“刪除”按鈕,就會根據(jù)BookAction中的“deleteBook”方法刪除圖書信息?!癲eleteBook”方法實現(xiàn)為:publicStringdeleteBook()throwsExceptionif(newLendDao().selectByBookISBN(book.getISBN()!=null)this.setMessage(該圖書已經(jīng)被借出,不能刪除);returnSUCCESS;Bookbo=bookDao.selectBook(book.getISBN();if(bo=null)/首先判斷是否存在該圖書this.setMessage(要刪除的圖書不存在!);returnSUCCESS;elseif(newLendDao().selectByBookISBN(book.getISBN()!=null)this.setMessage(該圖書已經(jīng)被借出,故不能刪除圖書信息!);returnSUCCESS;bookDao.deleteBook(book.getISBN();this.setMessage(刪除成功!);returnSUCCESS;,7.5.2“圖書刪除”功能,該功能用了三個方法,分別是BookDao中的“selectBook”、“deleteBook”及LendDao中的“selectByBookISBN”?!皊electBook”方法前面已經(jīng)給出,“deleteBook”方法實現(xiàn)為:publicbooleandeleteBook(StringISBN)tryconn=DBConn.getConn();PreparedStatementpstmt=conn.prepareStatement(deletefrombookwhereISBN=?);pstmt.setString(1,ISBN);pstmt.execute();returntrue;catch(Exceptione)e.printStackTrace();returnfalse;finallyDBConn.CloseConn();實現(xiàn)方法非常簡單,這里就不多做解釋了。LendDao中的“selectByBookISBN”方法實現(xiàn)。,7.5.3“圖書查詢”功能,輸入“ISBN”后,單擊“圖書查詢”按鈕,就會根據(jù)BookAction中的“selectBook”方法處理,查詢該圖書信息?!皊electBook”方法實現(xiàn)為:publicStringselectBook()throwsExceptionBookonebook=bookDao.selectBook(book.getISBN();if(onebook
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)業(yè)廢棄物綜合利用合同3篇
- 2025年度太陽能光伏電站租賃運營合同示范文本4篇
- 二零二五版盤扣式腳手架租賃與安全教育培訓(xùn)合同4篇
- 二零二五年度老舊小區(qū)供暖設(shè)施升級改造承包合同范本4篇
- 二零二四年份建筑工程施工合同3篇
- 二零二五年度公司內(nèi)部股權(quán)轉(zhuǎn)讓與員工持股計劃法律事務(wù)合同
- 2025年跨境電商外匯貸款租賃合同
- 2025主播直播平臺內(nèi)容版權(quán)授權(quán)及監(jiān)管合同3篇
- 第三單元 文明與家園【速記清單】-2023-2024學(xué)年九年級道德與法治上學(xué)期期中考點大串講(部編版)
- 課題申報參考:模仿動力學(xué)在物流應(yīng)急疏散中的應(yīng)用研究
- 2025福建新華發(fā)行(集團)限責(zé)任公司校園招聘30人高頻重點提升(共500題)附帶答案詳解
- 山東鐵投集團招聘筆試沖刺題2025
- 真需求-打開商業(yè)世界的萬能鑰匙
- 2025年天津市政集團公司招聘筆試參考題庫含答案解析
- GB/T 44953-2024雷電災(zāi)害調(diào)查技術(shù)規(guī)范
- 2024-2025學(xué)年度第一學(xué)期三年級語文寒假作業(yè)第三天
- 2024年列車員技能競賽理論考試題庫500題(含答案)
- 心律失常介入治療
- 《無人機測繪技術(shù)》項目3任務(wù)2無人機正射影像數(shù)據(jù)處理
- 6S精益實戰(zhàn)手冊
- 展會場館保潔管理服務(wù)方案
評論
0/150
提交評論