• 传智播客itcastbbs(一)(图文)



    这2天一直在讲itcastbbs,下面是我通过课堂整理的笔记。这是汤老师带就业班的第一个项目——itcastbbs,下面是课堂上对项目的架构、主要实现及实现过程中的常见问题做的总结。

    按用户:匿名用户,普通用户,斑竹,管理员;

    功能分析:

    匿名用户:
     主页:分类与版面;两级的分类与多级分类;
     最新推荐;
     页眉页脚(统一);
     
     
    1.开发步骤:


     (1). 环境的搭配
       Struts1.2(jar,xml);
        cn.itcast.bbs.web.struts
       jstl1.1;
       Hibernate3(jar,xml);
    以下是搭建截图:  
    移除src文件夹,重新创建新的

    以下是:strus1.2配置

     


    Hibernate配置:

    粘贴到项目文件夹 里的 WEB-INF 的 lib文件夹中


    (2). 源码分类

       src/java      ----   java 源码
       src/config.files   ---- 配置文件
       test/java    ----   测试案例



       
    (3). 文档
       doc
     
     
     
     2. 版面管理模块



    新建分类  Categrory.java


    配合UML图 边写代码 养成好习惯。。



    包结构为cn.itcast.bbs.*。见下图:

    实体类:


      版面与分类:增删改查 DispatchAction
      (1) 实体设计:
      2个实体(版面与分类),1个实体(2个实体合1,增加字段区分)都可以
       -- Category,Forum;
       --关系:1:n
       -- 属性
       --映射文件;
      (2) DAO


         -- 层与层之间调用使用接口;
         -- CategoryDAO, ForumDAO
         -- CategoryDAO的方法: 
          save, delete, update, get, find/find
       --ForumDAO也有这样的接口方法;-- 增加父接口GenericDao
       --增加父接口GenericDao<T>:参数类型Object,还可以使用泛型;
       --原有的接口extends GenericDAO
       -- 编码:
        GenericDAO  - cn.itcast.bbs.dao.base
        Category    - cn.itcast.bbs.dao
        Forum       - cn.itcast.bbs.dao
       -- DAO的实现cn.itcast.bbs.dao.impl
        ForumDAOImpl
        CategoryDAOImpl
        ==sessionFactory 暂时每个dao管理自己的
        == 未完成的操作:UnsupportedOperationException
       --使用JUnit4测试每个DAOImpl方法
      测试Forum实体时遇到一个问题:无论单向还是双向关联Category,如果想保存forum对象,ForumDAOImpl.save的方法都出错;
        因为无法知道如何调用save(Category)的方法,只好手工new一个CategoryDAOImpl来显式保存;
       --通过写ForumDAOImpl, CategoryDAOImpl 这2个实现类,发现代码重复比较多;---- 解决方法:
        再做一个GenericDAOImplimplements GenericDAO;ForumDAOImpl和CategoryDAOImpl extendsGenericDAOImpl implements XXXDAOImpl;
        GenericDAOImpl中使用泛型:
         a.GenericDAOImpl<T> implementsGenericDAO<T>;
         b.protected Class<T> clazz;子类Construtor(无参数)--这个参数必须要,在父类中一个有参数的,这样子类必须有,否则容易忘记;
         c.HQL : from clazz.getName();
        对于Session:GenericDAOImpl 单独使用getSession来获取;(保证所有的session)
         ===配置  <propertyname="current_session_context_class">thread</property>
         ===util.HibernateSessionFactory
         ===HibernateSessionFactory.getSession();
       --单元测试;
        @Before-- 任何方法执行之前执行;
        @After -- 任何方法执行之后执行;
        上面两个注解减少了代码  
        
      (3) 版面有关的功能分析:
       --版面有关功能分析;
        list- addUI - add
        list- editUI - edit
        list- delete
        list- changeOrder(up or down)
        3个jsp页面
       -- Action分析
        ==CategoryActionextends DispatchAction
         ==== unspecified 方法 :default; 默认抛出异常;重写; <actionparamter="method"..>
         ==== (unspecified),(addUI, add), (editUI, edit), (delete),(changeOrder);
         ==== 3个jsp页面: list.jsp, add.jsp, edit.jsp
       --业务方法分析
        ==CategoryService
         ==== findAll() upspecified - 根据实际情况不分页了
         ==== addCategory(Category) add
         ==== getCategory(id) editUI 
         ==== updateCategory(Category) edit
         ==== delCategory(id) delete
         ==== changeOrder(id, isUp) changeOrder
       -- 编码
        ==CategoryAction extends DispatchAction
         ====unspecified  列表
         ====execute  
           ====== addUI
           ====== add
           ====== editUI
           ====== edit
           ====== delete
           ====== changeOrder
         ====先写出方法;
        ==CategoryService Interface
         ====findAll
         ====addCategory(Category)
         ====getCategory(id)
         ====updateCategory(Category)
         ====delCategory(id)
         ====changeOrder(id, isUp)
        ==添加CategoryAction的映射
         ====DispatchAction parameter="method"
         ====为了搭配环境,与上述Action方法的forward对应
         ====jsp页面分类
          ======WEB-INF/pages/category下3个页面
             list.jsp, add.jsp, edit.jsp
        ==实现Action的各个方法;
         ====unspecified 和 list.jsp
         ====addUI 和 add.jsp 准备一个FormBean: CategoryForm
          详细分析add模块
          ======对FormBean的处理:
           ========validate="false";
           ========自己写的方法调用validate,自己来验证FormBean
        ==不要在代码中new 实现类
         Service调用DAO时
        ==练习:
         a.list.jsp中显示categories;
         b.add.jsp中的表单和显示错误信息(如果有);
         c.CategoryForm.validate方法与客户端验证;
          验证规则:名字不能为空(有效字符>0,不能使空白字符)
         d.用Filter统一管理事务:在chainFilter()之前打开,之后关闭
          FilterName:OpenSessionFilter  
        ==冲突:
         Struts  beanUtils
         Hibernate collections
         Spring解决了这个问题,直接复制Spring里面的jar包
        ==CreateQuery需要事物
         请求来的时候打开,返回时关闭;使用Filter;
         
       用html:submit/html:text无法使用js的id;

    由于代码太多就不附上了。这个就是汤老师给我们思路。


  • 相关阅读:
    快速找到由程序员到CTO发展道路上的问路石
    从大师身上反思
    你真的了解企业虚拟化吗?
    “驱网核心技术丛书”创作团队访谈
    程序员到CTO需要准备什么
    深入搜索引擎的关键——索引
    程序员到CTO必须注意的几个关键点
    微软全球MVP教你如何规划程序人生
    “碟中碟”虚拟光驱软件开发者——万春 读《寒江独钓——Windows内核安全编程 》有感
    常用jar包之commonscollection使用
  • 原文地址:https://www.cnblogs.com/firecode/p/2460938.html
Copyright © 2020-2023  润新知