【正文】
會因為用戶忘記了密碼而流失了這部分的用戶 h 安全注銷功能,用戶瀏覽完帖子會需要離 開論壇,所以需要給他們一個安全登出的功能,防止別人使用他的賬號發(fā)布帖子。 ( 2) 安全機(jī)制問題的解決 在進(jìn)入系統(tǒng)之前,要進(jìn)行身份確認(rèn),只有用戶名和用戶密碼都相符的用戶方可進(jìn)入本系統(tǒng)。 管理員 級用戶不僅 可以 對數(shù)據(jù)查詢 , 還 可以 對用戶的使用權(quán)限進(jìn)行控制,還可以對紀(jì)錄進(jìn)行增加、刪除、修改等操作。當(dāng)用戶要進(jìn)入系統(tǒng)是必須先輸入用戶名和密碼,按 “ 確 定” 按鈕后,系統(tǒng)辨別用戶身份,對合法用戶根據(jù)用戶的權(quán)限級別賦予相應(yīng)的使用功能 論壇的頁面的調(diào)度具體是使用 Struts2這個框架來編碼完成的,具體的跳轉(zhuǎn)關(guān)系如下圖表示: ( 1) 游客頁面的跳轉(zhuǎn) 主要重點是游客 可以有觀看瀏覽帖子的權(quán)限,卻沒有發(fā)表信息的權(quán)限,所以當(dāng)游客想要發(fā)表新帖時,6 頁面就會跳轉(zhuǎn)到登陸界面,當(dāng)然游客也可以直接點擊主頁面上的注冊鏈接直接進(jìn)入注冊頁面進(jìn)行注冊工作 游客L o g i n . h t m l B B S _ i n d e x . j spR e g i st . h t m l主題B B S _ d e t a i l . j sp發(fā)表回復(fù)發(fā)表新帖 圖 3 游客頁面跳轉(zhuǎn)示意圖 ( 2) 注冊用戶頁面的跳轉(zhuǎn) 注冊用戶頁面的跳轉(zhuǎn)比起游客來主要是可以發(fā)表帖子的頁面和刪除修改功能的添加 l o g i n . h t m l是否成功發(fā)表新帖 主題N e w T o p i c. j sp B B S _ d e t a i l . j spB B S _ i n d e x . j sp 回復(fù) 返回r e T o p i c . j sp B B S _ i n d e x . j spB B S _ i n d e x . j spf a i l e . j sp重新登陸用戶登陸B(tài) B S _ i n d e x . j spye sno 圖 4 注冊用戶頁面跳轉(zhuǎn)示意圖 3管理員頁面跳轉(zhuǎn) 管理員的頁面是在后臺執(zhí)行的,用 CSS編 寫的動態(tài)框架設(shè)計,在后臺可以直接進(jìn)行帖子的瀏覽,用戶信息的管理和帖子的各種管理功能 7 L o g i n . h t m l發(fā)表新帖 主題刪除管理用戶u se r i n f o . j sp刪除用戶 增加用戶A d m i n / i n d e x . j sp是否成功f a i l e . j sp重新登陸管理員登陸查找用戶按照標(biāo)題查找A r t i c l e . j s p按照 id 查找 按照作者查找r e T o p i c . j spye sno 圖 5 管理員頁面跳轉(zhuǎn)示意圖 1對于游客來說 圖 6 游客功能示意圖 2對于注冊用戶 游客 瀏覽主帖子 瀏覽詳細(xì)內(nèi)容 注冊 8 圖 7 注冊用戶功能示意圖 3對于管理員 圖 8 管理員功能示意圖 注冊用戶 登錄功能 瀏覽主帖功能 瀏覽詳細(xì)內(nèi)容功能 發(fā)表新主題帖 發(fā)表回復(fù)功能 登出功能 刪除自己回復(fù) 修改自己回復(fù) 刪除自己主帖 修改自己主帖 管理員 管理用戶 管理帖子 用戶信息瀏覽 添加用戶 刪除用戶 修改用戶 瀏覽帖子 查找帖子 按照 id 查找帖子 按照標(biāo)題查找 按照作者查找 刪除帖子 發(fā)表新帖 發(fā)表回復(fù) 登錄功能 登出功能 9 MVC設(shè)計模式 MVC是 ModelViewController的簡稱,它是一種設(shè)計模式,它把應(yīng)用程序分成三個核心模塊:模型、視圖、控制器,它們各自處理自己的任務(wù)。 本程序使用的視圖主要是用 JSP和 HTML外加 CSS和 js制作的,這些網(wǎng)頁都是比較方便快捷的尤其是 JSP表現(xiàn)力是十分強(qiáng)大的。一個模型能為多個視圖提供數(shù)據(jù),因此提 高了代碼的可重用性。當(dāng) Web用戶單擊 Web頁面中的遞交按鈕來發(fā)送 HTML 表單時,控制器本身不輸出任何東西和做任何處理。 本項目是通過 Struts2來負(fù)責(zé)調(diào)度各個資源的分配,然后通過 Hibernate來持久化到數(shù)據(jù)庫或者是查詢修改數(shù)據(jù)庫 的設(shè)計與創(chuàng)建 我們 使用的是 MySQL,這是一種很好性能很強(qiáng)大的免費數(shù)據(jù)庫。 Isleaf這個字段是用來表示這個帖子是否有回復(fù)貼,這個字段的作用體現(xiàn)在當(dāng)我們需要設(shè)計刪除帖子的程序時候,能夠用方便的遞歸調(diào)用來刪除這個帖子的所有回復(fù),保證不產(chǎn)生那些沒有主題的回復(fù),能夠保證不會產(chǎn)生主題帖子被刪除了而回復(fù)還存在的尷尬場面。 我們使用方便快捷的 SQLYOG 這一款免費的 MySQL 圖形界面來維 護(hù)和查看數(shù)據(jù)庫。 要產(chǎn)生數(shù)據(jù)表格需要引入相應(yīng)的 Hibernate 的 jar 包到 MyEclipse。具體配置如下 ?xml version=39。 encoding=39。? 11 !DOCTYPE hibernateconfiguration PUBLIC //Hibernate/Hibernate Configuration DTD hibernateconfiguration sessionfactory ! Database connection settings這句話是用來 連接到 MySQL的 MyBBS這個 database里去的,用戶名為 root,用戶密碼為 admin。 property name=/property property name=jdbc: property name=root/property property name=admin/property ! SQL dialect property name=dialect/property ! Disable the secondlevel cache property name=/property ! Echo all executed SQL to stdout property name=show_sqltrue/property ! Drop and recreate the database schema on startup property name=update/property mapping class=/ mapping class=/ /sessionfactory /hibernateconfiguration 其中 property name=/property property name=jdbc: property name=root/property property name=admin/property 其中 mapping class=/ mapping class=/ 這兩句是為了讓 Hibernate認(rèn)識 JAVA的實體 bean類, Article和 User這兩個實體類的包,即是直接引入了這兩個 Class類,通過這兩個類來生成對應(yīng)字段的數(shù)據(jù)庫。并且在 id的 get方法前加上標(biāo)簽Id和 GeneratedValue以便于 Hibernate調(diào)用他自動生成自增長的主鍵。 這兩個實體 JAVA類對應(yīng)在數(shù)據(jù)庫中就是兩張表一張 uers一張 article,通過 annotation的 Entity來識別其中類中的每個私有屬性都代表了數(shù)據(jù)庫中相應(yīng)表格下的一個字段通過 Id來確認(rèn)主 GeneratedValue來生成自動增長的字段。 圖 10 登 陸界面示意圖 登錄界面相當(dāng)簡單主要就是一個表單 form method=post id=loginForm action=UserAction!login focus=這個表單是提交到 UserAction這個類的 login方法,通過login這個方法來接受表單 提交的用戶名和密碼是否合法。 HttpSession session = ()。 (MANAGER, user)。 } else if(LOGIN_USER.equals((user))) { 13 HttpServletRequest request = ()。 (LOGINUSER, user)。 } else { return login_false。如果是注冊用戶也在 session中保存信息,并且也返回一條用戶登錄成功的信息 login_user_success;如果是未注冊過的用戶那么也會返回登錄失敗信息“ login_false” 然后通過Struts2的配置文件 。 (2)主題帖的展現(xiàn) 作為論壇來說,展示主題帖子是個必須的功能,這是用戶來了解大概內(nèi)容的途徑,如下圖 圖 11主題帖的展示圖示 。 int maxRecords = 10。 ListArticle rootarticles = new ArrayList()。 int sumRecords = ()。 14 rootarticles = (maxRecords*getPage,(getPagemaxPage1)?maxRecords:sumRecordsmaxRecords*getPage)。 % 圖 11 主題帖的展示圖示 這 段代碼 中 rootarticles 是將要 顯示的 分頁后 的帖子 ,通過調(diào) 用 ArticleDaoImpl類的getRootArticle(int startIndex, int maxResults)這個方法來得到需要展示的帖子,返回的值是一個裝了 Article類型的 List只要遍歷這個 List我們就能取出每一條帖子了。 SessionFactory sf = ()。()。 list = (startIndex).setMaxResults(maxResults).list()。 ()。return list。然后在 通過 遍歷 %if(rootarticles!=null) { for(Article a : rootarticles) { % 來取得每條帖子的內(nèi)容將他們展示在 trtd之中就能完美的解決分頁的問題。遞歸這個思想是很奇妙的思想,他雖然有時候只有幾段短短的代碼,卻能完成很多很難完成的任務(wù),編寫遞歸最重要的是找到程序的入口和停止遞歸的條件,我采用了如下設(shè)計 : public List getTreeArticles(Article article) { ArticleTree at = new ArticleTree()。 SessionFactory sf = ()。 ()。 for(Article a:(ListArticle)()) { (a)。 ().mit()。 ()。 } getTreeArticles(Article article)這個方法傳進(jìn)去的是主題帖的對象,返回的是所有這個主題帖的子帖的 List,當(dāng)然這個方法本身并沒有遞歸的思想在里面但是需要注意的是這個方法所調(diào)用的一個方法 tree( list, ar