传智播客itcastbbs(四)
=======用戶登錄
1. jsp文件:使用注冊剩下的部分;稍作修改;
增加checkbox:【7天自動登錄】
2. FormBean中沒有autoLogin屬性;
3. 寫Action.login
(3.1)UserService.getUserByLoginNameAndPassword
UserDAO.getUserByLoginNameAndPassword
(3.2)Session中設置user屬性為登錄的用戶實體對象;
(3.3) 注銷: 讓Session失效
(3.4)UserServiceImpl.getUserByLoginNameAndPassword
加密密碼;
(3.5)UserDAOImpl.getUserByLoginNameAndPassword
(3.5) 登錄測試完畢;
4. 實現自動登錄功能:
(4.1) 自動登錄的Cookie,
name=ItcastbbsAutoLogin;
什么時候產生并發送?
--在用戶登錄成功并選擇了自動登錄;
什么是否被刪除?
--在超過設置的maxAge時被刪除;
--在用戶注銷之后,也要被刪除;
什么時候被使用?
--有一個過濾器攔截每次請求。如果當前這個request所關聯的session
未登錄就會檢測這個AutoLoginCookie;
Cookie:
Cookie的value:userId_expriyTime_MD5(currentTime);
數據庫:userId_expriyTime_MD5(currentTime);
(4.2) 實現步驟
--從Cookie中取出value, 從中取出用戶的id;
--根據userId取出數據庫中的autoLoginkey
--如果cookie.value與user.autoLoginKey相等,且未超出過期時間,就是登錄用戶;
==== 編碼實現
(4.3) Action.login
--生成autoLoginKey :
7* 24 * 3600 * 1000 + System.currentTime;
userId+ expiryTime + MD5(currentTime);
Keys: Word Completion
--發送AutoLoginCookie;
newCookie, setPath(), setMaxAge(), addCookie()
--數據庫中存一份autoLoginKey;
setAutoLoginKey(),updateUser()[update];
--logout
==Session失效
==刪除Cookie
(4.4)測試
通過httpwatch檢查cookie值
(4.5) 使用Filter檢測CheckAutoLoginFilter
/* ===攔截所有的請求
出現問題:
自動登錄也需要數據庫;
而此時事務還沒有打開,因為openSessionFilter是*.do
將兩個Filter增加對*.jsp和*.do的支持;
測試成功,并測試注銷功能;
(4.6) 顯示圖像:
// Tomcat -web.xml
response.setContentType("img/jpeg");//text/html;text/xml; img/jpeg;
response.getOutputStream().write();
flush(); //不用close
== jsp
---- html:img
(4.7) 大圖片的問題
如果圖片過大,顯示的時候圖片占用面積就大,需要壓縮;
工具類:
ImageUtils;及使用代碼;
將有關方法放在UserAction中;
????什么時候調用?沒有找到地方?。?!
文章管理模塊
1. 實體分析: 軟件的設計是漸進的,迭代的,循環的。
文章有關的實體:
幾個實體,主要屬性,實體之間的關系,與現有的實體之間的關系?
主題(,附件,投票),回復;
Article(id, author, content,postTime, ipAddr)
Topic(lastArticlePostTime,lastReply,title, type, forum, replyCount,viewCount)
, Reply(floor, topic, type,)
修改Forum增加了
topicCount,articleCount, lastTopic
理順現有實體之間的關系;
附件實體:Attachement(id, path,article, size, filename, description, downloadCount)
Article中增加了attchements:Set<Attachment>
2. 編寫實體類:
2.1 將實體寫成JavaBean;
2.2 寫完JavaBean后寫映射文件;
幾個需要注意的映射:
這兩個一對一,配置成基于外鍵的單向一對一
Forum.lastTopic - Topic
Topic.lastReply -Reply
其他的都可以配成雙向,可以根據需要;
用戶與文章: 單向;
版面與主題:單向;
Article.content需要使用大文本屬性;
練習:完成以上實體的映射文件并測試數據表的生成;
修改了一個實體,增加了4個
練習時,one-to-one
Forum.lastTopic
??? 使用many-to-one時:unique="true"值得思考,是否需要
如果多個Topic沒有回復,他們的lastReply=null,lastReplyId為空,這樣unique就不正確了???
3.1 Forum
lastTopic
<many-to-onename, columnn, unique>
3.2 Article
<setname="attachments">
<keycolumn="articleId" />
<one-to-manyclass="Attachment" />
</set>
many-to-one 實現基于外鍵的一對一映射;
3.3 Attachment
3.4 測試,并檢查表結構生成是否正確
步驟:
類圖 -> 實體-> hbm.xml -> 測試 ->檢查結構
-> DAO(basic)
4. DAO的聲明: 基本的增刪改查功能,繼承即可;
DAO -> DAOImpl
TopicDAO, ReplyDAO,AttachmentDAO
注意無參構造函數調用父類的構造函數,傳Class
5. 功能分析:
前臺版面列表;
單個版面顯示;
發表主題;
發表/引用回復;
列表的分頁顯示;
發表文章帶有多個附件;
6. 實現 前臺版面列表:
直接用現成的復制
forum -> front ->list
ForumAction. forumList
7. 實現 某個版面的列表 showForum
左側: 顯示分類和版面的列表;
右側:
上面: 版面信息;
下面:顯示主題列表
分頁顯示;
按公告,置頂,普通的文章的順序顯示
每個部分按最后文章發表的時間降序
8. 文章的顯示 showTopic
顯示主題信息;
顯示文章列表;
分頁顯示,按發表的順序排序,先發的在前面;
如果文章中有附件,顯示附件;
9. 回復:addReply
回復主題或引用文章;
發表完回復后顯示最后一頁,轉到回復主題的最后一頁;
10. 發表主題: addTopic
與addReply相似,內容實用fckeditor;
可以帶有多個附件,附件可以動態的添加與刪除;
11. 分析功能所需要的Action方法:
ForumAction forumList, showForum;
ArticleAction showTopic, addTopicUI,addTopic,addReplyUI, addReply
通過Action,分析Service中的方法;
一點技巧: 直接寫實現類,然后抽取成接口->
沒有實現的方法,拋出UnsupportedException;
帖子類型的常量定義
公告2,置頂1,普通0
12. addTopic
保存Topic;
級聯保存Attachments;
更新Topic的lastArticlePostTime;
Forum topicCount, articleCount;
Form lastTopic;
addReply
保存Topic;
計算并設置樓層;當前最后回復的樓層+1
級聯保存Attachments;
更新Topic的replyCount, lastReply
Forum的articleCount;
更新lastArticlePostTime;
=== 測試;
寫簡單的測試代碼JUit,查看效果;
=== 編碼過程中的一個錯誤
UserDAOImpl.getByLoginNameAndPassword
測試時,發現輸入的信息正常,剛注冊的一個用戶和密碼,總是獲取不到用戶和密碼;
如果使用list,總是返回n個null的列表;
原因: 改變了User的表id,以前是id,后來變成了userId;
總結
以上是生活随笔為你收集整理的传智播客itcastbbs(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java:数值-字符串转换(String
- 下一篇: 南笙的含义