J2EE项目实训Struts框架技术——第8章 重构和完善BBS论坛系统(第3部分)
- 格式:pdf
- 大小:413.17 KB
- 文档页数:15
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——对Struts中的Action组件类进行STC单元测试1.1.1对控制层中的各个Action类进行测试1、将Strutstest所需要的*.jar包加入到本测试项目中(1)将Strutstest所需要的*.jar包strutstest-2.1.3.jar文件加入到本测试项目中,定位到我们的目标*.jar包的目录下,最后将产生出下面的状态。
(2)将J2EE Web技术中所需要的Servlet和JSP的*.jar包加入当然也可以直接使用在Tomcat中带有的servlet-api.jar和jsp-api.jar文件。
(3)再添加commons-collections.jar包文件2、添加log4J的属性配置文件和对应的Jar包文件(1)添加log4J的属性配置文件(2)添加log4j的jar包文件3、在测试的Java项目中添加一个针对UserManagerAction类的TestCase类(1)TestCase类为MockStrutsTestUserManagerAction(2)类名称为MockStrutsTestUserManagerAction,包名称为com.px1987.webbbs.actiontest,基类选择为servletunit.struts.MockStrutsTestCase,被测试的类为erManagerAction(3)然后选择被测试的方法(4)最后产生出下面的状态package com.px1987.webbbs.actiontest;import servletunit.struts.MockStrutsTestCase;public class MockStrutsTestUserManagerAction extends MockStrutsTestCase { public MockStrutsTestUserManagerAction(String arg0) {super(arg0);}protected void setUp() throws Exception {super.setUp();}protected void tearDown() throws Exception {super.tearDown();}public void testGoUpdateAdminInfo() {fail("尚未实现");}public void testGoUpdateUserInfo() {fail("尚未实现");}public void testGoLoginOrGetPassWord() {fail("尚未实现");}public void testGoUserLogin() {fail("尚未实现");}public void testGoGetPassWord() {fail("尚未实现");}public void testGoUserRegister() {fail("尚未实现");}}(5)编程MockStrutsTestUserManagerAction程序类中的相关方法的功能实现package com.px1987.webbbs.actiontest;import servletunit.struts.MockStrutsTestCase;import junit.framework.*;import java.io.*;public class MockStrutsTestUserManagerAction extends MockStrutsTestCase { public MockStrutsTestUserManagerAction(String arg0) {super(arg0);}protected void setUp() throws Exception {super.setUp();}protected void tearDown() throws Exception {super.tearDown();}public void testGoUserLogin() {// 下面的目录路径根据实际的状态,修改为对应的内容setContextDirectory(new File("D:/aaa/StrutsWebBBS+Spring/WebBBS/WebRoot"));setConfigFile("/WEB-INF/struts-config_userManage.xml");setRequestPathInfo("/userManagerAction");addRequestParameter("formType","1");addRequestParameter("login_GetPassWord_ActionType","1");addRequestParameter("type_User_Admin","1");addRequestParameter("userName","admin");addRequestParameter("userPassword","admin");actionPerform();verifyForward("showAllBBSClassInfo");verifyNoActionErrors();}}4、由于erInfoActionForm类为DynaActionForm类并且对其进行validate需要在struts-config_userManage.xml文件中添加userName和userPassWord的初始值,否则validate不能通过。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建系统数据库连接组件及对应的单元测试用例(第4/4部分)1.1.1利用模板模式隔离和封装“数据库连接方式”的变化1、抽象类(1)什么是抽象类(2)抽象类的作用----作为“模板”(也可以采用接口来实现)(3)应用场合将“共性”实现在基类,而将“个性”功能由子类。
2、模板模式(1)什么是模板模式(2)为什么要应用它:减少代码的重复(3)如何应用(编程实现)3、问题的应用背景由于在本项目中可能会应用JDBC的直接连接、也可能会应用DBCP的连接或者应用JNDI 的数据库连接池技术,尽管它们的实现方法不同、但也有共性。
因此利用模板模式优化数据库连接组件以适应系统中的不同形式的数据库连接的需要。
它们的共性主要体现在下面的ConnectionDBBase类功能实现代码中的各个方法4、找出“变化(个性)”部分和“不变化(共性)”(“道”)不同的数据库系统以及不同的连接形式的差别在哪?将不变化部分加以封装到“共性”的方法,而将“变化”部分留给子类进行扩展实现。
5、设计模板类(1)ConnectionDBBase类,包名称为com.px1987.webbbs.dao,并且继承于Observable 类(继续能够应用观察者模式)、并且实现ConnectDBInterface(2)编程该ConnectionDBBase类package com.px1987.webbbs.dao;import java.sql.Connection;import java.sql.SQLException;import java.util.Observable;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.util.LogObserver;public abstract class ConnectionDBBase extends Observable implements ConnectDBInterface { protected java.sql.Connection con = null;protected static String JDBC_DBDriver=null;protected static String JDBC_URL=null;protected static String dbUserName=null;protected static String dbUserPassWord=null;protected static String dbcp_maxActive=null;/** 利用ClassNameConfig实现从属性文件中获得与数据库相关的连接信息**/static{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");}public ConnectionDBBase() throws WebBBSException{initDBConnection();}public abstract void initDBConnection() throws WebBBSException;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(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地关闭数据库连接");}}public Connection getConnection() throws WebBBSException {return con;}}(3)在模板类ConnectionDBBase中设计模板方法ConnectionDBBasepublic ConnectionDBBase() throws WebBBSException {initDBConnection();}public abstract void initDBConnection() throws WebBBSException;public void closeDBCon() throws WebBankException {}public Connection getConnection() throws WebBBSException {}(4)同时编程实现共性的方法closeDBCon和getConnection以减少子类中的重复实现(5)留出个性化的方法initDBConnection由子类进行扩展6、设计针对JDBC直接连接的子类ConnectDBBean在子类中只需要重写initDBConnection方法package com.px1987.webbbs.dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Observable;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.util.LogObserver;public class ConnectDBBean extends ConnectionDBBase implements ConnectDBInterface { public void initDBConnection() throws WebBBSException{try {Class.forName(JDBC_DBDriver);}catch (ng.ClassNotFoundException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点this.notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地加载JDBC驱动程序");}try {con = DriverManager.getConnection(JDBC_URL, dbUserName, dbUserPassWord);}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");}catch (NullPointerException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点this.notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地连接数据库并且出现NullPointerException");}}public ConnectDBBean() throws WebBBSException {super();}}7、设计针对DBCP方式的类DBCPConnectDBBean在子类中也只需要重写initDBConnection方法package com.px1987.webbbs.dao;import mons.dbcp.BasicDataSource;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.factory.LogInfoFactory;public class DBCPConnectDBBean extends ConnectionDBBase {static BasicDataSource oneDataSourceImple=null; //避免重复得对它进行对象实例化static{ //对DBCP的初始化方法之一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);}public void initDBConnection() throws WebBBSException{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 DBCPConnectDBBean() throws WebBBSException{super();}}8、再执行TestConnectDBBean以验证前面的重构的正确性。
基于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 Struts框架的课程设计实训项目——《BBS论坛系统》——在BBS论坛系统项目的表示层中应用EL和JSTL等技术的应用示例1.1.1在BBS论坛系统项目的表示层中应用EL技术1、EL表达式语言(1)主要的优点使用标签(Tag)和EL表达式语言的主要目的就是为了能够避免在JSP页面中出现过多的<% %>的语句,使页面与后台的Java代码相互分离。
应用表达式语言主要有以下几大好处:1)避免直接在页面中应用(MyClassType) request.getAttribute()和myEntityBean.getMyProperty()之类的脚本语句,从而能够使页面更加简洁;2)支持运算符(如+-*/),比普通的标签具有更高的应用自由度和更强的功能;3)简单明了地表达程序代码的逻辑,比直接使用脚本代码更可读与更便于维护。
(2)JSP2.0的一个主要的组件为支持EL的表达式语言因此,EL表达式语言可以直接在JSP页面中应用,而不需要引入任何其它的系统库包文件。
2、EL语言是JSTL输出(输入)一个JA V A表达式的表示形式。
在JSTL中,EL语言只能在属性值中使用;EL语言只能通过建立表达式${exp1}来进行调用。
在属性值中使用表达式有三种方式。
(1)value属性包含一个表达式<c:out value="${requestScope.errorText}" />在这种情况下,表达式值被计算出来并根据类型转换规则赋值给value属性。
上面的${requestScope.errorText}就是一个EL,它相当于JSP语句<%=request.getAttribute("errorText")%>。
(2)value属性包含一个或多个属性,这些属性被文本分割或围绕< c:out value="some${expr}${expr}text${expr}"/>在这种情况下,表达式从左到右进行计算,并将结果转换为字符串型(根据类型转换规则),并将结果赋值给value属性(3)value属性仅仅包含文本< c:out value="sometext"/>在这种情况下,字符串型属性value将根据类型转换规则转换为标签所希望的类型。
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 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 Struts框架的课程设计实训项目——《BBS论坛系统》——实现系统前台用户管理的DAO组件及对应的单元测试用例(第1/2部分)1.1.1系统前台用户管理的DAO组件的实现1、在项目中添加一个HibernateUtil类(1)类名称为HibernateUtil,包名称为com.px1987.webbbs.hibernatedao(2)编程该类package com.px1987.webbbs.hibernatedao;import org.hibernate.*;import org.hibernate.cfg.*;public class HibernateUtil {private static final SessionFactory sessionFactory;/* 静态初始器,当JVM(Java虚拟机)加载HibernateUtil类时,会执行该静态代码块。
*/static {try{ // Create the SessionFactorysessionFactory = newConfiguration().configure().buildSessionFactory();/*也可以采用下面的方式Configuration hibernateConfiguration=new Configuration();sessionFactory = hibernateConfiguration.configure().buildSessionFactory();*/}catch (Throwable ex){throw new ExceptionInInitializerError(ex);}}public static final ThreadLocal threadLocal = new ThreadLocal();public static Session currentSession() {Session currentSession = (Session) threadLocal.get();if (currentSession == null) {currentSession = sessionFactory.openSession();threadLocal.set(currentSession);}return currentSession;}//下面的方法是满足Hibernate中的拦截器组件的应用需要public static Session currentSession(Interceptor someOneInterceptor){ Session currentSession = (Session) threadLocal.get();if (currentSession == null){currentSession = sessionFactory.openSession(someOneInterceptor);threadLocal.set(currentSession);}return currentSession;}public static void closeSession(){Session currentSession = (Session) threadLocal.get();if (currentSession != null){currentSession.close();}threadLocal.set(null);}}2、针对UserManageDAOInterface的DAO接口提供一个实现类(1)类名称为UserManageDAOHibernateImple,包名称为com.px1987.webbbs.hibernatedao、并且继承Observable类(2)编程该实现类package com.px1987.webbbs.hibernatedao; import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Observable;import java.util.Set;import org.hibernate.Criteria;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.criterion.Expression;import org.springframework.dao.DataAccessException;import com.px1987.webbbs.config.ClassNameConfig;import erInfoBasePO;import erInfoPO;import erManageDAOInterface;import com.px1987.webbbs.exception.WebBBSException;import erInfoInterceptor;import com.px1987.webbbs.model.PageStateVO_Prototype;import com.px1987.webbbs.util.LogInfoFactory;public class UserManageDAOHibernateImple extends Observable implements UserManageDAOInterface {public UserManageDAOHibernateImple() {}public boolean batchDeleteUserInfo(ArrayList deletedUserIDs)throws WebBBSException {boolean OKOrNot=false;Session session=null;Transaction tx=null;Connection con=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();con=session.connection();// 下面的批处理是首先删除BBSInfoString deleteBBSInfoSql="delete from BBS where userID=?";java.sql.PreparedStatement pstmtBBSInfoDeleted =con.prepareStatement(deleteBBSInfoSql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);Iterator allBBSInfoDeletedItem=deletedUserIDs.iterator();while(allBBSInfoDeletedItem.hasNext()){String oneUserIDToDeleted=(String)allBBSInfoDeletedItem.next();pstmtBBSInfoDeleted.setString(1,oneUserIDToDeleted);pstmtBBSInfoDeleted.addBatch();}pstmtBBSInfoDeleted.executeBatch();// 下面的批处理是首先删除UserInfoString deleteUserInfoSql="delete from userInfo where userID=?";java.sql.PreparedStatement pstmtUserInfoDeleted =con.prepareStatement(deleteUserInfoSql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);Iterator allUserInfoDeletedItem=deletedUserIDs.iterator();while(allUserInfoDeletedItem.hasNext()){String oneUserIDToDeleted=(String)allUserInfoDeletedItem.next();pstmtUserInfoDeleted.setString(1,oneUserIDToDeleted);pstmtUserInfoDeleted.addBatch();}pstmtUserInfoDeleted.executeBatch();mit();OKOrNot=true;}catch (SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者tx.rollback();throw new WebBBSException("在UserManageDAOHibernateImple类中的batchDeleteUserInfo方法出现了HibernateException异常");}finally{/*try{con.close();}catch(SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地关闭数据库连接!,异常的详细内容为:"+e.getMessage());}*/HibernateUtil.closeSession();}return OKOrNot;}public boolean deleteOneUserInfo(String registerUserID)throws WebBBSException {boolean OKOrNot=false;Session session=null;Transaction tx=null;try{//没有应用Hibernate中的拦截器组件时// session = HibernateUtil.currentSession();session = HibernateUtil.currentSession(new UserInfoInterceptor());tx = session.beginTransaction();UserInfoPO oneUserTODeleted=(UserInfoPO)session.get(UserInfoPO.class,registerUserID);if(oneUserTODeleted==null){throw new WebBBSException("在数据库表中不存在指定userID="+registerUserID+"的数据顶目!");}session.delete(oneUserTODeleted);mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者tx.rollback();throw new WebBBSException("在UserManageDAOHibernateImple类中的deleteOneUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public UserInfoPO doGetMaxIDUserInfo() throws WebBBSException { boolean OKOrNot=false;Session session=null;Transaction tx=null;Connection con=null;ResultSet rs=null;UserInfoPO oneUserInfoPO=null;String select_SqlStatement=null;PreparedStatement pstmt =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();con=session.connection();select_SqlStatement="select * from userInfo";pstmt = con.prepareStatement(select_SqlStatement,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);rs=pstmt.executeQuery();if(st()){oneUserInfoPO=new UserInfoPO();oneUserInfoPO.setUserName(rs.getString("userName"));oneUserInfoPO.setUserPassWord(rs.getString("userPassWord"));oneUserInfoPO.setId(rs.getString("userID"));oneUserInfoPO.setUserType(rs.getInt("userType"));oneUserInfoPO.setAliaoName(rs.getString("aliaoName"));oneUserInfoPO.setPassWordAsk(rs.getString("passWordAsk"));oneUserInfoPO.setUserImage(rs.getString("userImage"));oneUserInfoPO.setRegisterTime(rs.getString("registerTime"));oneUserInfoPO.setPassWordAnswer(rs.getString("passWordAnswer"));oneUserInfoPO.setUserMail(rs.getString("userMail"));oneUserInfoPO.setUserSex(rs.getInt("userSex"));oneUserInfoPO.setUserBirthDay(rs.getString("userBirthDay"));oneUserInfoPO.setUserComeFrom(rs.getString("userComeFrom"));oneUserInfoPO.setUserResume(rs.getString("userResume"));oneUserInfoPO.setUserSign(rs.getString("userSign"));oneUserInfoPO.setEmailVisible(rs.getInt("emailVisible"));oneUserInfoPO.setAcceptAdvise(rs.getInt("acceptAdvise"));Map contactMethod = new HashMap();contactMethod.put("userQQCode", rs.getString("userQQCode"));contactMethod.put("userICQCode", rs.getString("userICQCode"));contactMethod.put("userMSNCode", rs.getString("userMSNCode"));oneUserInfoPO.setContactMethod(contactMethod);}else {oneUserInfoPO=null;}mit();}catch (SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的doGetMaxIDUserInfo方法出现了HibernateException异常");}finally{/*try{con.close();}catch(SQLException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("不能正确地关闭数据库连接!,异常的详细内容为:"+e.getMessage());}*/HibernateUtil.closeSession();}return oneUserInfoPO;}public boolean insertOneUserInfo(UserInfoPO oneRegisterUserInfo)throws WebBBSException {boolean OKOrNot=false;Session session=null;Transaction tx=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();/*注意:对于采用MS SQLServer2000的JDBC驱动程序则应该进行中文编码的转换,而采用JDTS则不需要,否则会出现中文乱码oneUserInfo.setUserName(new String(userName.getBytes("gb2312"),"ISO8859-1"));*/session.save(oneRegisterUserInfo);mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者tx.rollback();throw new WebBBSException("在UserManageDAOHibernateImple类中的insertOneUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public ArrayList<UserInfoBasePO> selectAllBaseUserInfo() throws WebBBSException { String HQLQuery="from erInfoBasePO";return selectSomeBaseUserInfo(HQLQuery);}public ArrayList<String> selectAllRegisterUserNameInfo(String userName)throws WebBBSException {ArrayList allRegisterUserNameInfos = new ArrayList();String HQLSelect="select erName from erInfoPO oneUserInfoPO where erName like '"+userName+"%'";/* 在此中查询中不能采用带参数的形式* String HQLSelect="select erName from erInfoPO oneUserInfoPO where erName like '?%'";**/List selectAllUserNamesResult =null;Session session=null;Transaction tx=null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query=session.createQuery(HQLSelect);selectAllUserNamesResult = query.list();Iterator allUserNameItem=selectAllUserNamesResult.iterator();while(allUserNameItem.hasNext()){String oneUserNameInfo=(String)allUserNameItem.next();allRegisterUserNameInfos.add(oneUserNameInfo);}mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectSomeBaseUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return allRegisterUserNameInfos;}public ArrayList<UserInfoPO> selectAllUserInfo() throws WebBBSException { String HQLQuery="from erInfoPO";return selectSomeUserInfo(HQLQuery);}public UserInfoPO selectOneUserInfo(String registerUserID)throws WebBBSException {UserInfoPO oneUserInfoPO=null;Session session=null;try{session = HibernateUtil.currentSession();oneUserInfoPO = (UserInfoPO) session.get(UserInfoPO.class,registerUserID);if(oneUserInfoPO==null) {throw new WebBBSException("在数据库表中不存在指定userID="+registerUserID+"的数据顶目!");}}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple的selectOneUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return oneUserInfoPO;}public UserInfoPO selectOneUserInfoByName(String userName)throws WebBBSException {UserInfoPO oneUserInfoPO=null;String HQLQuery="from erInfoPO as OneUserInfoPO where erName='"+userName+"'";ArrayList allUserInfoSameName=selectSomeUserInfo(HQLQuery);if(allUserInfoSameName.size()==0){oneUserInfoPO=null;return oneUserInfoPO;}oneUserInfoPO=(UserInfoPO)allUserInfoSameName.get(0); //取最前面的一位(因为要求在数据库表中不存在同名的两个用户)return oneUserInfoPO;}public UserInfoPO selectOneUserInfoData(String userName, String userPassWord)throws WebBBSException {/*UserInfoPO oneUserInfoPO=null;String HQLQuery="from erInfoPO where userName='"+userName+"' and userPassWord='"+userPassWord+"'";ArrayList allUserInfoPO=selectSomeUserInfo(HQLQuery);if(allUserInfoPO.size()==0){oneUserInfoPO=null;}oneUserInfoPO=(UserInfoPO)allUserInfoPO.get(0); //取最前面的一位(因为要求在数据库表中不存在同名的两个用户)return oneUserInfoPO;*/UserInfoPO oneUserInfoPO = null;Session session = null;try{session = HibernateUtil.currentSession();Criteria crit = session.createCriteria(UserInfoPO.class);crit.add(Expression.eq("userName", userName));crit.add(Expression.eq("userPassWord", userPassWord));oneUserInfoPO = (UserInfoPO) crit.uniqueResult();}catch (HibernateException e) {int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的SelectOneUserInfoData方法出现了HibernateException异常");}finally {HibernateUtil.closeSession();}return oneUserInfoPO;}public ArrayList<UserInfoBasePO> selectSomeBaseUserInfo(String HQLSelect)throws WebBBSException {ArrayList allUserInfos=new ArrayList();List selectAllPOResult =null;Session session=null;Transaction tx=null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();selectAllPOResult = session.createQuery(HQLSelect).list();Iterator allPOItem=selectAllPOResult.iterator();while(allPOItem.hasNext()){UserInfoBasePO oneBaseUserInfoPO=(UserInfoBasePO)allPOItem.next();allUserInfos.add(oneBaseUserInfoPO);}mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectSomeBaseUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return allUserInfos;}public ArrayList<UserInfoPO> selectSomeUserInfo(String HQLSelect) throws WebBBSException {ArrayList allUserInfos=new ArrayList();List selectAllPOResult =null;Session session=null;Transaction tx=null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query= session.createQuery(HQLSelect);query.setCacheable(true); //激活查询缓存//指定要使用的cacheRegion,可选query.setCacheRegion("erInfoPO");selectAllPOResult = query.list();Iterator allPOItem=selectAllPOResult.iterator();while(allPOItem.hasNext()){UserInfoPO oneUserInfoPO=(UserInfoPO)allPOItem.next();allUserInfos.add(oneUserInfoPO);}mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectSomeUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return allUserInfos;}public int selectTotalGeneralRegisterUserCounter(Map registerUserInfos) throws WebBBSException{String WhereString="";Set keySet=registerUserInfos.keySet();Iterator allMapKeys=keySet.iterator();while(allMapKeys.hasNext()) {String oneMapKey=(String)allMapKeys.next();WhereString=WhereString+" oneUserInfoPO."+oneMapKey+" like '%"+(String)registerUserInfos.get(oneMapKey)+"%' and ";}WhereString=WhereString.substring(0, WhereString.length()-5);String HQLSelect="select count(*) from erInfoPO as oneUserInfoPO where erType=1 and "+WhereString;int totalRegisterUserCounter;Session session=null;Transaction tx=null;Query query =null;try {session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(HQLSelect);Long objectCounter=(Long)query.uniqueResult(); //Hibernate3.2中为Integer类型totalRegisterUserCounter=objectCounter.intValue();mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectTotalRegisterUserCounter方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return totalRegisterUserCounter;}public int selectTotalVIPRegisterUserCounter(Map vipUserInfos) throws WebBBSException{String WhereString="";Set keySet=vipUserInfos.keySet();Iterator allMapKeys=keySet.iterator();while(allMapKeys.hasNext()) {String oneMapKey=(String)allMapKeys.next();WhereString=WhereString+" oneUserInfoPO."+oneMapKey+" like '%"+(String)vipUserInfos.get(oneMapKey)+"%' and ";}WhereString=WhereString.substring(0, WhereString.length()-5);String HQLSelect="select count(*) from erInfoPO asoneUserInfoPO where erType=2 and "+WhereString;int totalRegisterUserCounter;Session session=null;Transaction tx=null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(HQLSelect);Long objectCounter=(Long)query.uniqueResult(); //Hibernate3.2中为Integer类型totalRegisterUserCounter=objectCounter.intValue();mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectTotalRegisterUserCounter方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return totalRegisterUserCounter;}public int selectTotalRegisterUserCounter() throws WebBBSException {int totalRegisterUserCounter;Session session=null;Transaction tx=null;Query query =null;/** 注意:在Hibernate3.2中可以采用下面的方式String HQLQuery="select count(*) from erInfoPO as userInfoPO";**/String HQLQuery="select count(userInfoPO) from erInfoPO as userInfoPO";try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(HQLQuery);Long objectCounter=(Long)query.uniqueResult(); //Hibernate3.2中为Integer类型totalRegisterUserCounter=objectCounter.intValue();mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectTotalRegisterUserCounter方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return totalRegisterUserCounter;}public int selectTotalGeneralRegisterUserCounter() throws WebBBSException { int totalRegisterUserCounter;Session session=null;Transaction tx=null;Query query =null;/** 注意:在Hibernate3.2中可以采用下面的方式String HQLQuery="select count(*) from erInfoPO as userInfoPO";**/String HQLQuery="select count(*) from erInfoPO as oneUserInfoPO where erType=1";try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(HQLQuery);Long objectCounter=(Long)query.uniqueResult(); //Hibernate3.2中为Integer类型totalRegisterUserCounter=objectCounter.intValue();mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectTotalRegisterUserCounter方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return totalRegisterUserCounter;}public int selectTotalVIPRegisterUserCounter() throws WebBBSException {int totalRegisterUserCounter;Session session=null;Transaction tx=null;Query query =null;/** 注意:在Hibernate3.2中可以采用下面的方式String HQLQuery="select count(*) from erInfoPO as userInfoPO";**/String HQLQuery="select count(*) from erInfoPO as oneUserInfoPO where erType=2";try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(HQLQuery);Long objectCounter=(Long)query.uniqueResult(); //Hibernate3.2中为Integer类型totalRegisterUserCounter=objectCounter.intValue();mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectTotalRegisterUserCounter方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return totalRegisterUserCounter;}public ArrayList<Object[]> selectUserSomePropertyInfo(String HQLSelect)throws WebBBSException {ArrayList allUserPropertyInfoArrays=new ArrayList();List selectAllPropertyResult =null;Session session=null;Transaction tx=null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query= session.createQuery(HQLSelect);query.setCacheable(true); //激活查询缓存//指定要使用的cacheRegion,可选query.setCacheRegion("erInfoPO");selectAllPropertyResult = query.list();Iterator allPOPropertyItem=selectAllPropertyResult.iterator();while(allPOPropertyItem.hasNext()){Object[] oneUserPOPropertyInfo=(Object[])allPOPropertyItem.next();allUserPropertyInfoArrays.add(oneUserPOPropertyInfo);}mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在UserManageDAOHibernateImple类中的selectUserSomePropertyInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return allUserPropertyInfoArrays;}public ArrayList<UserInfoPO> selectSomeRegisterUserInfo(Map registerUserInfos) throws WebBBSException{ArrayList allRegisterUserInfoPO=null;String WhereString="";Set keySet=registerUserInfos.keySet();Iterator allMapKeys=keySet.iterator();while(allMapKeys.hasNext()) {String oneMapKey=(String)allMapKeys.next();WhereString=WhereString+" oneUserInfoPO."+oneMapKey+" like '%"+(String)registerUserInfos.get(oneMapKey)+"%' and ";}WhereString=WhereString.substring(0, WhereString.length()-5);String HQLSelect="from erInfoPO as oneUserInfoPO where erType=1 and "+WhereString;allRegisterUserInfoPO=selectSomeUserInfo(HQLSelect);return allRegisterUserInfoPO;}public ArrayList<UserInfoPO> selectSomeVIPUserInfo(Map vipUserInfos) throws WebBBSException{ArrayList allRegisterUserInfoPO=null;String WhereString="";Set keySet=vipUserInfos.keySet();Iterator allMapKeys=keySet.iterator();while(allMapKeys.hasNext()) {String oneMapKey=(String)allMapKeys.next();WhereString=WhereString+" oneUserInfoPO."+oneMapKey+" like '%"+(String)vipUserInfos.get(oneMapKey)+"%' and ";}WhereString=WhereString.substring(0, WhereString.length()-5);String HQLSelect="from erInfoPO as oneUserInfoPO where erType=2 and "+WhereString;allRegisterUserInfoPO=selectSomeUserInfo(HQLSelect);return allRegisterUserInfoPO;}public boolean updateOneUserInfo(UserInfoPO oneUpdatedRegisterUserInfo) throws WebBBSException {boolean OKOrNot=false;Session session=null;Transaction tx=null;UserInfoPO oneUserInfoPO=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();oneUserInfoPO = (UserInfoPO) session.get(UserInfoPO.class, oneUpdatedRegisterUserInfo.getId());if(oneUserInfoPO==null) {throw new WebBBSException("在数据库表中不存在指定userID="+oneUpdatedRegisterUserInfo.getId().toString()+"的数据顶目!");}oneUserInfoPO.setAliaoName(oneUpdatedRegisterUserInfo.getAliaoName());oneUserInfoPO.setPassWordAnswer(oneUpdatedRegisterUserInfo.getPassWordAnswer());oneUserInfoPO.setPassWordAsk(oneUpdatedRegisterUserInfo.getPassWordAsk());oneUserInfoPO.setUserImage(oneUpdatedRegisterUserInfo.getUserImage());oneUserInfoPO.setUserMail(oneUpdatedRegisterUserInfo.getUserMail());oneUserInfoPO.setUserName(oneUpdatedRegisterUserInfo.getUserName());oneUserInfoPO.setUserPassWord(oneUpdatedRegisterUserInfo.getUserPassWord());oneUserInfoPO.setUserType(oneUpdatedRegisterUserInfo.getUserType());oneUserInfoPO.setUserSex(oneUpdatedRegisterUserInfo.getUserSex());oneUserInfoPO.setUserBirthDay(oneUpdatedRegisterUserInfo.getUserBirthDay());oneUserInfoPO.setUserComeFrom(oneUpdatedRegisterUserInfo.getUserComeFrom());oneUserInfoPO.setUserResume(oneUpdatedRegisterUserInfo.getUserResume());oneUserInfoPO.setUserSign(oneUpdatedRegisterUserInfo.getUserSign());oneUserInfoPO.setAcceptAdvise(oneUpdatedRegisterUserInfo.getAcceptAdvise());oneUserInfoPO.setEmailVisible (oneUpdatedRegisterUserInfo.getEmailVisible());oneUserInfoPO.setContactMethod(oneUpdatedRegisterUserInfo.getContactMethod());session.flush();mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建系统数据库连接组件及对应的单元测试用例(第1/4部分)1.1.1构造基于JDBC技术实现的数据访问层中的数据库连接组件1、编程优化的原则(1)谨用异常,因此应该只用于错误处理,而不应该用于控制程序执行的方向(2)不要重复初始化变量(3)使用合适的数据类型String.intern()-----equal()(4)用final类(5)避免在for语句中使用复杂的表达式(6)try/catch应该在循环外(7)缩短session的超时时间2、依赖管理不良的依赖管理将会导致代码难以改变、易被破坏,而且不可重用。
从另一方面来说,如果依赖经过了良性的管理,代码就可以保持灵活性、健壮性和重用性。
而什么样的设计结果是可依赖管理的呢?(1)类的设计原则1)SRP,单一职责原则,一个类应该有且只有一个改变的理由。
2)OCP,开放封闭原则,你应该能够不用修改原有类就能扩展一个类的行为。
3)LSP,Liskov替换原则,派生类要与其基类自相容。
4)DIP,依赖倒置原则,依赖于抽象而不是实现-----应该让接口稳定性低的模块调用接口稳定性高的模块。
5)ISP,接口隔离原则,客户只要关注它们所需的接口。
3、添加一个属性配置文件 classNameConfig.properties(1)为什么要采用配置文件?作用是什么?----灵活地满足变化!如何对配置文件中的项目进行读写?(2)在项目中添加属性配置文件 classNameConfig.properties(3)目前的内容如下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形式的配置文件。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现BBS信息管理的DAO组件及对应的单元测试用例1.1.1BBS信息管理的DAO组件的实现1、在项目中添加一个针对BBSInfoManageDAOInterface的DAO接口提供一个实现类(1)类名称为BBSInfoManageDAOHibernateImple,包名称为com.px1987.webbbs.hibernatedao、并且继承于Observable类(2)编程该实现类注意:在DAO组件中对Lazy的应用要求,否则将会出现下面的错误package com.px1987.webbbs.hibernatedao;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.Observable;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.dao.BBSInfoManageDAOInterface;import com.px1987.webbbs.dao.BBSInfoPO;import com.px1987.webbbs.dao.RoleInfoPO;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.util.LogInfoFactory;public class BBSInfoManageDAOHibernateImple extends Observable implements BBSInfoManageDAOInterface {public BBSInfoManageDAOHibernateImple() {}public boolean deleteOneBBSInfo(int bbsID) throws WebBBSException {boolean OKOrNot=false;Session session=null;Transaction tx=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();BBSInfoPO oneBBSPOTODeleted=(BBSInfoPO)session.get(BBSInfoPO.class,new Integer(bbsID));if(oneBBSPOTODeleted==null){WebBBSException oneWebBBSException=new WebBBSException("在数据库表中不存在指定bbsID="+bbsID+"的数据顶目!");int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(oneWebBBSException); //当出现异常时将通知各个观察者throw oneWebBBSException;}session.delete(oneBBSPOTODeleted);mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的DeleteOneBBSInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public boolean deleteOneRoleInfo(int roleID) throws WebBBSException {boolean OKOrNot=false;Session session=null;Transaction tx=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();RoleInfoPO oneRoleInfoPOTODeleted=(RoleInfoPO)session.get(RoleInfoPO.class,new Integer(roleID));if(oneRoleInfoPOTODeleted==null){throw new WebBBSException("在数据库表中不存在指定bbsID="+roleID+"的数据顶目!");}session.delete(oneRoleInfoPOTODeleted);mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的DeleteOneRoleInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public boolean insertBBSInfo(BBSInfoPO oneBBSInfoPO) throws WebBBSException{ boolean OKOrNot=false;Session session=null;Transaction tx=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();session.save(oneBBSInfoPO);mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的insertOneUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public boolean insertRoleInfo(RoleInfoPO oneRoleInfoPO) throws WebBBSException{ boolean OKOrNot=false;Session session=null;Transaction tx=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();session.save(oneRoleInfoPO);mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的insertRoleInfoInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public ArrayList<BBSInfoPO> pageSelectDBData(String hqlSelect, int firstResult,int maxResults) throws WebBBSException{List selectResult = null;ArrayList allBBSInfoPO = new ArrayList();Session session = null;Transaction tx = null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(hqlSelect);query.setCacheable(true); //激活查询缓存query.setFirstResult(firstResult); //设置希望开始的行数---开始的行号从0 计数query.setMaxResults(maxResults); //设置希望返回的最大行数selectResult=query.list();Iterator allBBSInfoPOItem=selectResult.iterator();while(allBBSInfoPOItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allBBSInfoPOItem.next();allBBSInfoPO.add(oneBBSInfoPO);}mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的pageSelectDBData方法出现了HibernateException异常");}finally{// HibernateUtil.closeSession(); //由于在Service层中需要应用Lazy加载技术,因此不能关闭Session}return allBBSInfoPO;}public ArrayList<BBSInfoPO> selectSomeBBSInfo(String HQLSelect) throws WebBBSException{List selectResult = null;ArrayList allBBSInfoPO = new ArrayList();Session session = null;Transaction tx = null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(HQLSelect);query.setCacheable(true); //激活查询缓存selectResult=query.list();Iterator allBBSInfoPOItem=selectResult.iterator();while(allBBSInfoPOItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allBBSInfoPOItem.next();allBBSInfoPO.add(oneBBSInfoPO);}mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的selectBBSInfoByBBSAuthor方法出现了HibernateException异常");}finally{// HibernateUtil.closeSession(); //由于在Service层中需要应用Lazy加载技术,因此不能关闭Session}return allBBSInfoPO;}public ArrayList<BBSInfoPO> selectBBSInfoByBBSAuthor(String authorName) throws WebBBSException {String HQLQuery="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where oneBBSInfoPO.author='"+authorName+"'";return selectSomeBBSInfo(HQLQuery);}public ArrayList<BBSInfoPO> selectBBSInfoByBBSHits(int bbsHitsCounte) throws WebBBSException{String HQLQuery="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO where oneBBSInfoPO.hits="+bbsHitsCounte;return selectSomeBBSInfo(HQLQuery);}public ArrayList<BBSInfoPO> selectBBSInfoByBBSHits(int firstResult, int maxResults) throws WebBBSException{String hqlSelect="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc";return pageSelectDBData(hqlSelect, firstResult,maxResults);}public ArrayList<BBSInfoPO> selectBBSInfoByBBSHits() throws WebBBSException { String HQLQuery="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc";return selectSomeBBSInfo(HQLQuery);}ArrayList allBbsReplyInfosByOneBBS=null;public ArrayList getAllBbsReplyInfosByOneBBS() {return allBbsReplyInfosByOneBBS;}public BBSInfoPO selectBBSInfoByBBSID(int bbsID) throws WebBBSException { BBSInfoPO oneBBSInfoPO=null;Session session=null;Transaction tx=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();oneBBSInfoPO = (BBSInfoPO) session.get(BBSInfoPO.class, new Integer(bbsID));if(oneBBSInfoPO==null){throw new WebBBSException("在数据库表中不存在指定bbsID="+bbsID+"的数据顶目!");}//只能在同一Session中获得对应的O/R Mapping对象allBbsReplyInfosByOneBBS=oneBBSInfoPO.getBbsReplyInfosByBBS();int bbsHitsCounter=oneBBSInfoPO.getHits();oneBBSInfoPO.setHits(bbsHitsCounter+1);mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的SelectBBSInfoByBBSID方法出现了HibernateException异常");}finally{//由于在Service层中需要应用Lazy加载技术,因此不能关闭Session// HibernateUtil.closeSession();}return oneBBSInfoPO;}public ArrayList<BBSInfoPO> selectBBSInfoByBBSSendInfoTime(String sendInfoTime) throws WebBBSException{String HQLQuery="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where oneBBSInfoPO.sendInfoTime like '%"+sendInfoTime+"%'";return selectSomeBBSInfo(HQLQuery);}public ArrayList<BBSInfoPO> selectBBSInfoByBBSTitle(String bbsTitleText) throws WebBBSException {String HQLQuery="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where oneBBSInfoPO.title='"+bbsTitleText+"'";return selectSomeBBSInfo(HQLQuery);}public ArrayList<BBSInfoPO> selectBBSInfoByBBSTitleID(int bbsTitleID) throws WebBBSException{String HQLQuery="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where oneBBSInfoPO.bbsTitleID="+bbsTitleID;return selectSomeBBSInfo(HQLQuery);}public ArrayList<BBSInfoPO> selectBBSInfoByUserID(String userID) throws WebBBSException {String HQLQuery="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where erID='"+userID+"'";return selectSomeBBSInfo(HQLQuery);}public ArrayList<BBSInfoPO> selectPageBBSInfoByLoginUserID(String userID, int firstResult, int maxResults) throws WebBBSException{String hqlSelect="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where erID='"+userID+"'";return pageSelectDBData(hqlSelect, firstResult,maxResults);}public ArrayList<BBSInfoPO> selectPageBBSInfoByTitleID(int bbsTitleID,int firstResult, int maxResults) throws WebBBSException{String hqlSelect="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where oneBBSInfoPO.bbsTitleID="+bbsTitleID;return pageSelectDBData(hqlSelect, firstResult,maxResults);}public ArrayList<BBSInfoPO> selectPageBBSInfoByToday(int firstResult, int maxResults) throws WebBBSException{Date todayDate=new Date();String todayDateString=(todayDate.getYear()+1900)+"-"+(todayDate.getMonth()+1)+"-"+todayDate.getDate();String hqlSelect="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO order by oneBBSInfoPO.hits desc where oneBBSInfoPO.sendInfoTime like '%"+todayDateString+"%'";return pageSelectDBData(hqlSelect, firstResult,maxResults);}public boolean updateBBSInfo(BBSInfoPO oneUpdatedBBSInfoPO) throws WebBBSException{boolean OKOrNot=false;Session session=null;Transaction tx=null;BBSInfoPO oneReturnBBSInfoPO=null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();oneReturnBBSInfoPO = (BBSInfoPO) session.get(BBSInfoPO.class,new Integer(oneUpdatedBBSInfoPO.getBbsID()));if(oneReturnBBSInfoPO==null){throw new WebBBSException("在数据库表中不存在指定bbsID="+oneUpdatedBBSInfoPO.getBbsID()+"的数据顶目!");}oneReturnBBSInfoPO.setBbsID(oneUpdatedBBSInfoPO.getBbsID());oneReturnBBSInfoPO.setAuthor(oneUpdatedBBSInfoPO.getAuthor());oneReturnBBSInfoPO.setTitle(oneUpdatedBBSInfoPO.getTitle());oneReturnBBSInfoPO.setReplay(oneUpdatedBBSInfoPO.getReplay());oneReturnBBSInfoPO.setHits(oneUpdatedBBSInfoPO.getHits());oneReturnBBSInfoPO.setSendInfoTime(oneUpdatedBBSInfoPO.getSendInfoTime());oneReturnBBSInfoPO.setContent(oneUpdatedBBSInfoPO.getContent());oneReturnBBSInfoPO.setMailto(oneUpdatedBBSInfoPO.getMailto());oneReturnBBSInfoPO.setAbstractText(oneUpdatedBBSInfoPO.getAbstractText());oneReturnBBSInfoPO.setLastUpdateTime(oneUpdatedBBSInfoPO.getLastUpdateTime());oneReturnBBSInfoPO.setBbsIconID(oneUpdatedBBSInfoPO.getBbsIconID());oneReturnBBSInfoPO.setBbsTypeID(oneUpdatedBBSInfoPO.getBbsTypeID());oneReturnBBSInfoPO.setBbsTitleID(oneUpdatedBBSInfoPO.getBbsTitleID());oneReturnBBSInfoPO.setUserID(oneUpdatedBBSInfoPO.getUserID());session.flush();mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的updateOneUserInfo方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public boolean updateBBSReplyCounterByBBSID(int bbsID) throws WebBBSException{ boolean OKOrNot=false;Session session=null;Transaction tx=null;String HQLQuery="update com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO set oneBBSInfoPO.replay=oneBBSInfoPO.replay+1 where oneBBSInfoPO.id="+bbsID;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();Query query = session.createQuery(HQLQuery);query.executeUpdate();mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的updateBBSReplyCounterByBBSID方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public boolean updateBBSInfoHitsByBbsID(int bbsID) throws WebBBSException { boolean OKOrNot=false;Session session=null;Transaction tx=null;String HQLQuery="update com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO set oneBBSInfoPO.hits=oneBBSInfoPO.hits+1 where oneBBSInfoPO.id="+bbsID;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();Query query = session.createQuery(HQLQuery);query.executeUpdate();mit();OKOrNot=true;}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的updateBBSInfoHitsByBbsID方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return OKOrNot;}public int getBBSInfoCounterBySendTime(String sendInfoTime) throws WebBBSException { String HQLQuery="select count(oneBBSInfoPO) from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO where oneBBSInfoPO.sendInfoTime like '%"+sendInfoTime+"%'";return getBBSInfoTotalCounter(HQLQuery);}public int getBBSInfoTotalCounter(String HQLQuery) throws WebBBSException{ int totalBBSInfoCounter;Session session=null;Transaction tx=null;Query query =null;try{session = HibernateUtil.currentSession();tx = session.beginTransaction();query = session.createQuery(HQLQuery);Long objectCounter=(Long)query.uniqueResult();totalBBSInfoCounter=objectCounter.intValue();mit();}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSInfoManageDAOHibernateImple类中的getBBSInfoTotalCounter方法出现了HibernateException异常");}finally{HibernateUtil.closeSession();}return totalBBSInfoCounter;}public int getBBSInfoTotalCounter() throws WebBBSException {String HQLQuery="select count(*) from com.px1987.webbbs.dao.BBSInfoPO";return getBBSInfoTotalCounter(HQLQuery);}public int getHotBBSInfoTotalCounter(int totalHits) throws WebBBSException{ String HQLQuery="select count(*) from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO where oneBBSInfoPO.hits >"+totalHits;return getBBSInfoTotalCounter(HQLQuery);}public int getTotalBBSInfoCounterByUserID(String userID) throws WebBBSException{ String HQLQuery="select count(*) from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO where erID='"+userID+"'";return getBBSInfoTotalCounter(HQLQuery);}public int getBBSTotalCounterInOneBBSTitle(int bbsTitleID) throws WebBBSException{ String HQLQuery="select count(*) from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO where oneBBSInfoPO.bbsTitleID="+bbsTitleID;return getBBSInfoTotalCounter(HQLQuery);}}1.1.2对BBS信息管理的DAO组件进行单元测试1、添加对DAO组件BBSInfoManageDAOHibernateImple类进行测试的TestCase类(1)新增一个测试用例,类名称为TestBBSInfoManageDAOHibernateImple,包名称为com.px1987.webbbs.hibernatedaotest,基类为junit.framework.TestCase,被测试的类选择为com.px1987.webbbs.hibernatedao.BBSInfoManageDAOHibernateImple(2)选择被测试的方法2、编程该测试用例类package com.px1987.webbbs.hibernatedaotest;import junit.framework.TestCase;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.dao.*;import com.px1987.webbbs.exception.*;import com.px1987.webbbs.util.BBSInfoManageDAOFactory;import java.util.*;public class TestBBSInfoManageDAOHibernateImple extends TestCase {BBSInfoManageDAOInterface bbsInfoManageDAOHibernateImple=null;String bbsInfoManageDAOJDBCImpleClassName=null;/* Spring没有与Hibernate进行集成时*/protected void setUp() throws Exception{super.setUp();bbsInfoManageDAOJDBCImpleClassName=ClassNameConfig.getProperty("bbsInfoManageDAOJDBCImple.className");bbsInfoManageDAOHibernateImple=new BBSInfoManageDAOFactory().newBBSInfoManageDAOBean(bbsInfoManageDAOJDBCImpleClassName);}/*protected void setUp() throws Exception{super.setUp();//根据实际来决定String springXMLPath="D:/aaa/StrutsWebBBS+Spring/WebBBS/WebRoot/WEB-INF/SpringLinkHibernate.xml";ApplicationContext applicationContext =new FileSystemXmlApplicationContext(springXMLPath);bbsInfoManageDAOHibernateImple=(BBSInfoManageDAOInterface)applicationContext.getBean("bbsInfoManageDAOBean");}*/protected void tearDown() throws Exception {bbsInfoManageDAOHibernateImple=null;super.tearDown();}/*//该方法应该只执行一次public final void testDeleteOneBBSInfo() throws WebBBSException {int bbsID=6; //应该根据数据库表中的实际数据来决定boolean returnBoolean=bbsInfoManageDAOHibernateImple.deleteOneBBSInfo(bbsID);this.assertTrue(returnBoolean);}public final void testDeleteOneRoleInfo() throws WebBBSException{// 该方法应该只执行一次int roleID=3; //应该根据数据库表中的实际数据来决定boolean returnBoolean=bbsInfoManageDAOHibernateImple.deleteOneRoleInfo(roleID);this.assertTrue(returnBoolean);}public final void testInsertBBSInfo() throws WebBBSException{BBSInfoPO oneBBSInfoPO=new BBSInfoPO();oneBBSInfoPO.setAuthor("张三");oneBBSInfoPO.setTitle("关于testInsertBBSInfoTODB方法的问题");oneBBSInfoPO.setReplay(0);oneBBSInfoPO.setHits(1);java.util.Date rightNow = new java.util.Date();oneBBSInfoPO.setSendInfoTime(rightNow.toLocaleString());oneBBSInfoPO.setContent("关于testInsertBBSInfoTODB方法的问题的回答内容");oneBBSInfoPO.setMailto(0);oneBBSInfoPO.setAbstractText("关于testInsertBBSInfoTODB方法的问题的回答内容的介绍");oneBBSInfoPO.setLastUpdateTime(rightNow.toLocaleString());oneBBSInfoPO.setBbsIconID(1);oneBBSInfoPO.setBbsTypeID(3);oneBBSInfoPO.setBbsTitleID(1);oneBBSInfoPO.setUserID("1");boolean actualBoolean=bbsInfoManageDAOHibernateImple.insertBBSInfo(oneBBSInfoPO);this.assertTrue(actualBoolean);}public final void testInsertRoleInfo() throws WebBBSException{RoleInfoPO oneRoleInfoPO=new RoleInfoPO();oneRoleInfoPO.setRoleName("admin");oneRoleInfoPO.setSendMessage(1);oneRoleInfoPO.setUpdateMessage(1);oneRoleInfoPO.setUpdateUserInfo(0);oneRoleInfoPO.setUserID("3");boolean actualBoolean=bbsInfoManageDAOHibernateImple.insertRoleInfo(oneRoleInfoPO);this.assertTrue(actualBoolean);}*/public final void testPageSelectDBData() throws WebBBSException{String hqlSelect="from com.px1987.webbbs.dao.BBSInfoPO as oneBBSInfoPO";int firstResult=1;int maxResults=2;ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.pageSelectDBData(hqlSelect, firstResult, maxResults);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByBBSAuthor() throws WebBBSException{ String authorName="admin"; //应该根据数据库表中的实际数据来决定ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSAuthor(authorName);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByBBSHitsInt() throws WebBBSException{ int bbsHitsCounte=13; //应该根据数据库表中的实际数据来决定ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSHits(bbsHitsCounte);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByBBSHitsIntInt() throws WebBBSException{ int firstResult=1;int maxResults=2;ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSHits(firstResult,maxResults);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByBBSHits() throws WebBBSException{ ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSHits();this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByBBSID() throws WebBBSException { int bbsID=1; //应该根据数据库表中的实际数据来决定BBSInfoPO returnOneBBSInfoPO=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSID(bbsID);//由于所给定的ID是数据库表中存在的一个BBS信息,因此能够返回该对象this.assertNotNull(returnOneBBSInfoPO);}public final void testSelectBBSInfoByBBSSendInfoTime() throws WebBBSException{ String sendInfoTime="2006-8-9"; //应该根据数据库表中的实际数据来决定ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSSendInfoTime(sendInfoTime);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByBBSTitle() throws WebBBSException{ String bbsTitleText="J2SE技术";ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSTitle(bbsTitleText);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByBBSTitleID() throws WebBBSException{ int bbsTitleID=1; //应该根据数据库表中的实际数据来决定ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByBBSTitleID(bbsTitleID);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectBBSInfoByUserID() throws WebBBSException{ String userID="1"; //应该根据数据库表中的实际数据来决定ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectBBSInfoByUserID(userID);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);this.assertNotNull(oneBbsTitle);}}public final void testSelectPageBBSInfoByLoginUserID() throws WebBBSException{ String userID="1"; //应该根据数据库表中的实际数据来决定int firstResult=1;int maxResults=2;ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectPageBBSInfoByLoginUserID(userID,firstResult,maxResults);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);String oneBbsTitle=oneBBSInfoPO.getTitle();this.assertNotNull(oneBbsTitle);}}public final void testSelectPageBBSInfoByTitleID() throws WebBBSException{ int bbsTitleID=1; //应该根据数据库表中的实际数据来决定int firstResult=1;int maxResults=2;ArrayList allBBSInfoPOs=bbsInfoManageDAOHibernateImple.selectPageBBSInfoByTitleID(bbsTitleID,firstResult,maxResults);this.assertNotNull(allBBSInfoPOs);Iterator allItem=allBBSInfoPOs.iterator();while(allItem.hasNext()){BBSInfoPO oneBBSInfoPO=(BBSInfoPO)allItem.next();this.assertNotNull(oneBBSInfoPO);。
基于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 Web组件技术的课程设计实训项目——《BBS论坛系统》——构建系统控制层中的论坛信息管理的Servlet组件1.1.1构建系统控制层中的论坛信息管理的Servlet组件1、添加一个Servlet组件(1)类名称为BBSManageAction,包名称为com.px1987.webbbs.servlet;(2)设置其URL-pattern为/bbsManagerAction(3)编程该 Servlet组件package com.px1987.webbbs.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.springframework.context.ApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils; import com.px1987.webbbs.model.*;import com.px1987.webbbs.exception.*;import java.util.*;public class BBSManageAction extends HttpServlet{BBSInfoManageInterface bbsInfoManagerBean=null;public BBSManageAction() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{RequestDispatcher oneRequestDispatcher=null;request.setAttribute("errorText", "本功能模块禁止Get方式的请求,请按照系统的功能菜单来操作系统!");oneRequestDispatcher=request.getRequestDispatcher("/errorDeal/showWebAppError.jsp");oneRequestDispatcher.forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{// request.setCharacterEncoding("gb2312"); //已经通过HttpRequestEncodingFilter组件来实现了RequestDispatcher oneRequestDispatcher=null;ApplicationContext applicationContext=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());bbsInfoManagerBean=(BBSInfoManageInterface)applicationContext.getBean("bbsInfoManagerBean");String menuID= request.getParameter("menuID");if(menuID==null){request.setAttribute("errorText", "您请求的命令码不是系统中的有效的命令码,可能您是重复提交请求!");oneRequestDispatcher=request.getRequestDispatcher("/errorDeal/showWebAppError.jsp");oneRequestDispatcher.forward(request, response);return;}int menuIDDigit=Integer.parseInt(menuID);switch(menuIDDigit){case 1: //BBS 发表或者预览吗int preViewState =Integer.parseInt(request.getParameter("preViewState"));if(preViewState==0){goSendOneBBSInfo(request,response);}else if(preViewState==1){goPreViewOneBBSInfo(request,response);}break;case 2: //修改BBS信息吗goUpdateOneBBSInfo(request,response);break;}}public void goPreViewOneBBSInfo(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { }public void goSendOneBBSInfo(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {boolean OkOrNot = false;String targetPage=null;// BBSInfoManageInterface bbsInfoManagerBean=null;RequestDispatcher oneRequestDispatcher=null;if(!checkRepeatFormSubmit(request,response)){return;}int bbsTitleID =Integer.parseInt(request.getParameter("bbsTitleID")); int userID =Integer.parseInt(request.getParameter("userID"));String bbsAuther = request.getParameter("bbsAuther").trim();int mailtoAuthor =Integer.parseInt(request.getParameter("mailtoAuthor"));int bbsTypeID = Integer.parseInt(request.getParameter("bbsTypeID")); String bbsSubject = request.getParameter("bbsSubject").trim();String bbsAbstractText = request.getParameter("bbsAbstractText").trim(); int bbsIconID =Integer.parseInt(request.getParameter("bbsIconID")); String bbsMessage = request.getParameter("bbsMessage").trim();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());// bbsInfoManagerBean=new BBSInfoManageImple();try{OkOrNot = bbsInfoManagerBean.doSaveBBSInfo(oneBbsInfoVO);}catch(WebBBSException e){request.setAttribute("errorText", e.getMessage());oneRequestDispatcher=request.getRequestDispatcher("/errorDeal/showWebAppError.jsp");oneRequestDispatcher.forward(request, response);return;}if (OkOrNot){targetPage="/WebBBS/pageForwordAction?action=showAllClassInfo";//发表成功,则跳转到“BBS分类”显示页中response.sendRedirect(targetPage);}else{request.setAttribute("errorText", "您的BBS留言信息没有正确地被保存!");oneRequestDispatcher=request.getRequestDispatcher("/errorDeal/showWebAppError.jsp");oneRequestDispatcher.forward(request, response);}}public void goUpdateOneBBSInfo(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ }public boolean checkRepeatFormSubmit(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ boolean OkOrNot=true;HttpSession session=null;/** 下面的代码是识别是否为重复提交请求*/session=request.getSession();String tokenTimeInForm=request.getParameter("tokenTime");String tokenTimeInSession=(String)session.getAttribute("tokenTime");OkOrNot=(tokenTimeInForm==null)||(!tokenTimeInSession.equals(tokenTimeInForm));if(OkOrNot){request.setAttribute("errorText", "您已经产生了注册提交行为,不能再重复进行提交行为!");RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher("/errorDeal/showWebAppError.jsp");oneRequestDispatcher.forward(request, response);return false;}session.setAttribute("tokenTime",""); //删除会话中的token的值session.removeAttribute("tokenTime");return true;}public void init() throws ServletException {}}。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——在项目的表示层页面中应用XTree树形菜单组件1.1.1在页面中应用XTree树形菜单组件1、应用XTree树型控件(1)XTree树型控件xtree.js是Web开发中运用较多的一个树型控件。
其入门简单,功能强大,很多人在它的基础上开发出了自己的树型控件。
XloadTree也是/公司的基于JavaScript的建立树型目录的开源产品,扩展性强,使用简单。
由于XloadTree是基于XmlHttp请求/响应模型,必须使用http协议访问代码才可以正确加载XML文件。
(2)下载XTree树型控件(编程方式的系统包)官方网址为 /下载页面的URL地址为:/download/xtree117.zip(3)下载XTree树型控件(XML文件方式的系统包、而且该XML文件可以是动态创建)在/dhtml/xloadtree/xloadtree.html下载页面中可以下载XTree树型控件。
2、XTree有两种使用模式其一为显示构造树,而其二为运用XML数据源,同时该XML数据源也可以动态在Servlet 组件程序中进行创建。
3、采用显示构造树的方式使用XTree树型控件(1)第一步需要引用其样式单文件<link href='<c:url value="/systemManage/cssStyle/xtree.css" />' rel="stylesheet" type="text/css">(2)第二步再引用 xtree.js 文件<script language="javascript" type="text/javascript"src='<c:url value="/systemManage/contentPage/xtree.js" />' ></script>(3)第三步编程WebFXTreeItem以产生出菜单var treeRoot = new WebFXTree('蓝梦BBS论坛后台管理菜单');var tree_userInfoManaeFolder = new WebFXTreeItem("用户信息管理")var forwardQueryUserInfoItem=new WebFXTreeItem("查询一般用户信息");forwardQueryUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardQueryRegisterUserInfo.action" />';forwardQueryUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardQueryUserInfoItem);var forwardQueryVIPUserInfoItem=new WebFXTreeItem("查询VIP用户信息"); forwardQueryVIPUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardQueryVIPUserInfo.action" />';forwardQueryVIPUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardQueryVIPUserInfoItem);var forwardShowRegisterUserInfoItem=new WebFXTreeItem("显示用户信息"); forwardShowRegisterUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardShowRegisterUserInfo.action" />';forwardShowRegisterUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardShowRegisterUserInfoItem);var forwardDeleteRegisterUserInfoItem=new WebFXTreeItem("删除用户信息"); forwardDeleteRegisterUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardDeleteRegisterUserInfo.action" />';forwardDeleteRegisterUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardDeleteRegisterUserInfoItem);treeRoot.add(tree_userInfoManaeFolder);document.write(treeRoot);(4)执行后将产生出下面的效果(5)完整的页面代码<%@ page contentType="text/html; charset=gb2312"errorPage="/errorDeal/showSystemError.jsp" %><%@ taglib prefix="c" uri="/jsp/jstl/core"%><%String contextName = request.getContextPath();String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contextName;String currentPath=basePath+"/systemManage/contentPage/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><head><title>蓝梦BBS论坛后台管理的主导航菜单页</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><base href="<%=currentPath%>"><link href='<c:url value="/systemManage/cssStyle/pageStyle.css" />' rel="stylesheet" type="text/css" /><link href='<c:url value="/systemManage/cssStyle/xtree.css" />' rel="stylesheet" type="text/css"> <!-- 第一步引用样式单文件 --><style type="text/css">body {background-image: url(<c:url value="/systemManage/images/contentbg.jpg" /> );}</style><script language="javascript" type="text/javascript" src='<c:url value="/systemManage/contentPage/xtree.js" />' ></script><!-- 第二步引用 xtree.js 文件 --><script language="javascript" type="text/javascript" src='<c:url value="/systemManage/contentPage/xloadtree.js" />' ></script><script language="javascript" type="text/javascript" src='<c:urlvalue="/systemManage/contentPage/xmlextras.js" />' ></script><script language="javascript" type="text/javascript"> <!-- 第三步编程WebFXTreeItem以产生出菜单 -->function buildTreeMenuNoXML(){var treeRoot = new WebFXTree('蓝梦BBS论坛后台管理菜单');var tree_userInfoManaeFolder = new WebFXTreeItem("用户信息管理")var forwardQueryUserInfoItem=new WebFXTreeItem("查询一般用户信息");forwardQueryUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardQueryRegisterUserInfo.action" />';forwardQueryUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardQueryUserInfoItem);var forwardQueryVIPUserInfoItem=new WebFXTreeItem("查询VIP用户信息");forwardQueryVIPUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardQueryVIPUserInfo.action" />';forwardQueryVIPUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardQueryVIPUserInfoItem);var forwardShowRegisterUserInfoItem=new WebFXTreeItem("显示用户信息");forwardShowRegisterUserInfoItem.action='<c:urlvalue="/doShowAllUserInfoAdminUserManageAction.action" />';forwardShowRegisterUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardShowRegisterUserInfoItem);var forwardDeleteRegisterUserInfoItem=new WebFXTreeItem("删除一般用户信息");forwardDeleteRegisterUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardDeleteRegisterUserInfo.action" />';forwardDeleteRegisterUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardDeleteRegisterUserInfoItem);var forwardDeleteVIPUserInfoItem=new WebFXTreeItem("删除VIP用户信息");forwardDeleteVIPUserInfoItem.action='<c:urlvalue="/adminForwordAction!forwardDeleteVIPUserInfo.action" />';forwardDeleteVIPUserInfoItem.target="mainFrame";tree_userInfoManaeFolder.add(forwardDeleteVIPUserInfoItem);treeRoot.add(tree_userInfoManaeFolder);//或者异步方式 document.body.innerHTML=trees;document.write(treeRoot);}function buildTreeMenuWithXML(){/*webFXTreeConfig.rootIcon = "images/xp/folder.png";webFXTreeConfig.openRootIcon = "images/xp/openfolder.png";webFXTreeConfig.folderIcon = "images/xp/folder.png";webFXTreeConfig.openFolderIcon = "images/xp/openfolder.png";webFXTreeConfig.fileIcon = "images/xp/file.png";webFXTreeConfig.lMinusIcon = "images/xp/Lminus.png";webFXTreeConfig.lPlusIcon = "images/xp/Lplus.png";webFXTreeConfig.tMinusIcon = "images/xp/Tminus.png";webFXTreeConfig.tPlusIcon = "images/xp/Tplus.png";webFXTreeConfig.iIcon = "images/xp/I.png";webFXTreeConfig.lIcon = "images/xp/L.png";webFXTreeConfig.tIcon = "images/xp/T.png";*/var menuTree = new WebFXLoadTree("蓝梦BBS论坛后台管理菜单","leftMenu.xml"); document.write(menuTree);}function buildTreeMenuWithServlet(){/*webFXTreeConfig.rootIcon = "images/xp/folder.png";webFXTreeConfig.openRootIcon = "images/xp/openfolder.png";webFXTreeConfig.folderIcon = "images/xp/folder.png";webFXTreeConfig.openFolderIcon = "images/xp/openfolder.png";webFXTreeConfig.fileIcon = "images/xp/file.png";webFXTreeConfig.lMinusIcon = "images/xp/Lminus.png";webFXTreeConfig.lPlusIcon = "images/xp/Lplus.png";webFXTreeConfig.tMinusIcon = "images/xp/Tminus.png";webFXTreeConfig.tPlusIcon = "images/xp/Tplus.png";webFXTreeConfig.iIcon = "images/xp/I.png";webFXTreeConfig.lIcon = "images/xp/L.png";webFXTreeConfig.tIcon = "images/xp/T.png";*/var menuTree = new WebFXLoadTree("蓝梦BBS论坛后台管理菜单",'<c:url value="/leftmenuservlet?action=systemManage" />');document.write(menuTree);}</script></head><body oncontextmenu="window.event.returnValue=false"onkeypress="window.event.returnValue=false"onkeydown="window.event.returnValue=false"onkeyup="window.event.returnValue=false"ondragstart="window.event.returnValue=false"onselectstart="event.returnValue=false"leftMargin="0" topMargin="0"><!-- 以下为时钟的时间的JavaScript 程序开始--><script language="javascript" type="text/javascript">setInterval('refreshClock()',1000);</script><script language="javascript" type="text/javascript" src='<c:url value="/systemManage/contentPage/clock.js" /> '></script><!-- 以下为时钟的时间的JavaScript 程序结束--><table border="0" cellpadding="0" cellspacing="0" width="100%" height="67" bordercolor="#99CCFF"><tr><td align="center" width="100%" height="100%"><font id="calendarClock1" style="font-family:宋体;font-size:9pt;line-height:120%"> </font><br><font id="calendarClock2" style="font-family:Arial;font-size:16pt;line-height:120%"> </font><br> <font id="calendarClock3" style="font-family:宋体;font-size:11pt;line-height:120%"> </font><br><font id="calendarClock4" style="color:#100080;font-family:宋体;font-size:10pt;line-height:120%"><b> </b></font></td></tr></table><!-- 以上为时间程序结束--><HR height="1px"><A href='<c:url value="/pageForwordAction.do?action=showIndexContent" />' target="_parent">返回首页</A><script language="javascript" type="text/javascript"> <!-- 第三步编程WebFXTreeItem以产生出菜单 -->buildTreeMenuWithServlet();</script></body></HTML>4、运用XML数据源但XML文件的内容是静态的(可配置的形式)方式应用XTree树型控件(1)添加tree.dtd文件(2)设计tree.dtd文件的内容<!ELEMENT tree (tree*)><!ATTLIST treetext CDATA #REQUIREDsrc CDATA #IMPLIEDaction CDATA #IMPLIEDicon CDATA #IMPLIEDopenIcon CDATA #IMPLIEDtarget CDATA #IMPLIED> (3)设计XML数据源文件leftMenu.xml(4)设计leftMenu.xml文件中的内容<?xml version="1.0" encoding="gb2312"?><!DOCTYPE tree SYSTEM "tree.dtd"><tree text="蓝梦BBS论坛后台管理菜单"><tree text="用户信息管理" ><tree text="查询一般用户信息"action="/WebBBS/adminForwordAction!forwardQueryRegisterUserInfo.action"target="mainFrame" /><tree text="查询VIP用户信息"action="/WebBBS/adminForwordAction!forwardQueryVIPUserInfo.action"target="mainFrame" /><tree text="显示用户信息"action="/WebBBS/doShowAllUserInfoAdminUserManageAction.action"target="mainFrame" /><tree text="删除一般用户信息"action="/WebBBS/adminForwordAction!forwardDeleteRegisterUserInfo.action"target="mainFrame" /><tree text="删除VIP用户信息"action="/WebBBS/adminForwordAction!forwardDeleteVIPUserInfo.action"target="mainFrame" /></tree></tree>(5)编程该xLoadtree菜单1)第一步需要引用其样式单文件<link href='<c:url value="/systemManage/cssStyle/xtree.css" />'rel="stylesheet" type="text/css">2)第二步再引用xtree.js 、xloadtree.js和xmlextras.js文件<script language="javascript" type="text/javascript"src='<c:url value="/systemManage/contentPage/xloadtree.js" />' > </script><script language="javascript" type="text/javascript"src='<c:url value="/systemManage/contentPage/xmlextras.js" />' > </script>3)第三步编程WebFXLoadTree以产生出菜单var menuTree =new WebFXLoadTree("蓝梦BBS论坛后台管理菜单","leftMenu.xml"); document.write(menuTree);(6)执行后将产生出下面的树形菜单效果5、由Servlet程序动态产生出XTree树型控件的XML文件中的配置数据,从而可以产生动态的树形菜单(1)设计一个产生出XTree树型控件的XML文件内容的Servletpackage com.px1987.webbbs.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.context.ApplicationContext;import org.springframework.web.context.support.WebApplicationContextUtils; import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.jdom.JDomXMLMenuInterface;public class LeftMenuServlet extends HttpServlet {public LeftMenuServlet() {super();}public void destroy() {super.destroy();}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {JDomXMLMenuInterface oneJDomXMLMenuBean=null;response.setContentType("text/xml; charset=gb2312");response.setHeader("Cache-Control", "no-cache");PrintWriter out = response.getWriter();// oneJDomXMLMenuBean=new JDomXMLMenuBean(); //没有采用Spring IOC时ApplicationContext applicationContext=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());oneJDomXMLMenuBean=(JDomXMLMenuInterface)applicationContext.getBean("jDomXMLMenuBean");String action=request.getParameter("action");try {if(action.equals("systemManage")){oneJDomXMLMenuBean.createSystemManageXMLMenuText(request.getContextPath());}else if(action.equals("webIndex")){oneJDomXMLMenuBean.createWebIndexXMLMenuText(request.getContextPath());}else{return;}}catch(WebBBSException e){request.setAttribute("errorText", "出现如下的错误:" +e.getMessage());RequestDispatcher oneRequestDispatcher=request.getRequestDispatcher("/errorDeal/showWebAppError.jsp");oneRequestDispatcher.forward(request, response);}oneJDomXMLMenuBean.outXMLData(out);out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}public void init() throws ServletException {}}(2)添加一个JDomXMLMenuBeanpackage com.px1987.webbbs.jdom;import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.Iterator;import org.jdom.Document;import org.jdom.Element;import org.jdom.output.Format;import org.jdom.output.XMLOutputter;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.model.BBSInfoManageInterface;import com.px1987.webbbs.model.BBSTitleVO;public class JDomXMLMenuBean implements JDomXMLMenuInterface{Document xmlDoc=null;BBSInfoManageInterface bbsInfoManagerBean=null;public void setBbsInfoManagerBean(BBSInfoManageInterface bbsInfoManagerBean) { this.bbsInfoManagerBean = bbsInfoManagerBean;}/*String bbsInfoManageBeanClassName=null;public JDomXMLMenuBean() throws WebBBSException{//本构造方法是在利用可配置化的工厂时被应用super();newUserAndBBSManageBean();}public void newUserAndBBSManageBean() throws WebBBSException{bbsInfoManageBeanClassName=ClassNameConfig.getProperty("bbsInfoManageImple.className");bbsInfoManagerBean=BBSInfoManageFactory.newBBSInfoManageBean(bbsInfoManageBeanClassName);}*/public JDomXMLMenuBean() {}public void createWebIndexXMLMenuText(String webContextName)throws WebBBSException{ ArrayList allBBSTitleInfoVOArrayList= null;Element docRoot=null;Element someOneBBSTitleMenu=null;// newUserAndBBSManageBean(); //创建用户和BBS信息管理业务类的对象实例allBBSTitleInfoVOArrayList = bbsInfoManagerBean.doGetBBSTitleInfo();docRoot=new Element("tree");docRoot.setAttribute("text", "蓝梦BBS论坛首页");docRoot.setAttribute("action",webContextName+"/pageForwordAction.do?action=showIndexContent");docRoot.setAttribute("target", "mainFrame");xmlDoc = new Document(docRoot);Iterator oneBBSTitleInfoVOItem=allBBSTitleInfoVOArrayList.iterator();while(oneBBSTitleInfoVOItem.hasNext()){BBSTitleVO oneBBSTitleInfoVO=(BBSTitleVO)oneBBSTitleInfoVOItem.next();String oneTitleInfoText=oneBBSTitleInfoVO.getBbsTitle();String bbsTitleID=new Integer(oneBBSTitleInfoVO.getBbsTitleID()).toString();someOneBBSTitleMenu= new Element("tree");someOneBBSTitleMenu.setAttribute("text", oneTitleInfoText);someOneBBSTitleMenu.setAttribute("action", webContextName+"/pageForwordAction.do?action=showAllBBSInClass&bbsTitleID="+ bbsTitleID+"&bbsTitleText="+oneTitleInfoText);someOneBBSTitleMenu.setAttribute("target", "mainFrame");docRoot.addContent(someOneBBSTitleMenu);}}public void createSystemManageXMLMenuText(String webContextName)throws WebBBSException{ Element docRoot=new Element("tree");docRoot.setAttribute("text", "蓝梦BBS论坛后台管理菜单");xmlDoc = new Document(docRoot);Element userInfoManageMenu = new Element("tree");userInfoManageMenu.setAttribute("text", "用户信息管理");docRoot.addContent(userInfoManageMenu);Element userInfoManageMenu_QueryRegisterUserInfo = new Element("tree");userInfoManageMenu_QueryRegisterUserInfo.setAttribute("text","查询一般用户信息");userInfoManageMenu_QueryRegisterUserInfo.setAttribute("action", webContextName+"/adminForwordAction!forwardQueryRegisterUserInfo.action");userInfoManageMenu_QueryRegisterUserInfo.setAttribute("target","mainFrame");userInfoManageMenu.addContent(userInfoManageMenu_QueryRegisterUserInfo);Element userInfoManageMenu_QueryVIPUserInfo = new Element("tree"); userInfoManageMenu_QueryVIPUserInfo.setAttribute("text", "查询VIP用户信息");userInfoManageMenu_QueryVIPUserInfo.setAttribute("action", webContextName+"/adminForwordAction!forwardQueryVIPUserInfo.action");userInfoManageMenu_QueryVIPUserInfo.setAttribute("target","mainFrame");userInfoManageMenu.addContent(userInfoManageMenu_QueryVIPUserInfo);Element userInfoManageMenu_ShowRegisterUserInfo = new Element("tree");userInfoManageMenu_ShowRegisterUserInfo.setAttribute("text","显示用户信息");userInfoManageMenu_ShowRegisterUserInfo.setAttribute("action", webContextName+"/doShowAllUserInfoAdminUserManageAction.action");userInfoManageMenu_ShowRegisterUserInfo.setAttribute("target","mainFrame");userInfoManageMenu.addContent(userInfoManageMenu_ShowRegisterUserInfo);Element userInfoManageMenu_DeleteRegisterUserInfo = new Element("tree");userInfoManageMenu_DeleteRegisterUserInfo.setAttribute("text","删除一般用户信息");userInfoManageMenu_DeleteRegisterUserInfo.setAttribute("action", webContextName+"/adminForwordAction!forwardDeleteRegisterUserInfo.action");userInfoManageMenu_DeleteRegisterUserInfo.setAttribute("target","mainFrame");userInfoManageMenu.addContent(userInfoManageMenu_DeleteRegisterUserInfo);Element userInfoManageMenu_DeleteVIPUserInfo = new Element("tree");userInfoManageMenu_DeleteVIPUserInfo.setAttribute("text","删除VIP用户信息");userInfoManageMenu_DeleteVIPUserInfo.setAttribute("action", webContextName+"/adminForwordAction!forwardDeleteVIPUserInfo.action");userInfoManageMenu_DeleteVIPUserInfo.setAttribute("target","mainFrame");userInfoManageMenu.addContent(userInfoManageMenu_DeleteVIPUserInfo);}public void outXMLData(PrintWriter out) throws IOException {Format oneFormat=Format.getPrettyFormat();oneFormat.setEncoding("gb2312");oneFormat.setIndent(" "); //设置子元素向右缩多少个空格oneFormat.setLineSeparator("\n\r");XMLOutputter XMLOut = new XMLOutputter(oneFormat);XMLOut.output(xmlDoc, out);}}(3)在页面中向Servlet进行请求var menuTree = new WebFXLoadTree("蓝梦BBS论坛后台管理菜单",'<c:url value="/leftmenuservlet" />');document.write(menuTree);(4)执行后的结果如下图所示。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的数据库连接组件及对应的单元测试用例(第2/4部分)1.1.1应用Struts DataSource为项目中的数据库提供数据库连接池功能1、在Eclipse开发工具中配置出数据库连接池(DataSource)Key:webDataSourceType:mons.dbcp.BasicDataSourceDriver Class:net.sourceforge.jtds.jdbc.DriverURL:jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBaseUser:saPassWord:1234Min Count:10Max Count:10将产生出下面的DataSource的配置项目<data-source key="webDataSource"type="mons.dbcp.BasicDataSource"><set-property property="password" value="1234" /><set-property property="minCount" value="10" /> <!- - 没有该属性项目- -> <set-property property="maxCount" value="10" /><set-property property="user" value="sa" /><set-property property="driverClass"value="net.sourceforge.jtds.jdbc.Driver" /><set-property property="url"value="jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBase" /> <set-property property="readOnly" value="false" /><set-property property="autoCommit" value="true" /></data-source>正确的项目如下:<data-source key="webDataSource"type="mons.dbcp.BasicDataSource"><set-property property="password" value="1234" /><set-property property="maxActive" value="10" /><set-property property="username" value="sa" /><set-property property="driverClassName"value="net.sourceforge.jtds.jdbc.Driver" /><set-property property="url"value="jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBase" /><set-property property="defaultReadOnly" value="false" /><set-property property="defaultAutoCommit" value="true" /></data-source>2、在Action类中获得该DataSource数据库连接对象1.1.2应用DBCP组件为系统提供数据库连接池功能(优化数据库连接,并体验面向接口编程所带来的优点)1、JDBC直接连接的主要问题是什么?什么是数据库连接池(Pool)的连接?----缓存已经存在的数据库连接对象,为什么要应用?数据库连接池(Connection Pool)池是一个很普遍的概念,和缓冲存储有机制相近的地方,都是缩减了访问的环节,但它更注重于资源的共享。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——扩展ActionServlet和添加各种PlugIn1.1.1添加对ActionServlet进行定制的组件类以解决中文乱码问题1、添加BBSActionServlet组件(1)类名称为BBSActionServlet,包名称为com.px1987.webbbs.actionservlet,基类为org.apache.struts.action.ActionServlet(2)编程该类package com.px1987.webbbs.actionservlet;import org.apache.struts.action.ActionServlet;import javax.servlet.*;import javax.servlet.http.*;import org.apache.struts.action.*;import java.io.*;public class BBSActionServlet extends ActionServlet{String charsetName;public BBSActionServlet(){}public void init(ServletConfig config) throws ServletException{super.init(config);charsetName=config.getInitParameter("charsetName");//获得在Web.xml文件中的字符集,中文为GB2312,台湾为MS950 }public void process (HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{RequestDispatcher oneRequestDispatcher=null;try{request.setCharacterEncoding (charsetName) ;}catch(UnsupportedEncodingException e){request.setAttribute("errorText", "在进行中文字符编码转换时间出现了异常,因此为"+e.getMessage());oneRequestDispatcher=request.getRequestDispatcher("/errorDeal/showWebAppError.jsp");oneRequestDispatcher.forward(request, response);}super.process (request, response) ;}}2、修改web.xml文件以部署该ActionServlet组件<servlet><servlet-name>action</servlet-name><servlet-class>com.px1987.webbbs.actionservlet.BBSActionServlet</servlet-class> <init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param><param-name>charsetName</param-name><param-value>gb2312</param-value></init-param><init-param><param-name>debug</param-name><param-value>3</param-value></init-param><init-param><param-name>detail</param-name><param-value>3</param-value></init-param><load-on-startup>0</load-on-startup></servlet>1.1.2添加系统的PlugIn组件类(实现对XML文件进行解析)1、添加一个对XML进行解析的JavaBean组件的接口及实现类(1)接口名称为XMLInformationConfig,包名称为com.px1987.webbbs.util(2)设计该接口package com.px1987.webbbs.util;import com.px1987.webbbs.exception.*;public interface XMLInformationConfig{public void xmlInit(String configFilePathAndName) throws WebBBSException;}2、为上面的接口提供一个实现类(1)类名称为SAXInformationConfig,包名称为com.px1987.webbbs.util,基类为org.xml.sax.helpers.DefaultHandler(采用SAX技术)(2)编程该类package com.px1987.webbbs.util;import java.io.*;import org.xml.sax.Attributes;import org.xml.sax.helpers.DefaultHandler;import org.xml.sax.SAXException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import com.px1987.webbbs.exception.WebBBSException;public class SAXInformationConfig extends DefaultHandler implements XMLInformationConfig{private String marqueeText = "";public String getMarqueeText(){return marqueeText;}public SAXInformationConfig(){}/*** 读取配置文件信息,并设置相关参数。
基于J2EE Struts框架的课程设计实训项目《BBS论坛系统》系统详细设计说明书(第5/5部分)文档信息目录引言................................................................................................................... 错误!未定义书签。
1.1编写目的............................................................................................. 错误!未定义书签。
1.2背景..................................................................................................... 错误!未定义书签。
1.3定义..................................................................................................... 错误!未定义书签。
1.4参考资料............................................................................................. 错误!未定义书签。
系统结构设计................................................................................................... 错误!未定义书签。
2.1 MVC中各层组件设计....................................................................... 错误!未定义书签。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——构建出项目的表示层各个页面(包括JPager实现分页)1.1.1构造BBS论坛系统项目中的与tiles框架相关的表示层组件1、添加与表示层相关的各个资源(1)页面模板----实际由美工提供 tilesLayout.jsp,决定页面的布局(分块)主要是由三个部分所组成。
(2)拷贝其它的图像等文件资源(3)在Macromedia Dreamweaver MX 2004中打开该模板页面2、在Dreamweaver中新建一个Web站点(1)新建一个Web站点,名称为WebBBSSite3、在Dreamweaver中添加用户管理相关的各个JSP页面(1)新建一个目录,名称为 tilesLayout(2)添加系统的各个布局页面 tilesLayout.jsp内容如下:<%@ page language="java" pageEncoding="gb2312"%><%@ taglib uri="/tags-tiles" prefix="tiles" %> <html:html lang="true"><head></head><body><tiles:insert attribute="pageHead"></tiles:insert><tiles:insert attribute="pageContent"></tiles:insert><tiles:insert attribute="authorArea"></tiles:insert></body></html:html>(3)在tilesLayout目录中再添加其它的各个页面,包括pageHead.jsp页面(4)将pageHead.jsp页面与其它的各个功能页面相互关联(添加超链接)更新各个超链接4、添加版权页authorArea.jsp并设计该页面1.1.2设置浏览器中的Http返回码的错误显示页面1、添加各个错误显示页面(1)添加新的目录,名称为errorDeal(2)添加各个错误类型的错误显示页面(3)在web.xml中设置下面的<error-page>配置内容<error-page><error-code>404</error-code><location>/showIECodeError.do</location></error-page><error-page><error-code>500</error-code><location>/showIECodeError.do</location></error-page><error-page><error-code>505</error-code><location>/showIECodeError.do</location></error-page>其中的/showIECodeError.do为下面的定义<action path="/showIECodeError" type="org.apache.struts.actions.ForwardAction" parameter="goShowIECodeError"></action>但采用了上面的Tomcat服务器不断地产生出下面的异常ClientAbortException Caused by: .SocketException: Connection reset by peer: socket write error查了下TOMCAT的文档,解释如下:Wrap an IOException identifying it as being caused by an abort of a request by a remoteclient.在BAIDU和GOOGLE上找了下原因,大概归结为:ClientAbortException: .SocketException: Connection reset by peer: socket writeerror的原因是由于处理http连接时,正在输出内容时,用户关闭了IE,会出现一个"ClientAbortException",属于I/O处理中出现的一个异常,应用服务器应该会捕捉。
第8章重构和完善BBS论坛系统(第3/3部分)1.1对BBS论坛系统进行其他方面的重构1.1.1面向不同的角色提供不同功能的菜单项目1、面向不同角色用户的应用系统界面设计1)企业应用系统需要面对不同身份的使用者由于企业应用系统一般是需要提供给多种不同类型的用户使用,常规的用户界面设计方法是采用一个统一的操作界面(如对于Web应用系统则是提供一个相同的全局菜单)。
但由于不同类型的用户(也就是不同的角色)所具有的访问权限是不同的,因此应用系统必须提供一定的访问控制代码来监控不同身份的访问者,这将会增加系统中安全管理和控制调度代码的复杂性。
2)面向不同角色用户的应用系统界面设计而采用面向用户角色和行为的应用系统界面设计方案,也就是面向不同的角色用户提供不同访问功能的菜单项目——只为当前角色的用户提供可见的服务。
具体在技术实现方面的基本思路是指跟踪访问者的浏览和使用行为,应用系统后台将自动地调整界面的功能输出——如菜单项目等界面元素,突出当前用户角色所需要的功能、并隐藏对用户无用的功能菜单项目。
当然,这一切都是由应用系统本身自动地完成的。
这样设计的主要目的不仅能够减少视觉干扰、优化界面输出,同时也将能够大大地降低系统中安全管理代码的复杂性,使得应用系统更利于功能维护和扩展。
下面介绍如何实现对BBS论坛系统页面中的全局导航条菜单进行重构操作,最终为不同角色用户提供不同访问功能的菜单项目。
2、在BBS论坛系统中为不同角色的用户提供不同访问功能的菜单项目1)用户没有登录系统时,只提供基本的功能菜单BBS论坛系统页面中应用Struts框架中的Logic标签来区分用户是否登录,并对登录前、后显示出的不同全局导航条菜单项目内容,来为游客(未登录系统时)与登录用户(已经成功地登录系统时)提供不同功能的菜单项目,从而提供针对不同的访问权限进行功能控制。
当然管理员成功登陆系统后的显示页面,跟普通用户成功登录系统后的显示页面也不相同。
图8.52所示为访问者用户为游客角色的用户时,只提供基本的功能菜单,如注册、登录、BBS分类、高级查询和在线帮助等方面的菜单项目。
图8.52用户没有登陆系统时,只提供基本的菜单2)为登录用户增加修改等方面的功能菜单当用户成功地登陆系统后,并识别是否为前台用户,然后再为这样角色的用户提供对应的功能菜单。
请见图8.53所示的功能菜单是在图8.52的基础上增加了“修改”(修改注册信息)和信息(查询个人注册信息)等方面的功能菜单。
图8.53 用户登陆系统后增加修改等功能菜单3)为后台管理员用户增加后台管理等方面的功能菜单当用户登陆系统成功后,并识别是否为后台管理员用户。
如果为后台管理员,则再提供与后台管理有关的功能菜单。
请见图8.54所示的功能菜单是在图8.53的基础上,增加了“后台管理”(对BBS论坛系统进行后台管理维护)方面的功能菜单。
图8.54 后台管理员登陆系统后增加后台管理等方面的功能菜单3、具体实现的Struts框架的Logic标签示例上面的功能实现是利用Logic标签来进行控制实现的,【例8-6】给出了具体实现的Logic标签示例代码。
【例8-6】具体功能实现的Logic标签示例<logic:empty name="oneUserInfoVO"><A href="/WebBBS/goUserRgister.do">注册</A>|<A href="/WebBBS/goUserLogin.do">登录</A> |</logic:empty><logic:notEmpty name="oneUserInfoVO"><A href="/WebBBS/pageForwordAction.do?action=showUserLogout">注销</A> |<A href="/WebBBS/pageForwordAction.do?action=showUpdateUserInfo">修改</A>|<A href="/WebBBS/pageForwordAction.do?action=doShowOnLineUserInfo">信息</A> |<logic:equal name="oneUserInfoVO" property="type_User_Admin" value="2" ><a href="/WebBBS/pageForwordAction.do?action=doSystemManage">后台管理</a> |</logic:equal></logic:notEmpty>1.1.2在Struts框架中应用数据源DataSource技术尽管Struts 框架是属于表示层框架,正常也只应该对MVC架构设计模式中所涉及的表示层和控制层进行技术支持,也就是在模型层方面应该是中立的。
但Struts框架的设计者考虑到应用系统中的持久层在整个项目中的重要性,因此仍然提供对持久层中的有关技术进行支持——这主要体现在提供对数据源DataSource技术的支持上。
因为如何高效和灵活地访问数据库系统、并有效地管理数据库连接Connection对象的生命周期,同时也能够为应用系统的业务处理层组件提供更灵活的数据库连接的技术支持是Struts 框架在持久层方面有所作为的主要体现。
1、Struts框架中的DataSource管理器1)javax.sql包中的DataSource接口JDBC 2.0 标准扩展包中提供了一个基于工厂方法来获取数据库连接Connection对象的javax.sql.DataSourc接口,一个DataSource对象代表了一个真正的数据源。
javax.sql包中的DataSource接口,可以采用下面三种实现形式:1)简单的实现(只提供Connection对象,如Spring框架中的DriverManagerDataSource类org.springframework.jdbc.datasource.DriverManagerDataSource类)2)连接池形式的实现(如Struts框架中的DataSource管理器)3)分布式事务形式(如BEA WebLogic应用服务器中所提供的JNDI形式的连接池DataSource实现)的实现。
在应用系统的开发中,为了能够提高应用系统中的数据访问的性能,一般都采用连接池实现形式的DataSource对象。
2)Struts DataSource管理器为了帮助开发人员有效和灵活地使用数据库连接对象,在Struts框架中提供了一个数据源管理器组件、并也提供了DataSourc接口的具体实现类;同时由该数据源管理器组件实现对DataSource接口的具体控制和管理,而数据源管理器组件是可以通过以XML配置方式来管理DataSource资源。
Struts DataSource管理器主要是通过Struts框架的XML配置文件struts-config.xml 中的<data-source>标签进行定义的。
这个管理器可以用来分发和配置任何实现了javax.sql.DataSource接口的数据库连接池(Connection Pool)。
2、Jakarta的公共连接池实现类BasicDataSourceApache Jakarta提供的公共连接池实现类mons.dbcp.BasicDataSource可以和Struts框架系统中的DataSource管理器相互合作。
如果需要在项目中应用Struts框架中的DataSource管理器以期望能够从一个DataSource接口的实现类来获得数据库连接Connection对象,首先需要下载与Jakarta的公共连接池实现类BasicDataSource相关的三个*.jar包文件,这些文件可以从网站上下载,具体请见图8.55所示的下载结果图示。
这三个文件分别是commons-pool-1.2.jar、commons-dbcp-1.2.1.jar和commons-collections.jar。
图8.55 下载与DataSource管理器相关的各个*.jar包文件的图示下载完后并对其进行解压缩,将这三个*.jar包系统文件导入到项目的WEB-INF/lib目录下,它们主要实现Struts DataSource管理器和公共连接池的本地实现。
最后的操作结果请见图8.56所示。
图8.56 导入与DataSource管理器相关的*.jar包到项目的WEB-INF/lib目录下3、在Eclipse中为本项目配置出DataSource在Eclipse开发工具中,将源代码(【Source】)窗口中的标签切换到struts-config.xml 文件的设计(【Design】)窗口显示状态, 并右击其文档显示区域,在弹出的快捷菜单中选择【New】菜单中的【DataSource】子菜单项目,如图8.57所示的操作结果。
MyEclipse工具随后将会弹出图8.58所示的对话框,在弹出的图8.58中所示的对话框中的Key输入条中输入webDataSource,而在Type输入条中输入DataSource 的实现类mons.dbcp.BasicDataSource;在Driver Class的输入条中输入net.sourceforge.jtds.jdbc.Driver(本示例计划采用JDTS的JDBC驱动程序包文件),而在URL地址输入条中输入目标数据库系统的URL地址jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBase;访问数据库系统时的用户名称为sa,而密码设置为1234。
最后的操作结果请见图8.58所示。
在图8.58所示的对话框中点击【确认】按钮后,将产生出下面的DataSource的配置项目。
在【例8-7】中定义了一个名称为webDataSource的DataSource管理器的具体实现,具体请见【例8-7】中的DataSource配置项目的示例。
如果在项目中需要多个不同的数据源,也可以为应用系统配置定义多个不同的数据源DataSource的配置项目。
此时,一定要通过不同名称的key来加以区分、并根据名称进行选择。