• 传智播客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;


  • 相关阅读:
    现代程序设计 作业1
    现代程序设计课程简介
    ubuntu 下解决安装包依赖问题
    centos下安装nginx和php-fpm
    如何在本机上将localhost改为www.dev.com
    神器
    脚本监测 前十名磁盘空间用户的列表
    使用xml来显示获取的mysql数据
    linux使用脚本自动连接数据库
    shell script的连接符是逗号,不是英文的句号
  • 原文地址:https://www.cnblogs.com/firecode/p/2460935.html
Copyright © 2020-2023  润新知