J2EE课程设计实训项目《BBS论坛系统》——针对项目中系统管理员信息的数据访问组件及单元测试(第1部分)

合集下载

J2EE Struts框架课程设计实训项目《BBS论坛系统》构建系统数据库连接组件及对应的单元测试用例(第3部分)

J2EE Struts框架课程设计实训项目《BBS论坛系统》构建系统数据库连接组件及对应的单元测试用例(第3部分)

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建系统数据库连接组件及对应的单元测试用例(第3/4部分)1.1.1应用观察者模式重构(Refactor)系统中的日志处理功能实现1、什么是重构?为什么要重构?----改进?如何重构?---利用IDE工具实现2、观察者模式(1)什么是观察者模式(2)应用的目的:将日志记录功能从业务类或者DAO类中分离出来,减少“重复”!(3)编程实现的方法1)采用观察者模式实现----如何编程实现2)采用Spring框架中AOP(面向切面(方面)编程)技术3、改进ConnectDBBean和DBCPConnectDBBean、ConnectDBFactory等类中“藕合”有日志处理功能实现下面以DBCPConnectDBBean类为例说明,如何具体地应用观察者模式重构系统中的日志处理功能实现。

对于ConnectDBBean类和ConnectDBFactory类的修改,基本相同。

4、定义被观察者----也就是数据库连接类(ConnectDBBean或者DBCPConnectDBBean)该类作为被观察者类,应该继承于java.util 包中的Observable类package com.px1987.webbbs.dao;import java.sql.Connection;import java.sql.SQLException;import java.util.Observable;import mons.dbcp.BasicDataSource;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.exception.WebBBSException;public class DBCPConnectDBBean extends Observable implements ConnectDBInterface { String JDBC_DBDriver= null;String JDBC_URL = null;String dbUserName=null;String dbUserPassWord=null;String dbcp_maxActive=null;private java.sql.Connection con = null;BasicDataSource oneDataSourceImple=null;public DBCPConnectDBBean() throws WebBBSException {JDBC_DBDriver = ClassNameConfig.getProperty("JDBC_DBDriver");JDBC_URL = ClassNameConfig.getProperty("JDBC_URL");dbUserName = ClassNameConfig.getProperty("dbUserName");dbUserPassWord = ClassNameConfig.getProperty("dbUserPassWord");dbcp_maxActive = ClassNameConfig.getProperty("dbcp_maxActive");oneDataSourceImple=new BasicDataSource();oneDataSourceImple.setDriverClassName(JDBC_DBDriver);oneDataSourceImple.setUrl(JDBC_URL);oneDataSourceImple.setUsername(dbUserName);oneDataSourceImple.setPassword(dbUserPassWord);//最大的连接数目oneDataSourceImple.setMaxActive(Integer.parseInt(dbcp_maxActive));oneDataSourceImple.setDefaultAutoCommit(true);try {con=oneDataSourceImple.getConnection();}catch (java.sql.SQLException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点this.notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地连接数据库并且出现SQLException");}}public void closeDBCon() throws WebBBSException {try{con.close();con = null;}catch (SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点this.notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地关闭数据库连接");}}public Connection getConnection() throws WebBBSException {return con;}}5、定义观察者类的接口(1)添加观察者类LogObserver的接口ExceptionLogInterface包名称为com.px1987.webbbs.util(2)设计该接口package com.px1987.webbbs.util;public interface ExceptionLogInterface {public void logInfo(String logInfoText);}6、添加观察者类(1)该类实现java.util包中的Observer接口和前面的ExceptionLogInterface接口,并且对异常进行观察。

J2EE Struts框架课程设计实训项目《BBS论坛系统》——在项目中应用Hibernate中的监听器和拦截器等组件技术

J2EE Struts框架课程设计实训项目《BBS论坛系统》——在项目中应用Hibernate中的监听器和拦截器等组件技术

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——在项目中应用Hibernate中的监听器和拦截器等组件技术1.1.1应用Hibernate中的监听器(事件)1、Hibernate中的监听器(1)主要的作用该事件系统可以用来替代拦截器,也可以作为拦截器的补充来使用;而且Session接口的每个方法都有相对应的事件。

比如 LoadEvent,FlushEvent等等(可以查阅XML配置文件的DTD,以及org.hibernate.event包来获得所有已定义的事件的列表)。

因此,可以应用Hibernate中的监听器来生成审计日志,审计主要是对数据库中重要数据的更新历史进行记录。

数据库系统所提供的触发器技术也可以用于生成审计日志,但是它不支持跨数据库平台,所以一般用Hibernate中的监听器。

(2)org.hibernate.event包中所定义的各个事件类(3)事件的产生和激活当某个方法被调用时,Hibernate Session会生成一个相对应的事件并激活所有配置好的事件监听器。

系统预设的监听器实现的处理过程就是被监听的方法要做的(被监听的方法所做的其实仅仅是激活监听器,“实际”的工作是由监听器完成的)。

当然,开发者也可以自由地选择实现一个自己定制的监听器(比如,实现并注册用来处理处理LoadEvent的LoadEventListener接口),来负责处理所有的调用Session的load()方法的请求。

(4)对事件监听器的编程要求事件监听器应该被看作是单例(singleton)对象,也就是说,所有同类型的事件的处理共享同一个事件监听器实例,因此在事件监听器类中不应该保存有任何状态(也就是不应该使用成员变量)。

(5)事件监听器的编程方法1)用户定制的监听器应该实现与所要处理的事件相对应的接口,或者从一个合适的基类继承(甚至是从Hibernate自带的默认事件监听器类继承)。

J2EE课程设计及项目实训教学中的项目需求分析——《BBS论坛系统》的需求说明

J2EE课程设计及项目实训教学中的项目需求分析——《BBS论坛系统》的需求说明

J2EE课程设计及项目实训教学中的项目需求分析——《BBS论坛系统》的需求说明1.1.1BBS论坛需求说明1、该网站建设包含以下子系统2、用户脚色划分(1)普通用户普通用户以游客身份登录,只具有察看帖子的功能,不能留言。

(2)注册用户具备普通用户所有的能力。

并且是已经注册了的用户,可以登录、修改个人信息,并且可以发表留言。

(3)管理员管理员登录以后可以对论坛系统进行管理,包括论坛的基本信息、用户设置,还可以修改管理员密码。

3、前台服务系统修改帖子(from Use Case View)3.1、注册主要是指除管理员以外的用户角色,在网上在线填写一些会员的注册信息。

注册后即可成为BBS论坛会员。

会员注册信息如下:注册确认用户通过网上在线注册后,由系统管理员收集相应的资料,核实后,进行用户注册确认,确认后用户成为会员正式生效,可以享受网站提供的各种服务。

3.2、登录用户输入登录信息,如用户名、密码、验证码,以会员的身份进入本论坛。

或者以游客身份登录,不需要输入任何信息即可。

3.3、修改信息会员登录成功后,可以修改自己的信息,如密码等。

3.4、留言管理会员有发布,回复帖子的功能。

但只有注册并且登录成功的会员才具有这一功能。

会员可以修改自己的留言和查看、删除、自己的帖子。

4、后台管理系统(1)各个子模块(2)系统管理员及其职责5、后台管理系统系统管理员登陆: 系统管理员提交用户名和密码,系统验证用户名和密码的合法性,系统显示系统管理员管理页面(包含管理员的信息)6、论坛基本信息管理:对网站参数、通行证设置、COOKIE设置、公告设置进行管理。

7、管理用户:管理员设置一些用户的信息,如:用户权限、封锁用户、用户级别设置等等。

8、发帖设置:对用户的帖子设置、上传文件设置、全文检索设置、缓存设置进行管理。

J2EE课程设计实训项目《BBS论坛系统》——重构基于Hibernate框架数据库连接方式并进行单元测试(第1部分)

J2EE课程设计实训项目《BBS论坛系统》——重构基于Hibernate框架数据库连接方式并进行单元测试(第1部分)

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——重构基于Hibernate框架的数据库连接方式并进行单元测试(第1/2部分)1.1.1Hibernate中的各种数据库连接池的支持类1、org.hibernate.connection.DriverManagerConnectionProvider(1)主要的作用DriverManagerConnectionProvider 类是Hibernate系统中内带的数据库连接池的实现类,并且DriverManagerConnectionProvider类继承了ConnectionProvider接口,主要是使用用户提供的JDBC驱动程序及与数据库有关的各种连接参数来连接数据库,或者使用连接池的方式来连接数据库。

(2)DriverManagerConnectionProvider这个类只是初始化了最基本的连接配置1)hibernate.connection.driver_class(JDBC驱动类)2)hibernate.connection.pool_size(连接池容量的上限数目)3)hibernate.connection.autocommit(允许被缓存的JDBC连接开启自动自动提交)4)hibernate.connection.isolation(设置JDBC事务隔离级别,可查看java.sql.Connection来了解各个值的具体意义,但请注意多数数据库都不支持所有的隔离级别,取值1,2,4,8)。

因此,无论你是使用JDBC还是使用连接池方式,这几个最基本的设置都是要先初始化的。

其中pool_size的默认值为20。

2、org.hibernate.connection.DatasourceConnectionProvider它通过JNDI的方式来查找数据源来获得连接。

3、org.hibernate.connection.C3P0ConnectionProvider对C3P0连接池的支持类。

《J2EE系统架构和程序设计》课程设计实训项目——基于SSH架构的BBS网上论坛系统需求规格说明书

《J2EE系统架构和程序设计》课程设计实训项目——基于SSH架构的BBS网上论坛系统需求规格说明书

《J2EE系统架构和程序设计》课程设计实训项目——基于Struts +Spring +Hibernate架构的BBS网上论坛系统需求规格说明书1.1.1引言1、目的本文档作为BBS的需求说明文档,用于与用户确定最终的目标,并成为协议文本的一部分,同时也是本系统设计人员的基础文档。

2、背景BBS论坛,或者称为社区,是电子商务网站中一种常见功能,也是互联网上一种极为常见的互动交流服务。

它为上网用户提供了也各自由的讨论区。

通过论坛可以向用户提供开放性的分类专题讨论区服务,同时注册的用户可以根据需要在论坛上发表文章,交流技术经验,或者提出问题并表达自己的观点。

不仅如此,上网的用户还可以在论坛中看到他人发表的文章,并且能够对该文章进行评论。

一般情况下,BBS按不同主题分为多个布告栏,其设立多是依据使用者的要求和喜好,但多具有信件交流、软件交流、信息发布等功能。

目前,大部分BBS由教育机构、研究机构或商业机构管理,大多有自己的拨入电话号码,用户只需电脑、调制解调器和电话线就可通过电话拨号登录BBS站点。

3、定义(1)GB:中华人民共和国国家标准的英文缩写字母(2)构件:具有某种功能的可重用的软件模版单元,表示了系统中主要的计算元素和数据存储。

(3)逻辑视图:描述支持系统的功能需求的视图。

(4)开发视图:也称模块视图,主要侧重于软件模块的组织和管理描述。

(5)BBS:Bulletin Board Service4、参考资料(1)J2EE项目实训Hibernate框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(2)J2EE项目实训Spring框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(3)J2EE项目实训UML及设计模式(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社 2008 年5月(4)J2EE项目实训Struts框架技术(21世纪高等学校实用软件工程教育规划教材)杨少波编著清华大学出版社2008 年10月(5)《精通Struts设计与开发》作者:孙卫琴电子工业出版社(6)《Spring从入门到精通》作者:郭锋清华大学出版社(7)《Hibernate开发技术祥解》作者:孙卫琴电子工业出版社(8)《J2EE应用开发技术祥解》作者:刘晓华电子工业出版社(9)《设计模式》作者:Erich Gamma等机械工业出版社1.1.2任务概述1、目标一个典型的网上论坛BBS系统一般都应该提供诸如:会员管理、论坛分类主题管理、论坛文章管理、论坛公告管理等功能,同时也因该为论坛的管理人员,例如:版主、网页维护人员提供后台管理功能,包括删除一些文章、发布论坛公告等。

基于J2EE Web组件技术的课程设计实训项目——《BBS论坛系统》——解决系统中如何防止SQL注入的技术问题

基于J2EE Web组件技术的课程设计实训项目——《BBS论坛系统》——解决系统中如何防止SQL注入的技术问题

基于J2EE Web组件技术的课程设计实训项目——《BBS论坛系统》——解决系统中如何防止SQL注入的技术问题1.1.1解决系统中如何防止SQL注入的技术问题1、SQL 注入式攻击概述(1)SQL 注入式攻击SQL 注入式攻击是将其他的(恶意的)SQL 代码传递到某个应用程序中的行为,该代码通常被附加到该应用程序包含的合法SQL 代码中。

所有SQL 数据库都在不同程度上容易遭受SQL 注入式攻击,下面主要以SQL Server 数据库作为示例数据库来说明上述问题。

用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

系统将出现下面的错误提示(2)SQL 注入式攻击出现的场合当处理作为SQL 命令组成部分的用户输入时,应当特别注意可能发生的SQL 注入式攻击。

如果您的身份验证方案用于为SQL 数据库验证用户(比如,您对SQL Server 使用表单身份验证),则必须防止SQL 注入式攻击。

如果您使用未筛选的输入构建SQL 字符串,则应用程序可能会遭受恶意用户输入(注意,千万不要信任用户输入)的攻击。

危险在于,当您将用户输入插入一个将要成为可执行语句的字符串中时,恶意用户可以利用转义符将SQL 命令附加到您想用的SQL 语句中。

(3)SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看系统日志的习惯,可能被入侵很长时间都不会发觉。

2、应用示例下面的代码片段使用 SQL Server 中的某个数据库中的userInfo数据库表来说明 SQL 注入式攻击的示例。

(1)问题当我们将用户输入或其他未知数据添加到数据库SQL查询语句中时,我们的应用程序会很容易受到 SQL 注入式攻击。

(2)出现的方式例如,下面的两个代码片段都容易遭受攻击。

1)使用未筛选的用户输入来构建SQL 语句"Select * FROM userInfo where userID ='" + authorID + "'"2)通过构建单个字符串来调用存储过程,该字符串包含未筛选的用户输入"userInfoStoredProcedure(" + authorID + ")"(3)SQL 脚本注入式攻击的剖析当在应用程序中接受未筛选的用户输入值(见上文)时,恶意用户可以使用转义符来添加他们自己的命令。

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建控制层中实现BBS信息管理的Action类

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建控制层中实现BBS信息管理的Action类1.1.1添加实现BBS信息管理的Action类1、用户信息管理的Action类BBSManagerAction(1)设置其配置参数1)/bbsManagerAction2)org.apache.struts.actions.DispatchAction3)com.px1987.webbbs.action.BBSManagerAction4)bbsInfoActionForm5)/showValidatorError.do(2)在parameter中输入action(3)最后将产生出下面的状态2、编程该Action类package com.px1987.webbbs.action;import java.io.UnsupportedEncodingException; import java.util.ArrayList;import java.util.Date;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.actions.DispatchAction;import com.px1987.webbbs.actionform.BBSInfoActionForm;import com.px1987.webbbs.constant.WebBankAllConstants;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.model.BBSInfoManageInterface;import com.px1987.webbbs.model.BBSInfoVO;import com.px1987.webbbs.model.BBSReplyInfoVO;import com.px1987.webbbs.model.BBSTitleVO;import erInfoManageInterface;import erInfoVO;public class BBSManagerAction extends DispatchAction {BBSInfoManageInterface bbsInfoManagerBean=null;UserInfoManageInterface userInfoManageBean=null;public BBSManagerAction(){//本构造方法是在利用Spring IOC获得目标对象时被应用super();}/*String bbsInfoManageBeanClassName=null;String userInfoManageBeanClassName=null;public BBSManagerAction() throws WebBBSException{//本构造方法是在利用可配置化的工厂时被应用super();newUserAndBBSManageBean();}public void newUserAndBBSManageBean() throws WebBBSException{bbsInfoManageBeanClassName=ClassNameConfig.getProperty("bbsInfoManageImple.className");bbsInfoManagerBean=BBSInfoManageFactory.newBBSInfoManageBean(bbsInfoManageBeanClassName);userInfoManageBeanClassName=ClassNameConfig.getProperty("userInfoManageImple.className");userInfoManageBean=UserInfoManageFactory.newUserInfoManageBean(userInfoManageBeanClassName);}*/public void setBbsInfoManagerBean(BBSInfoManageInterface bbsInfoManagerBean) { this.bbsInfoManagerBean = bbsInfoManagerBean;}public void setUserInfoManageBean(UserInfoManageInterface userInfoManageBean) { erInfoManageBean = userInfoManageBean;}public ActionForward goSendOrPreView(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ActionForward targetActionForward=null;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int preViewState =Integer.parseInt((String)bbsInfoActionForm.get("preViewState"));switch(preViewState) {case 0:targetActionForward=goSendOneBBSInfo(mapping, form,request, response);break;case 1:targetActionForward=goPreViewOneBBSInfo(mapping,form,request, response);break;}return targetActionForward;}public ActionForward goSendOneBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {boolean OkOrNot = false;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));String userID =(String)bbsInfoActionForm.get("userID");String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText"); String bbsAuther =(String) bbsInfoActionForm.get("bbsAuther");String mailtoAuthorString=(String)bbsInfoActionForm.get("mailtoAuthor"); if(mailtoAuthorString==null||mailtoAuthorString.equals("")) {mailtoAuthorString ="0";}int mailtoAuthor =Integer.parseInt(mailtoAuthorString);String bbsTypeIDString=(String)bbsInfoActionForm.get("bbsTypeID");if(bbsTypeIDString==null||bbsTypeIDString.equals("")){bbsTypeIDString ="0";}int bbsTypeID = Integer.parseInt(bbsTypeIDString);String bbsSubject =(String) bbsInfoActionForm.get("bbsSubject");String bbsAbstractText =(String) bbsInfoActionForm.get("bbsAbstractText"); String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsIconID =Integer.parseInt(bbsIconIDString);String bbsMessage =(String) bbsInfoActionForm.get("content");java.util.Date rightNow=new java.util.Date();String sendInfoTime=rightNow.toLocaleString();String lastUpdateTime=sendInfoTime;int replay=0;int hits=0;BBSInfoVO oneBbsInfoVO = new BBSInfoVO();Date nowDate=new Date();//不需要设置该值,可以由Hibernate自动来实现添加oneBbsInfoVO.setBbsID((int)nowDate.getTime());oneBbsInfoVO.setBbsTitleID(bbsTitleID);oneBbsInfoVO.setAuthor(bbsAuther);oneBbsInfoVO.setMailto(mailtoAuthor);oneBbsInfoVO.setBbsTypeID(bbsTypeID);oneBbsInfoVO.setTitle(bbsSubject);oneBbsInfoVO.setAbstractText(bbsAbstractText);oneBbsInfoVO.setBbsIconID(bbsIconID);oneBbsInfoVO.setContent(bbsMessage);oneBbsInfoVO.setSendInfoTime(sendInfoTime);oneBbsInfoVO.setLastUpdateTime(lastUpdateTime);oneBbsInfoVO.setReplay(replay);oneBbsInfoVO.setHits(hits);oneBbsInfoVO.setUserID(userID);oneBbsInfoVO.setBbsID((int)new Date().getTime());// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try{OkOrNot = bbsInfoManagerBean.doSaveBBSInfo(oneBbsInfoVO);}catch(WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}if (!OkOrNot) {request.setAttribute("errorText", "您的BBS留言信息没有正确地被保存!");return mapping.findForward("showWebAppError");}//***发表成功时,重新获得该分类中的各个BBS信息并跳转到显示该分类的页面中******* ArrayList allBBSInfoVOList = null;int totalBBSInfoCounter, totalBBSInfoPageCounter;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try { //获得总数totalBBSInfoCounter = bbsInfoManagerBean.doGetPageTotalBBSInfoCounterByTitleID(bbsTitleID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}int currentPage = 1; //当前正在显示的页数目int firstResult = (currentPage - 1) * WebBankAllConstants.objectCounterPerPageDigit; //根据当前的页数计算出的开始的行号(从0 计数)totalBBSInfoPageCounter = (totalBBSInfoCounter +WebBankAllConstants.objectCounterPerPageDigit - 1) /WebBankAllConstants.objectCounterPerPageDigit;int actualHotBBSCounterPerPageDigit=WebBankAllConstants.hotBBSCounterPerPageDigit;if (totalBBSInfoCounter < WebBankAllConstants.hotBBSCounterPerPageDigit){ actualHotBBSCounterPerPageDigit = totalBBSInfoCounter;}try {allBBSInfoVOList =bbsInfoManagerBean.doGetPageBBSInfoByTitleID(bbsTitleID,firstResult,actualHotBBSCounterPerPageDigit);}catch (WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}// 下面的代码是获得该分类的完整信息(也包括版主信息)BBSTitleVO oneBBSTitleVO = null;try {oneBBSTitleVO =bbsInfoManagerBean.doGetBBSTitleInfoByTitleID(bbsTitleID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("allBBSInfoVOList", allBBSInfoVOList);request.setAttribute("bbsTitleID", bbsTitleID);request.setAttribute("bbsTitleText", bbsTitleText);System.out.println("bbsTitleText="+bbsTitleText);request.setAttribute("oneBBSTitleVO", oneBBSTitleVO);request.setAttribute("totalBBSInfoPageCounter",new Integer(totalBBSInfoPageCounter).toString());request.setAttribute("currentPage", new Integer(currentPage).toString());//发表成功,则跳转到“BBS某个分类”显示页中return mapping.findForward("showAllBBSInClass");}public ActionForward goPreViewOneBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));String userID =(String)bbsInfoActionForm.get("userID");String bbsAuther =(String) bbsInfoActionForm.get("bbsAuther");String mailtoAuthorString=(String)bbsInfoActionForm.get("mailtoAuthor");if(mailtoAuthorString==null||mailtoAuthorString.equals("")) {mailtoAuthorString ="0";}int mailtoAuthor =Integer.parseInt(mailtoAuthorString);String bbsTypeIDString=(String)bbsInfoActionForm.get("bbsTypeID");if(bbsTypeIDString==null||bbsTypeIDString.equals("")){bbsTypeIDString ="0";}int bbsTypeID = Integer.parseInt(bbsTypeIDString);String bbsSubject =(String) bbsInfoActionForm.get("bbsSubject");String bbsAbstractText =(String) bbsInfoActionForm.get("bbsAbstractText"); String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsIconID =Integer.parseInt(bbsIconIDString);String bbsMessage =(String) bbsInfoActionForm.get("content");String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText"); java.util.Date rightNow=new java.util.Date();String sendInfoTime=rightNow.toLocaleString();String lastUpdateTime=sendInfoTime;int replay=0;int hits=0;BBSInfoVO oneBbsInfoVO = new BBSInfoVO();oneBbsInfoVO.setBbsTitleID(bbsTitleID);oneBbsInfoVO.setAuthor(bbsAuther);oneBbsInfoVO.setMailto(mailtoAuthor);oneBbsInfoVO.setBbsTypeID(bbsTypeID);oneBbsInfoVO.setTitle(bbsSubject);oneBbsInfoVO.setAbstractText(bbsAbstractText);oneBbsInfoVO.setBbsIconID(bbsIconID);oneBbsInfoVO.setContent(bbsMessage);oneBbsInfoVO.setSendInfoTime(sendInfoTime);oneBbsInfoVO.setLastUpdateTime(lastUpdateTime);oneBbsInfoVO.setReplay(replay);oneBbsInfoVO.setHits(hits);oneBbsInfoVO.setUserID(userID);oneBbsInfoVO.setBbsID((int)new Date().getTime());/** 注意:由于在“在线编辑器”中已经将字符进行转换,所以不再需要进行转换oneBbsInfoVO.setContent(TransferSpecialCharToHTMLEntity.FilterCharToHTMLEntity(oneBbsInfoVO.getContent()));oneBbsInfoVO.setAbstractText(TransferSpecialCharToHTMLEntity.FilterCharToHTMLEntity(oneBbsInfoVO.getAbstractText()));*/request.setAttribute("oneBBSInfoVO",oneBbsInfoVO);// ******************下面的代码是根据userID获得该留言者的其它信息**** UserInfoVO oneUserInfoVO=null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try {oneUserInfoVO=userInfoManageBean.doGetOneRegisterUserInfo(oneBbsInfoVO.getUserID());}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("userImage", oneUserInfoVO.getUserImage());request.setAttribute("userID", new Integer(oneUserInfoVO.getId()).toString());return mapping.findForward("showPreViewTopic");}public ActionForward goReplyOrPreView(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {ActionForward targetActionForward=null;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int preViewState =Integer.parseInt((String)bbsInfoActionForm.get("preViewState"));switch(preViewState) {case 0:targetActionForward=goReplyOneBBSInfo(mapping, form,request, response);break;case 1:targetActionForward=goPreViewReplyBBSInfo(mapping,form,request, response);break;}return targetActionForward;}public ActionForward goReplyOneBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {boolean OkOrNot = false;BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));int userID =Integer.parseInt((String)bbsInfoActionForm.get("userID"));String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText");int bbsID =Integer.parseInt((String)bbsInfoActionForm.get("bbsID"));String author =(String) bbsInfoActionForm.get("bbsAuther");String replyTitle =(String)bbsInfoActionForm.get("bbsSubject");String abstractText =(String)bbsInfoActionForm.get("bbsAbstractText");String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsReplyIconID =Integer.parseInt(bbsIconIDString);String content =(String)bbsInfoActionForm.get("content");java.util.Date rightNow=new java.util.Date();String replytime=rightNow.toLocaleString();BBSReplyInfoVO oneBBSReplyInfoVO=new BBSReplyInfoVO();oneBBSReplyInfoVO.setId(new Integer((int)new Date().getTime()));oneBBSReplyInfoVO.setBbsID(bbsID);oneBBSReplyInfoVO.setAuthor(author);oneBBSReplyInfoVO.setContent(content);oneBBSReplyInfoVO.setReplytime(replytime);oneBBSReplyInfoVO.setAbstractText(abstractText);oneBBSReplyInfoVO.setReplyTitle(replyTitle);oneBBSReplyInfoVO.setBbsReplyIconID(bbsReplyIconID);// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try{OkOrNot = bbsInfoManagerBean.doSaveBBSReplyInfo(oneBBSReplyInfoVO);}catch(WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}if (OkOrNot){//回复成功,则跳转到“显示某个BBS信息”显示页中BBSInfoVO oneBBSInfoVO = null;ArrayList allBBSReplyInfoListByOneBBS = null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try {oneBBSInfoVO = bbsInfoManagerBean.doGetOneBBSInfoByBBSID(bbsID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}//获得该BBS的各个回复的ArrayList对象allBBSReplyInfoListByOneBBS = oneBBSInfoVO.getAllBBSReplyInfoList();request.setAttribute("oneBBSInfoVO", oneBBSInfoVO);request.setAttribute("allBBSReplyInfoListByOneBBS",allBBSReplyInfoListByOneBBS);request.setAttribute("bbsTitleText",bbsTitleText);// **********下面的代码是根据userID获得该留言者的其它信息********UserInfoVO oneUserInfoVO=null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try {oneUserInfoVO=userInfoManageBean.doGetOneRegisterUserInfo(oneBBSInfoVO.getUserID());}catch (WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("userImage", oneUserInfoVO.getUserImage());return mapping.findForward("showOneBBSInfo");}else {request.setAttribute("errorText", "您的BBS回复信息没有正确地被保存!");return mapping.findForward("showWebAppError");}}public ActionForward goPreViewReplyBBSInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {BBSInfoActionForm bbsInfoActionForm = (BBSInfoActionForm) form;int bbsTitleID =Integer.parseInt((String)bbsInfoActionForm.get("bbsTitleID"));String userID =(String)bbsInfoActionForm.get("userID");String bbsTitleText =(String) bbsInfoActionForm.get("bbsTitleText");int bbsID =Integer.parseInt((String)bbsInfoActionForm.get("bbsID"));String author =(String) bbsInfoActionForm.get("bbsAuther");String replyTitle =(String)bbsInfoActionForm.get("bbsSubject");String abstractText =(String)bbsInfoActionForm.get("bbsAbstractText");String bbsIconIDString=(String)bbsInfoActionForm.get("bbsIconID");if(bbsIconIDString==null||bbsIconIDString.equals("")){bbsIconIDString ="0";}int bbsReplyIconID =Integer.parseInt(bbsIconIDString);String content =(String)bbsInfoActionForm.get("content");try{/**由于bbsTitleText参数是通过get方法传递来的,因此ActionServlet无法进行正确递编码转换,需要手动转换*/bbsTitleText=new String(bbsTitleText.getBytes("ISO-8859-1"),"gb2312");author=new String(author.getBytes("ISO-8859-1"),"gb2312");replyTitle=new String(replyTitle.getBytes("ISO-8859-1"),"gb2312");abstractText=new String(abstractText.getBytes("ISO-8859-1"),"gb2312");content=new String(content.getBytes("ISO-8859-1"),"gb2312");}catch (UnsupportedEncodingException e) {request.setAttribute("errorText", "在BBSManagerAction类中goPreViewReplyBBSInfo方法出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}java.util.Date rightNow=new java.util.Date();String replytime=rightNow.toLocaleString();BBSReplyInfoVO oneBBSReplyInfoVO=new BBSReplyInfoVO();oneBBSReplyInfoVO.setId(new Integer((int)new Date().getTime()));oneBBSReplyInfoVO.setBbsID(bbsID);oneBBSReplyInfoVO.setAuthor(author);oneBBSReplyInfoVO.setContent(content);oneBBSReplyInfoVO.setReplytime(replytime);oneBBSReplyInfoVO.setAbstractText(abstractText);oneBBSReplyInfoVO.setReplyTitle(replyTitle);oneBBSReplyInfoVO.setBbsReplyIconID(bbsReplyIconID);request.setAttribute("oneBBSReplyInfoVO",oneBBSReplyInfoVO);// ****************下面的代码是根据userID获得该回复者的其它信息********** UserInfoVO oneUserInfoVO=null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例try{oneUserInfoVO=userInfoManageBean.doGetOneRegisterUserInfo(userID);}catch (WebBBSException e) {request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());return mapping.findForward("showWebAppError");}request.setAttribute("userImage", oneUserInfoVO.getUserImage());request.setAttribute("userID", new Integer(userID).toString());return mapping.findForward("showPreViewReplyTopic");}}3、添加与该Action类相关的Forward。

J2EE课程设计实训项目——《BBS论坛系统》——实现项目中的数据库连接组件及对应的单元测试用例(第1部分)

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的数据库连接组件及对应的单元测试用例(第1/4部分)1.1.1构造基于JDBC技术实现的数据访问层中的数据库连接组件1、添加一个属性配置文件 classNameConfig.properties(1)为什么要采用配置文件?作用是什么?----灵活地满足变化!如何对配置文件中的项目进行读写?(2)在项目中添加属性配置文件 classNameConfig.properties目前的内容如下JDBC_DBDriver= com.mysql.jdbc.DriverJDBC_URL = jdbc:mysql://localhost:3306/bbsdatabasedbUserName=rootdbUserPassWord=rootdbcp_maxActive=10dbcp_maxActive=10connectDBBean.className=com.px1987.webbbs.dao.ConnectDBBean注意:也可以采用XML形式的配置文件。

3、添加一个获得配置属性的类ClassNameConfig(1)类名称为ClassNameConfig,包名称为com.px1987.webbbs.config(2)代码如下package com.px1987.webbbs.config;import java.util.Properties;import java.io.*;public class ClassNameConfig {public ClassNameConfig() {}private static Properties props=null;static {props= new Properties();try{InputStream input =Thread.currentThread().getContextClassLoader().getResource("classNameConfig.properties").openStream();props.load(input);}catch(Exception e){e.printStackTrace();}}public static String getProperty(String propName){return props.getProperty(propName);}public static void setProperty(String propName,String propValue){ props.setProperty(propName, propValue);}}其中的getResourceAsStream方法是查找具有给定名称的资源,返回 InputStream对象;而getResource方法是查找带有给定名称的资源路径。

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——测试项目中对DWR框架应用的效果(第1部分)

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——测试项目中对DWR框架应用的效果(第1/2部分)1.1.1测试项目中对DWR框架和Spring相互整合后的结果1、在线测试前面的各个与DWR框架相关的配置是否正常(1)部署本系统并启动服务器(Tomcat服务器最好为Tomcat5.5以上版)(2)进入DWR的在线测试状态输入http://localhost:8080/WebBBS/dwr后能够看到我们前面的两个业务功能组件的本地化的结果,其中有一个对象为来自于Spring的IOC容器。

(3)点击上面的业务功能组件的超链接(比如userInfoManageDWRMediatorBean),将能够看到下面的状态内容以后需要应用该业务功能组件时,我们只需要在页面中包含各个*.js文件的说明。

<script type='text/javascript'src='/WebBBS/dwr/interface/userInfoManageDWRMediatorBean.js'></script><script type='text/javascript' src='/WebBBS/dwr/engine.js'></script><script type='text/javascript' src='/WebBBS/dwr/util.js'></script>(4)可以在线测试1)测试前台用户的合法性输入用户名称为admin(数据库表中实际存在的用户名称),并且用户的类型为1(表示为前台用户)后。

将出现下面的结果----返回为true,表明我们的业务类中的方法已经正确地被远程化了!同时在数据库表中该用户的名称是存在的,因此DWR的功能应该是正常的。

J2EE Struts框架课程设计实训项目《BBS论坛系统》构建系统数据库连接组件及对应的单元测试用例(第1部分)

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建系统数据库连接组件及对应的单元测试用例(第2/4部分)1.1.1对前面的ConnectDBBean组件进行单元测试(JUnit Test)1、单元测试(1)单元测试有关的概念(2)为什么要应用它(3)如何应用它2、添加一个测试项目----测试项目和被测试项目应该分离!(1)添加一个Java测试项目(2)项目的名称为TestWebBBS(3)最后为下面的状态3、添加对应用项目的引用4、添加测试用例(TestCase)类(测试类)(1)添加测试用例:什么是测试用例?编程要点?(2)添加Junit的系统包(3)设置测试用例类测试用例类名称为TestConnectDBBean类,包名称为com.px1987.webbbs.daotest,被测试的目标程序类选择为com.px1987.webbbs.dao.ConnectDBBean。

(4)选择被测试的方法4、编程该测试用例类(1)类的代码package com.px1987.webbbs.daotest;import junit.framework.TestCase;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.dao.*;import java.sql.*;import com.px1987.webbbs.exception.*;import com.px1987.webbbs.util.*;public class TestConnectDBBean extends TestCase {ConnectDBInterface connectDBBean=null;String connectDBBeanClassName=null;protected void setUp() throws Exception {super.setUp();connectDBBeanClassName=ClassNameConfig.getProperty("connectDBBean.className");connectDBBean=ConnectDBFactory.newConnectDBBean(connectDBBeanClassName);}protected void tearDown() throws Exception {connectDBBean=null;super.tearDown();}public void testCloseDBCon() throws WebBBSException {connectDBBean.closeDBCon();Connection returnDBCon=connectDBBean.getConnection();this.assertNull(returnDBCon); //断言}public void testGetConnection() throws WebBBSException {Connection returnDBCon=connectDBBean.getConnection();this.assertNotNull(returnDBCon); //断言}}注意:也可以采用的是JUnit4.0系统库,现在改变为“Java标注”的方式实现---其中的@Before、@After和@Test等符号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
基于 J2EE Struts 框架的课程设计实训项目——《BBS 论坛系统》—— 针对系统后台管理员信息的数据访问组件及对应的单元测试(第 1/2 部分)
1.1.1 数据访问层(AdminUserInfo)的数据访问组件的程序实现 1、AdminUserManageDAOInterface 接口 (1)新建 AdminUserManageDAOInterface 接口
public interface AdminUserManageDAOInterface {
public ArrayList<String> selectAllAdminUserNameInfo(String adminException;
public ArrayList<AdminUserInfoPO> selectAllAdminUserInfo() throws
Connection con=null; ConnectDBInterface connectDBBean=null; String connectDBBeanClassName=null; /* 采用工厂方式实现时 */ public AdminUserManageDAOJDBCImple() throws WebBBSException{
(2)设计该接口(注意在该接口中对 Java 泛型的具体应用)
package com.px1987.webbbs.dao; import java.util.*;
杨教授大学堂,版权所有,盗版必究。 1/26 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
import com.px1987.webbbs.exception.WebBBSException;
WebBBSException;
public ArrayList<AdminUserInfoPO> selectSomeAdminUserInfo(String HQLSelect)
throws WebBBSException;
public ArrayList<AdminUserInfoPO> selectSomeAdminUserInfo(Map adminUserInfos)
throws WebBBSException;
public AdminUserInfoPO selectOneAdminUserInfo(String adminUserID) throws
WebBBSException;
public AdminUserInfoPO selectOneAdminUserInfoByName(String adminUserName)
WebBBSException;
}
2、为该 AdminUserManageDAOInterface 接口提供对应的功能实现类
(1)类名称为 AdminUserManageDAOJDBCImple,包名称为 com.px1987.webbbs.dao、并且
继承 Observable 类
杨教授大学堂,版权所有,盗版必究。 2/26 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
(2)编程该实现类
package com.px1987.webbbs.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator;
newPassWord) throws WebBBSException;
public boolean deleteOneAdminUserInfo(String adminUserID) throws
WebBBSException;
public boolean batchDeleteAdminUserInfo(ArrayList deletedUserIDs) throws
杨教授大学堂,版权所有,盗版必究。 3/26 页
杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料
import java.util.Map; import java.util.Observable; import com.px1987.webbbs.config.ClassNameConfig; import com.px1987.webbbs.exception.WebBBSException; import com.px1987.webbbs.util.ConnectDBFactory; import com.px1987.webbbs.util.LogInfoFactory; public class AdminUserManageDAOJDBCImple extends Observable implements AdminUserManageDAOInterface{
throws WebBBSException;
public
boolean
updateOneAdminUserInfo(AdminUserInfoPO
oneUpdatedAdminUserInfo) throws WebBBSException;
public boolean updateOneAdminUserPassWord(String adminUserID,String
throws WebBBSException;
public AdminUserInfoPO selectOneAdminUserInfoData(String userName, String
userPassWord) throws WebBBSException;
public boolean insertOneAdminUserInfo(AdminUserInfoPO oneAdminUserInfo)
相关文档
最新文档