=======用户登录
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,普通012. 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;