J2EE项目实训Struts框架技术——第8章 重构和完善BBS论坛系统(第3部分)

合集下载

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——对Struts中的Action组件类进行STC单元测试

基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——对Struts中的Action组件类进行STC单元测试

基于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部分)

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

基于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中的监听器和拦截器等组件技术

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

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

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

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

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

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

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

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

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

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

J2EE Struts框架的课程设计实训项目《BBS论坛系统》——在论坛系统的表示层中应用EL和JSTL等技术的应用示例

J2EE Struts框架的课程设计实训项目《BBS论坛系统》——在论坛系统的表示层中应用EL和JSTL等技术的应用示例

基于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论坛系统》的需求说明

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

其中pool_size的默认值为20。

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

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

J2EE 课程设计实训项目《BBS论坛系统》——实现系统前台用户管理的DAO组件及对应的单元测试用例(第1部分)

J2EE 课程设计实训项目《BBS论坛系统》——实现系统前台用户管理的DAO组件及对应的单元测试用例(第1部分)

基于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部分)

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

基于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形式的配置文件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第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来加以区分、并根据名称进行选择。

相关文档
最新文档