传智播客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;

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


原文地址:https://www.cnblogs.com/firecode/p/2460938.html