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中修改;


  • 相关阅读:
    position : sticky
    学习笔记之段落里面最后出现省略号
    two or more web modules defined in the configuration have the same context root
    Android笔记:ActivitySpinner
    设计一个通讯录的XML文件
    使用JDBC连接SQL Server数据库
    SNMP使用UDP传送报文。为什么不使用TCP?
    计算Java程序运行时间
    android在xml的textStyle中,设置一个字体是粗体或斜体或带有下划线
    schema.xml文件里datatype的定义格式
  • 原文地址:https://www.cnblogs.com/firecode/p/2460934.html
Copyright © 2011-2022 走看看