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