传智播客--itcastbbs(五)


(2009-04-28 22:39:16)
标签:

it

 

1. 主题列表的分页显示

 页码(当前页前后7页);总页数;总主题数;上一页;下一页;首页;尾页;
 跳转到指定的页码;go
 
 所有的信息都需要准备;
 当前显示页的主题信息:  
 
 1.1 简单地显示出页码的效果
   1,2,3 共3页,共54条记录 [首页][上一页][下一页][尾页]
   <inputtype="text"><inputtype="button"> 
 
 1.2 分析要实现上述效果,需要哪些?
    === 页码的显示
     <forEach begin="1"end="${titlePageNum}" var="i">
     </forEach>
  === 总页码数 ${titlePageNum}
  === 总记录数 ${titleItems}
  === 首尾页 ${i} 
   -----Forum.showForum 来准备所有的数据;增加一个页码参数
    /Forum.do?method=showForum&id=46&pageNum=${i} &{i}
    1,${currentPage+/-1}, ${totalPageNum}
   -----将上述所有关于页码的信息放在一个PageBean中
    page.items--- 主题数目;
    page.currentPage,page.totalPageNum
   -----写出PageBean : Page
    totalPageNum,totalItems, currentPageNum,items(这页的数据,List) 
    --===---后面增加
    pageSize---使用常量PAGE_SIZE或使用配置文件中参数,暂时先使用常量,放在PageBean中;   
   ----Forum.showForum
    获取参数,封装成PageBean    
    totalPageNum= (totalItems + pageSize - 1) / pageSize;
    
    每页的第一条记录
    firstResult= (pageNum-1) * pageSize;
   -----一般不在Action中运算Page, 在业务层中处理,修改了一个方法
    findTopicByForum
    PagefindTopicByForum( Forum forum, int pageNum); // 返回一页的数据
    在这里面完成刚才Action所分析的功能
    Action中之需要调用这个方法获取一个Page对象,并存入request即可;
   
    Service中需要2个数据,从DAO中获取
    (1)当前页的数据列表:List
    (2)总页数 -- 可以单独写一个DAO方法;也可以在(1)中返回这个数据;
    (3)使用(2)中第2中方法,需要将返回结果封装成对象:QueryResult
     Listitems, totalItems;
     并使用它们增加一个构造方法;
     这样进一步修改DAO.findTopicsByForum(Forumforum)
     返回值为这个QueryResult对象;
     注意返回总记录数时,先返回Number型,再转换为intValue
     因为驱动程序不同,可能返回的是long或int,但是他们都是Number;
    (4)修改DAO -> Service -> Action;
     主要修改Service中的代码并简单优化;
     Action增加对pageNum的异常处理
    (5)当前页码的处理
     颜色改变;加粗字体,不显示超链接
    (6)第一页不写上一页页;最后一页不显示下一页;
     currentPageNumgt1    显示上一页
     currentPageNumlt totalPageNum  显示下一页      
    (7)去第几页
     onclick="gotoPage(document.getElementByIdx('txtPageNum').value"
     functiongotoPage(pageNum) {
      window.location.href="/Forum?method=showForum&id=46&pageNum="+ pageNum;
       
    (8)对页码的判断
     放在PageBean中实现(课堂上没有完全实现,佟刚购物车有完整实现)
    (9)主题很多,导致页码很多,需要对页码进行分页处理;
     测试,for生成测试数据,为了获得效果:考虑3种情况
     (9.1)中间(前后的页码都>7)
     (9.2)前面(前面的页码<7)
     (9.3)后面(后面的页码<7) 
     
     totalPageNum> 15 时才需要;
     相当于对页码进行分页显示
     
     先考虑中间的情况;再考虑前面和后面的情况;
     先在jsp中实现,查看效果;
 ----------------------------------------------------------------------------------    
    (10)考虑如何显示分页的重用;
     通过include,但是里面有一些代码的变量不同?需要解决
     把这些放在一个page.jspf里面;
     让所有的超链接调用javascript:gotoPage(pageNum)这个函数;
     
     补充:这里写了太多对页码的判断的jstl代码,可以的话,放在PageBean中写是否更好?
     
2. 发表文章,发表回复与引用文章;

 发表完文章后显示文章,显示一次主题
 
  2.1 发表主题
    (1)利用以前的测试代码;
     分析用户必须输入的,程序获取的;
     当前登录用户: Session中获取
      ==多个地方使用,放在父类中,Use getCurrentUser()
     所属的Forum: 表单中的forumId
     内容,标题,类型;
     IP地址:获取
     时间:当前时间
     ====考虑使用一个ActionForm与表单对应;
     先不考虑附件,等上述功能测试完毕,再考虑
   (2) jsp表单 article -addTopic.jsp
   标题,内容,类型;
    --处理:内容先用textarea,然后再用FckEditor;
    -- 类型:单选按钮,默认为普通,java代码中实现
    
   (3) Action ->Service -> DAO 更新相应的代码;
     测试代码
    完成发表帖子;
    没有检测未登录用户发表帖子;
   (4) 对文章的一些验证;
    --- 标题不能为空;
    --- 内容不能为空;
    --- 页面中增加错误提示信息;课堂上在最上端显示;最好在每个表单元素后面显示;
   (5) 显示主题内容 ---分页显示主题的文章列表,显示投票,显示附件;
    
    jsp ->Action.showTopic -> Service ->DAO
    
    技巧:将获取页码的代码抽取出来,放在父类中,protected;
    
    ===头像显示:
     ---onerror事件:
      ---显示头像出错时,选用默认头像;
      img.src= '<html:rewrite action="/.../.../*.jpeg" ';
 
 
 注意: 通用分页的实现思路;
 --------------------------------
 下午内容:
  附件, 投票;
  
 关于附件:
  可以上传多个附件,每个附件都有一个文件说明。附件在显示文章时显示。

  1,上传同名的文件,则后上传文件的会覆盖已经上传的同名文件;
    且中文文件名可能会出现问题。
  2,一个目录下放了很多文件, 则打开的速度就会很慢,应分类存放。
  3,文件路径问题, 应使用相对路径。
  4,控制文件的大小,超过限制的不能上传。 
  
 以前的解决方案(张孝祥提供) 
  1. UUID
  2. 文件保存目录打散;
   
    
 ------------------------------------------------------
 多个附件上传
 1. 附件在Article中用什么变量?在jsp中如何表示?
  --- 使用List,Set,不好处理
  --- 使用2个Map
 
   一个技巧:
   Map类型的属性的处理:
   增加setFile/getFile,setDesc/getDesc,对单个文件和描述处理 
   setXX将对象加入到相应的Map中去;
   jsp中就可以使用XX属性;
    
   ----- jsp
   <input type="file"name="file(key)" value="" />
    file - 属性名;key - Map的key
  
   -----测试,Action中打印出2个Map对象,查看结果是否正常;
   ----- Action中处理每个附件
    for (Stringkey : articleForm.getFiles().keySet())
    getFiles().get(key);
    getDescs().get(key);
    
   -----使用文章和附件的级联关系保存和删除附件;
   这里需要改造Attachment.hashCode()方法;
    原因:瞬时状态的附件的id都为0,Hibernate把他们当成一个对象;
   必须修改他们的hashCode方法,
    id==0?super(hashCode) : id;
    
   ----- 将附件保存到服务器上
  
   ----- 整理保存附件的方法:saveAtachment;
   增加异常的处理;
   把这个方法放在一个新类ArticleUtil中,使用静态方法;
    
   保留了原始的文件名,UUID新文件名可以不保留原始扩展名;
   UUID生成的文件名中没有中文。
    
   附件保存附件的是绝对路径, 必须使用相对路径;
    basePath :基准路径;
    returnPath :保存文件的相对路径
    
   打散文件夹的思路:
    (1)/upload/2009/04/21/.....
    或(2)/upload/2009/04/21/ -> 超过100个文件再新建文件夹;
    newSimpleDateFormat("yyyy/MM/dd/").format(new Date());
   basePath;
   subPath;
   newFileName;
      
    
   控制上传文件的大小
    (1)Struts1.2的缺点:(所以不使用)
    不能回显;
    设置了整个请求实体的大小,而不是单个文件的大小;
    (2)自己控制
    ActionForm.Validate中校验
     FormFile.FileSize
    
    
   发表主题后完毕后返回到当前主题下:还得重定向(否则刷新后就提交了)
   应该转到目标Action,而不是jsp页面;这样才有准备数据放在
   request中;
   有些参数不是很好放在Action的forward中,在程序中处理
   ActionForward af2 = newActionForward(af.getPath+"&id="+topic.getId(),af.getRedirect());
   不能使用原有的ActionForward,setPath,
    
   也有办法使用setPath,需要设置一些参数;
    
    
   ==showTopic时,对viewCount加1;
    浏览主题,加1;
    
   ==每个主题:页码数目>1,显示分页信息
    
    --textarea,script不能使用/>结束,必须使用成对的;
    <textarea></textarea>正确
    <textarea/>         错误;
    
    ==fckeditor;
    --引入文件<head><script...></head>
    -- new FCKeditor( name);  //这个元素的name属性request.getParameter(name);
    -- basePath; //editor所在的目录(可能有误,查看说明)
    -- Create() /ReplaceTextarea();
    == 再配置一下:
    --将文件夹fckeditor放在WebRoot下;
    -- 使用绝对路径引入;
    --<srcipt..>代码片段放在<html:textarea>后面;  
    
    
    ==动态添加删除附件;
    -- Js实现;
    -- div,document.getElementByIdx(id).innerHTML;
    --添加的时候增加index,区别每组附件上传的元素
    
     
    
 2.2 发表回复;
 
  == 基本代码实现,与发表回复类似;
   需要在ActionForm中增加部分属性;
   需要在jsp页面中删除部分表单元素;
   附件的上传代码与发表主题类似,需要放入到父类处理;
   由于之前将附件与主题关联,需要修改部分代码,让附件与article关联;
   
   == 开发技巧:
   开发前,用简单的测试代码,测试成功后,以后再加入到代码将大大节省时间;
    
   == 对于每个修改的页面,Action, Service,DAO进行检查测试;
  
  
 2.3 引用文章:
 
  == 引用: 超级链接
   js:toQuote(143);
   引用主题与回复;
   
  == addReplyUI
   Stringcontent = article.getAuthor().getNickName() + "说:" + content;
     articleForm.setContent(...);
     引用文章时,需要增加一个参数,表示应用的是主题还是回复;Topic/Reply
     
  == 引用样式
  
  ==注意不是每个回复会使用引用,没有引用的回复就会没有某些参数
 
  == 编辑区需要制定样式
   保证编辑和显示的结果一样,
   指定fckeditor的样式;fckeditor.css中修改;


posted on 2011-11-26 00:07  Code大蛇丸  阅读(222)  评论(0编辑  收藏  举报