zoukankan      html  css  js  c++  java
  • 传智播客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中修改;


  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/firecode/p/2460934.html
Copyright © 2011-2022 走看看