




已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章Struts2綜合應用實例,7.1建立項目,7.2運行主界面的實現,7.3實現“登錄”功能,7.4實現“借書”功能,7.5實現“圖書管理”功能,第7章Struts2綜合應用實例,這里只介紹圖書管理系統(tǒng)的兩個功能:讀者借書和圖書管理,它已經包含了操作數據庫的主要內容,其他功能讀者可以根據所學知識自行完成。本系統(tǒng)運行時的初始主界面如圖7.1所示。,圖7.1運行主界面,第7章Struts2綜合應用實例,在沒“登錄”之前,操作功能的圖片是灰色的,不能被單擊。而當登錄成功后,操作功能的圖片就亮起來,登錄的輸入框及“登錄”按鈕被置灰,表示不可再進行“登錄”操作。登錄有兩種角色,使用“管理員”登錄名登錄,操作功能所有圖片都會亮,表示所有操作都可以進行,如圖7.2所示。,圖7.2管理員身份登錄后的界面,第7章Struts2綜合應用實例,如果是“學生”登錄,登錄成功后,前面兩個圖片會亮,表示可以進行操作,后面的圖片還是灰色的,表示不能操作,如圖7.3所示。,圖7.3學生身份登錄后的界面,7.1建立項目,首先,在MyEclipse中建立項目Struts2_Example,加載Struts2所需的5個類庫、SQLServer所需的類庫及文件上傳所需的兩個類庫(這兩個類庫在Struts2的文件上傳部分已經講解)。然后修改web.xml文件,在第一個Struts2的例子中已經給出,不再贅述。接著在src下創(chuàng)建Struts2的核心配置文件struts.xml,并編寫其框架代碼:./此處以后添加action配置,7.2運行主界面的實現,上面已經展示了初始系統(tǒng)的主頁面,文件名為index.jsp,要實現這個功能,采用表格方式把頁面分成3行1列。其中,第1行是頁面的頭部,由于比較復雜,進行專門設計,文件名為head.jsp。結構分布如下所示:,index.jsp,7.2運行主界面的實現,為了設計圖書管理系統(tǒng)上部頁面,可以先采用Adobe公司的Photoshop或者Illustrator軟件設計出整幅圖頁面,如圖7.4所示。,圖7.4上部頁面整幅圖,然后采用Photoshop或者Illustrator或者FireWorks(建議采用)的圖片“切片”工具,進行切片分隔,切片后如圖7.5所示。,圖7.5切片分隔后,7.2運行主界面的實現,選擇“導出”功能,設置導出為“HTML和圖像”;選擇“選項”,對表格進行設置,如圖7.6所示。,圖7.6導出設置,7.2運行主界面的實現,進行“導出”操作后生成的圖片文件如圖7.7所示。,圖7.7生成的圖片文件,7.2運行主界面的實現,同時,對系統(tǒng)自動生成的HTML文件進行如下處理:刪除注釋及img標記中對本例沒有用的屬性;為了HTML代碼閱讀方便,把系統(tǒng)生成的有關的圖片文件改名;加入系統(tǒng)登錄和圖片對應功能的超鏈接代碼;把擴展名改成“head.jsp”。修改后的head.jsp代碼。除了上面介紹的切割圖片的方法外,HTML還提供了在圖片上制作熱點區(qū)域的方法,就是可以在一幅完整的圖片上面,制作出一塊區(qū)域用于超鏈接,該區(qū)域是用坐標來實現的。應用這種方法,只需將上面所說的頭部的圖片切割成上下兩部分,如圖7.8所示。,圖7.8頭部圖片切割情況,7.2運行主界面的實現,然后,把上面一幅圖作為背景,而下面一幅圖作為插入在表格中的圖片,該圖片可以制作熱點區(qū)域來實現圖片的超鏈接。制作完成后代碼。頭部實現后,運行的主界面就簡單了,index.jsp代碼實現為。,7.3實現“登錄”功能,由于登錄時要對數據庫進行查詢,故在編寫“登錄功能”的代碼之前,要先編寫連接數據庫的代碼。連接數據庫的文件DBConn.java代碼實現為??梢钥闯?,數據庫的連接與關閉使用的是靜態(tài)方法,要對數據庫連接或關閉,只需用“類名.方法名”即可。登錄頁面在“index.jsp”中已經包含,可以看出,當單擊“提交”時,交給了“l(fā)ogin.action”,故需要在“struts.xml”中配置該action來處理請求:/index.jsp/index.jsp,7.3實現“登錄”功能,處理請求的Action類LoginAction.java代碼為。該Action中應用了模型傳值,Login.java代碼為:packageorg.model;publicclassLoginprivateintid;privateStringname;privateStringpassword;privatebooleanrole;/省略上述屬性的get和set方法在Action中引用了LoginDao.java,該類負責登錄信息與數據庫的交互。DAO即為數據訪問對象,在一般的項目開發(fā)中都會有DAO的存在,這樣便于維護,所以,登錄信息與數據庫的交互由LoginDao來處理。LoginDao這樣的命名方式可以使程序員根據該名稱就清楚它的功能,同時可以方便地找到它。LoginDao.java代碼實現。,7.4實現“借書”功能,當用管理員身份“登錄”后,“圖片”鏈接就可用了,單擊“借書”,出現如圖7.9所示的界面。,圖7.9借書界面,7.4實現“借書”功能,要實現這個功能,采用表格方式把頁面分成3行2列。其中,第1行與第3行占兩列,然后在第2行的兩列中分別放兩個表格,左邊的表格非常簡單,不多介紹了,關鍵是右邊的表格,右邊的表格又分為3行1列,第1行是“圖書信息”字樣及一個簡單的表單,第2行中又插入了一個表格,這個表格顯示圖書的信息,第3行是分頁的信息?;窘Y構如下所示:,lend.jsp,lend.jsp,7.4實現“借書”功能,從該頁面可以看出,左邊是“查詢”功能,輸入借書證號后,單擊“查詢”按鈕,就可以查出該借書證號的讀者借了哪些書籍,而剛進入頁面時,借書功能是不可用的,但當輸入了借書證號后,單擊“查詢”按鈕,會在右邊顯示該讀者所借書籍,同時“借書”功能變亮,表示可以進行借書操作了,如圖7.10所示。,圖7.10查詢借書信息,7.4實現“借書”功能,輸入正確的ISBN及圖書ID,單擊“借書”按鈕,就可以借得此書,如圖7.11所示。,圖7.11借書成功頁面,7.4.1查詢已借圖書,單擊“借書”鏈接后,出現了圖7.4的界面供用戶操作,從head.jsp中的代碼:可以看出,單擊該操作,提交到“l(fā)end.jsp”,故圖7.4所示的頁面的代碼實現應該為lend.jsp:讀者可能會感覺這么長的代碼怎么看,其實代碼非常簡單,總體來說就四個部分,第一部分:,7.4.1查詢已借圖書,導入頭部,具體內容前面已經講解,不再贅述。第二部分就是頁面左邊的查詢功能部分:內容選擇借書證號:,7.4.1查詢已借圖書,當輸入正確的借書證號,單擊“查詢”時,提交到“selectBook.action”,根據struts.xml配置下面的代碼:/lend.jsp處理的Action為LendAction中的selectAllLend方法,LendAction.java的該部分代碼。,7.4.1查詢已借圖書,由于用到了模型傳值,而且在后面的與數據庫交互時把查詢的數據記錄都轉化為該類中的屬性,故模型代碼Lend.java為:packageorg.model;importjava.util.Date;publicclassLendprivateStringbookId;privateStringreaderId;privateStringbookName;privateStringpublisher;privatefloatprice;privateStringISBN;privateDatelTime;/生成上述屬性的get和set方法,7.4.1查詢已借圖書,該Action中應用了3個其他類,有StudentDao、LendDao及Pager,Dao是用來和數據庫交互的,該Action類中應用了StudentDao的“selectByReaderId”方法。該方法是用來根據借書證號,查詢學生信息,如果有該學生信息就查詢該學生已借圖書;如果沒有就添加“不存在該學生”的信息到“message”,然后返回到頁面,頁面會輸出該信息,告知用戶輸入了錯誤的借書證號。StudentDao.java的代碼實現為。,7.4.1查詢已借圖書,該Dao中的方法selectByReaderId的作用就是根據借書證號,查詢學生信息;如果有就返回該學生,如果沒有就返回null。當然,在應用Student類之前要先編寫該類的代碼,Student.java就是student表對應的模型:packageorg.model;importjava.util.Date;publicclassStudentprivateStringreaderId;privateStringname;privateStringspec;privatebooleansex;privateDateborn;privateintnum;privateintsnum;privatebytephoto;/省略上面屬性的get和set方法,7.4.1查詢已借圖書,判斷完成后,如果輸入了正確的借書證號,就會分頁查詢,先來看看在LendDao中的查詢方法。當在Action中調用這個查詢方法后,就會得到對應借書證號在lend表中的“pageSize”條記錄,返回查詢結果的List集。接下來就是Pager.java,即分頁功能。其實,分頁功能的處理有很多方法,不同的程序員寫的方法可能不一樣,但都能達到目的。本例的分頁功能代碼。Pager類中構造方法中要傳入兩個參數,一個是“pageNow”,另一個是“totalSize”,而“totalSize”是數據庫中對應記錄的總條數,故需要查詢數據庫,所以在創(chuàng)建Pager對象時:Pagerpage=newPager(pageNow,lendDao.selectLendSize(lend.getReaderId();,7.4.1查詢已借圖書,在LendDao中加入查詢總記錄的方法。在Action中調用方法查詢完成后,把要保存的信息保存到request中,然后根據返回值在struts.xml中的配置返回到“l(fā)end.jsp”頁面。此時由于request保存了該信息,就會在頁面輸出信息,輸出代碼就是要說的lend.jsp的第三部分:圖書IDISBN書名出版社價格借書時間,7.4.1查詢已借圖書,上面內容是顯示存儲在request中的list,但在做這部分功能時每次只查詢了“pageSize”條記錄,故在頁面中應用了分頁。下面看分頁代碼。當單擊要顯示的頁面時,就把pageNow值傳到了Action,Action就會根據pageNow的值查詢要顯示的list集,這樣查詢功能就基本完成了。在Action處理之前做了一些判斷工作,如果輸入的借書證號不合法或不存在就會直接返回并保存一些信息。在“l(fā)end.jsp”中也有相應的輸出:,7.4.2“借書”功能,前面講解了“l(fā)end.jsp”根據借書證號查詢已借圖書的功能,“l(fā)end.jsp”中還有最后一個功能就是借書,首先看看其實現代碼。讀者可以發(fā)現,借書的輸入框中也進行了判斷,如果“readerId”沒有值就讓輸入框不可編輯,這是因為如果沒有“readerId”就不知道誰要借書了,這個很容易理解。輸入了“借書證號”(即readerId),查詢該學生已借圖書后,“readerId”就被保存到了request中,這時該部分就變成可操作了,輸入要借書籍的“ISBN”及“圖書ID”,單擊“借書”按鈕,提交到“l(fā)endBook.action”,該請求在struts.xml中配置為:/lend.jsp,7.4.2“借書”功能,從“method=lendBook”可以看出,處理該功能的是LendAction中的lendBook方法,下面看該方法的實現。因為是在同一頁面顯示,故當借書時還要顯示前面查詢的已借圖書,所以獲取已借圖書信息的代碼和前面一樣,不再多說。本功能在判斷是否有用戶輸入的“ISBN”時應用了BookDao的“selectBook”方法。,7.4.2“借書”功能,圖書模型Book.java代碼為:packageorg.model;publicclassBookprivateStringISBN;privateStringbookName;privateStringauthor;privateStringpublisher;privatefloatprice;privateintcnum;privateintsnum;privateStringsummary;privatebytephoto;/省略上面屬性的get和set方法,7.4.2“借書”功能,調用該方法,如果返回的是null,就表示輸入的“ISBN”不存在,也就表示不存在該種圖書。同樣,在判斷圖書ID時,因為同一本書不能被同時借兩次或多次,故在已經借的書中不能包含剛剛輸入的圖書ID,判斷方法為LendDao中的“selectByBookId”方法,代碼實現。如果返回“l(fā)end”,表示已經存在,將返回錯誤信息。通過判斷都合法后,將應用LendDao中的“addLend”方法對其進行插入操作。由于該“ISBN”的圖書被借出去一本,故該圖書的庫存量應該減少一本,所以在插入一條lend記錄的同時要修改book的庫存量:Bookbook=bookDao.selectBook(lend.getISBN();/取得該ISBN的圖書對象book.setSnum(book.getSnum()-1);/設置庫存量-1bookDao.updateBook(book);,7.4.2“借書”功能,在BookDao中的updateBook方法。同時,學生的借書量應該多出一本,故有這樣的代碼:StudentDaostudentDao=newStudentDao();Studentstu=studentDao.selectByReaderId(lend.getReaderId();stu.setNum(stu.getNum()+1);/設置學生的借書量+1studentDao.updateStudent(stu);,7.4.2“借書”功能,所以,在StudentDao中要編寫修改學生信息的方法: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實現“圖書管理”功能,單擊“圖書管理”,跳轉到“bookmanage.jsp”,出現如圖7.12所示的頁面。,圖7.12圖書管理頁面,7.5.1“圖書追加”功能,在實現該功能之前,先來看看“bookmanage.jsp”的實現。當填寫完要添加的圖書信息后,顯示界面如圖7.13所示。,圖7.13圖書添加界面,7.5.1“圖書追加”功能,可以發(fā)現,“圖書追加”提交按鈕代碼:由于4個按鈕均提交到“book.action”,故該提交代碼中定義了“method=addBook”,表示提交后由Action類中的“addBook”方法來處理,struts.xml中關于action的配置為:/bookmanage.jsp/bookmanage.jsp*addBook,updateBook,7.5.1“圖書追加”功能,通過該配置文件,系統(tǒng)會應用BookAction來處理請求,并根據提交的方法名來決定用哪個方法進行處理。Book的模型在借書部分已經給出,這里不再列舉。本例中把照片傳入數據庫中用二進制流保存,而在頁面中,由于用到文件上傳,故“form”中要加入屬性“enctype=multipart/form-data”,文件部分代碼為:命名為“photo”,故在Action中有:privateFilephoto;,7.5.1“圖書追加”功能,接收傳過來的值,后面“onchange”表示當選擇好圖片的路徑時,把:width=100height=120中“src”值設置為選中的圖片的路徑。這樣,當我們選擇了圖片時,就會在“img”的地方顯示該圖片。if(this.getPhoto()!=null)FileInputStreamfis=newFileInputStream(this.getPhoto();bytebuffer=newbytefis.available();fis.read(buffer);b.setPhoto(buffer);,7.5.1“圖書追加”功能,這段代碼是處理傳入的文件,把文件轉化為字節(jié)數組,完成后調用BookDao的“addBook”方法進行插入操作。該方法的代碼。因為當添加記錄時,需要對數據進行驗證,本部分采用驗證框架來處理,驗證框架文件“BookAction-validation.xml”配置。struts.xml中的action配置為:/bookmanage.jsp/bookmanage.jsp*addBook,updateBook,7.5.1“圖書追加”功能,黑體部分是配置該action應用的攔截器,我們知道,action默認使用的攔截器是“defaultStack”,本例為action配置該攔截器,但加入了兩個參數:*表示對所有方法都不驗證,而addBook,updateBook表示驗證“addBook”、“updateBook”兩個方法,通過這樣的設置,系統(tǒng)就會只驗證“addBook”、“updateBook”兩個方法。,7.5.2“圖書刪除”功能,圖書刪除功能非常簡單,輸入“ISBN”后,單擊“刪除”按鈕,就會根據BookAction中的“deleteBook”方法刪除圖書信息?!癲eleteBook”方法實現為:publicStringdeleteBook()throwsExceptionif(newLendDao().selectByBookISBN(book.getISBN()!=null)this.setMessage(該圖書已經被借出,不能刪除);returnSUCCESS;Bookbo=bookDao.selectBook(book.getISBN();if(bo=null)/首先判斷是否存在該圖書this.setMessage(要刪除的圖書不存在!);returnSUCCESS;elseif(newLendDao().selectByBookISBN(book.getISBN()!=null)this.setMessage(該圖書已經被借出,故不能刪除圖書信息!);returnSUCCESS;bookDao.deleteBook(book.getISBN();this.setMessage(刪除成功!);returnSUCCESS;,7.5.2“圖書刪除”功能,該功能用了三個方法,分別是BookDao中的“selectBook”、“deleteBook”及LendDao中的“selectByBookISBN”?!皊electBook”方法前面已經給出,“deleteBook”方法實現為:publicbooleandeleteBook(StringISBN)tryconn=DBConn.getConn();PreparedStatementpstmt=conn.prepareStatement(deletefrombookwhereISBN=?);pstmt.setString(1,ISBN);pstmt.execute();returntrue;catch(Exceptione)e.printStackTrace();returnfalse;finallyDBConn.CloseConn();實現方法非常簡單,這里就不多做解釋了。LendDao中的“selectByBookISBN”方法實現。,7.5.3“圖書查詢”功能,輸入“ISBN”后,單擊“圖書查詢”按鈕,就會根據BookAction中的“selectBook”方法處理,查詢該圖書信息?!皊electBook”方法實現為:publicStringselectBook()throwsExceptionBookonebook=bookDao.selectBook(book.getISBN();if(onebook
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 社區(qū)愛衛(wèi)工作總結2025
- 洪洞新英學??荚囋囶}及答案
- 跑步考試試題及答案
- 鋼琴專業(yè)考試試題及答案
- 甘河中學期末考試試題及答案
- 湖南在職申碩考試試題及答案
- 海南司法考試試題及答案
- 第6章 數據與圖表統(tǒng)計 單元教學設計 七年級數學下冊 浙教版
- 專題二:特殊平行四邊形中最值問題 2024-2025學年八年級下冊數學同步講練【浙教版】(含解析)
- 大學珠算考試試題及答案
- 醬香型白酒堆積發(fā)酵異常的研究現狀與展望
- 歌曲《wake》中英文歌詞對照
- 義務教育(音樂)課程標準(2022年版)解讀
- 胃腸外科快速康復護理
- 2024年遼寧高級茶評員高頻核心題庫300題(含答案)
- 2024-2025學年小學科學六年級下冊湘科版(2024)教學設計合集
- 2024秋期國家開放大學《可編程控制器應用實訓》一平臺在線形考(形成任務7)試題及答案
- 電子政務概論-形考任務5(在線測試權重20%)-國開-參考資料
- 古代小說戲曲專題-形考任務2-國開-參考資料
- 新型建筑材料應用論文
- 2024復合材料和增強纖維 碳纖維增強塑料(CFRP)和金屬組件十字拉伸強度的測定
評論
0/150
提交評論