传智播客--itcastbbs(一)(图文)
2011-11-25 23:59
162 查看
这2天一直在讲itcastbbs,下面是我通过课堂整理的笔记。这是汤老师带就业班的第一个项目——itcastbbs,下面是课堂上对项目的架构、主要实现及实现过程中的常见问题做的总结。
按用户:匿名用户,普通用户,斑竹,管理员;
功能分析:
![](http://hi.csdn.net/attachment/201111/29/0_13225710220GfF.gif)
匿名用户:
主页:分类与版面;两级的分类与多级分类;
最新推荐;
页眉页脚(统一);
1.开发步骤:
![](http://hi.csdn.net/attachment/201111/29/0_1322570836Cg5Z.gif)
(1). 环境的搭配
Struts1.2(jar,xml);
cn.itcast.bbs.web.struts
jstl1.1;
Hibernate3(jar,xml);
以下是搭建截图:
移除src文件夹,重新创建新的
![](http://hi.csdn.net/attachment/201111/29/0_1322572247Da7H.gif)
![](http://hi.csdn.net/attachment/201111/29/0_1322572504hH5G.gif)
以下是:strus1.2配置
![](http://hi.csdn.net/attachment/201111/29/0_1322573671jjDh.gif)
![](http://hi.csdn.net/attachment/201111/29/0_1322573882169G.gif)
Hibernate配置:
![](http://hi.csdn.net/attachment/201111/29/0_13225740927Vsh.gif)
粘贴到项目文件夹 里的 WEB-INF 的 lib文件夹中
(2). 源码分类
src/java ---- java 源码
src/config.files ---- 配置文件
test/java ---- 测试案例
(3). 文档
doc
2. 版面管理模块
![](http://hi.csdn.net/attachment/201111/29/0_1322586775TZ3S.gif)
![](http://hi.csdn.net/attachment/201111/29/0_1322586795VJwZ.gif)
新建分类 Categrory.java
![](http://hi.csdn.net/attachment/201111/29/0_1322587237XJ4I.gif)
配合UML图 边写代码 养成好习惯。。
![](http://hi.csdn.net/attachment/201111/29/0_1322590930t9I2.gif)
包结构为cn.itcast.bbs.*。见下图:
![](http://img542.ph.126.net/Vt-VS-bZl-jUG3zXzMOmbw==/2663879179590686826.jpg)
实体类:
![](http://img104.ph.126.net/baJzquWqHtANLaqUSkU5Qg==/2035064081619571620.jpg)
版面与分类:增删改查 DispatchAction
(1) 实体设计:
2个实体(版面与分类),1个实体(2个实体合1,增加字段区分)都可以
-- Category,Forum;
--关系:1:n
-- 属性
--映射文件;
(2) DAO
![](http://hi.csdn.net/attachment/201112/1/0_1322759620cK59.gif)
-- 层与层之间调用使用接口;
-- 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;
由于代码太多就不附上了。这个就是汤老师给我们思路。
按用户:匿名用户,普通用户,斑竹,管理员;
功能分析:
![](http://hi.csdn.net/attachment/201111/29/0_13225710220GfF.gif)
匿名用户:
主页:分类与版面;两级的分类与多级分类;
最新推荐;
页眉页脚(统一);
1.开发步骤:
![](http://hi.csdn.net/attachment/201111/29/0_1322570836Cg5Z.gif)
(1). 环境的搭配
Struts1.2(jar,xml);
cn.itcast.bbs.web.struts
jstl1.1;
Hibernate3(jar,xml);
以下是搭建截图:
移除src文件夹,重新创建新的
![](http://hi.csdn.net/attachment/201111/29/0_1322572247Da7H.gif)
![](http://hi.csdn.net/attachment/201111/29/0_1322572504hH5G.gif)
以下是:strus1.2配置
![](http://hi.csdn.net/attachment/201111/29/0_1322573671jjDh.gif)
![](http://hi.csdn.net/attachment/201111/29/0_1322573882169G.gif)
Hibernate配置:
![](http://hi.csdn.net/attachment/201111/29/0_13225740927Vsh.gif)
粘贴到项目文件夹 里的 WEB-INF 的 lib文件夹中
(2). 源码分类
src/java ---- java 源码
src/config.files ---- 配置文件
test/java ---- 测试案例
(3). 文档
doc
2. 版面管理模块
![](http://hi.csdn.net/attachment/201111/29/0_1322586775TZ3S.gif)
![](http://hi.csdn.net/attachment/201111/29/0_1322586795VJwZ.gif)
新建分类 Categrory.java
![](http://hi.csdn.net/attachment/201111/29/0_1322587237XJ4I.gif)
配合UML图 边写代码 养成好习惯。。
![](http://hi.csdn.net/attachment/201111/29/0_1322590930t9I2.gif)
包结构为cn.itcast.bbs.*。见下图:
![](http://img542.ph.126.net/Vt-VS-bZl-jUG3zXzMOmbw==/2663879179590686826.jpg)
实体类:
![](http://img104.ph.126.net/baJzquWqHtANLaqUSkU5Qg==/2035064081619571620.jpg)
版面与分类:增删改查 DispatchAction
(1) 实体设计:
2个实体(版面与分类),1个实体(2个实体合1,增加字段区分)都可以
-- Category,Forum;
--关系:1:n
-- 属性
--映射文件;
(2) DAO
![](http://hi.csdn.net/attachment/201112/1/0_1322759620cK59.gif)
-- 层与层之间调用使用接口;
-- 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;
由于代码太多就不附上了。这个就是汤老师给我们思路。
相关文章推荐
- 传智播客--itcastbbs(一)(图文)
- 传智播客--itcastbbs(三)
- 传智播客--itcastbbs(四)
- 传智播客--itcastbbs(四)
- 传智播客--itcastbbs(五)
- 传智播客--itcastbbs(五)
- 传智播客--itcastbbs(六)
- 传智播客--itcastbbs(六)
- 传智播客--itcastbbs(二)
- 传智播客--itcastbbs(二)
- 传智播客--itcastbbs(三)
- http://bbs.itcast.cn/thread-15273-1-1.html?from=gkk
- 传智播客itcastTMS系统测试随笔——
- myeclipse中出现 org.hibernate.MappingException: Unknown entity: cn.itcast.hibernate.domain.User
- 祭奠IT导师--张孝祥(传智播客创始人)
- 传智播客趣IT,有情趣的IT平台
- 传智播客助力一带一路IT人才培养
- 传智播客免费IT学习资源站-视频库隆重上线
- .WebDelegatingSubject cannot be cast to cn.itcast.bos.domain.system.User
- 传智播客bbs项目,jstl的几个标签