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

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

功能分析:传智播客--itcastbbs(一)(图文)

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

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

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

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

以下是:strus1.2配置

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

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


Hibernate配置:

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

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


(2). 源码分类

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



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

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

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



新建分类  Categrory.java

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


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

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


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

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

实体类:

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

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

传智播客--itcastbbs(一)(图文)
     -- 层与层之间调用使用接口;
     -- 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

相关文章: