`
kiki1120
  • 浏览: 307479 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

改造myoa例子,使用hsql代替mysql随webapp启动

阅读更多

首先,感谢myoa的作者,为我们提供了这样一个学习ssh的例子程序。该例子请参考另一篇博文http://mimmy.iteye.com/admin/blogs/840621

 

由于我电脑上没有安装mysql,打算使用hsql来代替mysql,用hsql的好处是数据库可以随webapp一起启动,不用在启动应用前再手动启动数据库服务,很方便。


 一、修改sql语句

用myoa提供的mysql数据库脚本生成的sql语句不符合hsql规范,需要将其进行转化。

比如,创建表:

CREATE MEMORY TABLE ADDRESS(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,USERNAME VARCHAR(20) DEFAULT '' NOT NULL,NAME VARCHAR(50) DEFAULT '' NOT NULL,SEX VARCHAR(10),MOBILE VARCHAR(20),EMAIL VARCHAR(50),QQ VARCHAR(20),COMPANY VARCHAR(100),ADDRESS VARCHAR(100),POSTCODE VARCHAR(10))

插入一条记录:

INSERT INTO USER VALUES(1,'admin','admin','abc@163.com') 


初始数据库只需要.script和.properties文件就可以了,服务启动后自动生成.log等其他文件。


二、 加入jar

hsql需要提供hsqldb.jar,它又依赖javax.servlet.jar和commons-logging.jar两个包。

将这三个包复制到\WebRoot\WEB-INF\lib下面,然后刷新一下工程,就能自动导入到工程路径中了。


三、web.xml

修改web.xml,加入处理hsql服务启动监听

 

	<context-param> 
		<param-name>hsql.dbPath</param-name> 
		<param-value>E:\Source\test\myoa\db</param-value> 
	</context-param>
	<context-param>
		<param-name>hsql.dbName</param-name>
		<param-value>demo</param-value>
	</context-param>
	<context-param>
		<param-name>hsql.port</param-name>
		<param-value>9001</param-value>
	</context-param>
	<listener>
		<listener-class>
			com.demo.HsqlStartListener
		</listener-class>
	</listener>

 

HsqlStartListener.java

 

package com.demo;

import org.hsqldb.Server;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * 该类的职责是在WebApp启动时自动开启HSQL服务。
 * 依然使用Server方式,不受AppServer的影响。
 * @author kiki1120
 * @since 2010-12-14
 */
public class HsqlStartListener implements ServletContextListener {
	
	private String path;
	private String dbName;
	private int port = -1;

	/**
	 * Listener销毁方法,在Web应用终止的时候执行"shutdown"命令关闭数据库
	 */
	public void contextDestroyed(ServletContextEvent arg0) {
		// 这里就不用说了,自然是关闭数据库操作
		Connection conn = null;
		try {
			Class.forName("org.hsqldb.jdbcDriver");
			StringBuilder url = new StringBuilder();
			url.append("jdbc:hsqldb:hsql://");
			url.append("localhost");
			url.append(port == 9001 ? "" : ":" + port);
			url.append("/").append(dbName);
			conn = DriverManager.getConnection(url.toString(), "sa", "");   
			Statement stmt = conn.createStatement();
			stmt.executeUpdate("SHUTDOWN;");
		} catch (Exception e){
			e.printStackTrace();
		}
	}

	public void contextInitialized(ServletContextEvent sce) {
		path = sce.getServletContext().getInitParameter("hsql.dbPath");
		dbName = sce.getServletContext().getInitParameter("hsql.dbName");

		try { 
			port = Integer.parseInt(sce.getServletContext().getInitParameter("hsql.port"));
		}catch(Exception e){
			port = 9001;
		}
		
		if (dbName == null || dbName.equals("")){
			System.out.println("Cant’ get hsqldb.dbName from web.xml Context Param");
			return;   
		}
		
		File dbDir = new File(path);
		
		if (!dbDir.exists()) {
			// 判断目录是否存在
			if (!dbDir.mkdirs()) {
				// 如果不存在创建,如果创建失败直接返回
				System.out.println("Can not create DB Dir for Hsql:" + dbDir);
				return;
			}
		}
		
		// 以下代码是做数据库恢复的。我们把原始的数据库放在classpath下,当启动web的时候,检查目标
		// 数据库是否存在,如果不存在,就把原始数据库复制为指定的数据库
		
		if (!path.endsWith("/")){
			path = path + "/";
		}
		
		File scriptFile = new File(path + dbName + ".script");
		File propertiesFile = new File(path + dbName + ".properties");
		
		if (scriptFile.exists() && propertiesFile.exists()){
			// 判断数据文件是否存在
			startServer(path, dbName, port);
		} else{
			System.out.println("Connect failed:Connect Hsqldb error or database files not exits!");
		}
			
	}

	/**
	 * 启动Hsqldb服务的方法
	 * @param dbPath 数据库路径
	 * @param dbName 数据库名称
	 * @param port 所使用的端口号
	 */
	private void startServer(String path, String dbName, int port) {
		// 它可是hsqldb.jar里面的类啊
		Server server = new Server();
		server.setDatabaseName(0, dbName);
		server.setDatabasePath(0, path + dbName);
		
		if (port != -1){
			server.setPort(port);
		}
		
		server.setSilent(true);
		server.start();
		System.out.println("hsqldb started…");
		// 等待Server启动
		
		try {
			Thread.sleep(800);
		} catch (InterruptedException e){
			e.printStackTrace();
		} 
	}

}

 

四、配置数据源

修改applicationContext.xml

 

	<!--  配置数据源 -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName">
			<value>org.hsqldb.jdbcDriver</value>
		</property>
		<property name="url">
			<value>jdbc:hsqldb:hsql://localhost/demo</value>
		</property>
		<property name="username">
			<value>sa</value>
		</property>
		<property name="password">
			<value></value>
		</property>
	</bean>


	<!-- 配置Hibernate -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
		<property name="mappingResources">
			<list>
				<value>com/demo/hibernate/beans/User.hbm.xml</value>
				<value>com/demo/hibernate/beans/Address.hbm.xml</value>
				<value>com/demo/hibernate/beans/Schedule.hbm.xml</value>
				<value>com/demo/hibernate/beans/Worklog.hbm.xml</value>
				<value>com/demo/hibernate/beans/Sms.hbm.xml</value>
				<value>com/demo/hibernate/beans/Notice.hbm.xml</value>
				<value>com/demo/hibernate/beans/Meeting.hbm.xml</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.HSQLDialect
				</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
	</bean>

 

现在启动tomcat看看吧。

 

另外,我在编译工程时发现了几个问题。

1、找不到junit.jar ,从eclipse中就能导进来;

2、有六个jsp出现红叉叉,打开检查,原来是form标签与table标签闭合顺序不一致,最好将form放到table的上层; 

3、导入junit.jar仍然不能编译出class文件的话,我这里编写了一个ant自动编译脚本,执行它就能解决问题。


build.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<project name="myoa" default="compile">
	
	<property name="build.src" value="src" />
	<property name="build.webroot" value="WebRoot/WEB-INF" />
	<property name="build.output" value="${build.webroot}/classes" />
	
	<target name="compile">
		<javac encoding="utf-8" destdir="${build.output}" srcdir="${build.src}" 
			   includeantruntime="false" includes="**/*.java" debug="on">
            <classpath>
            	<fileset dir="${build.webroot}/lib">
            		<include name="*.jar"/>
            	</fileset>
			</classpath>
		</javac>
		<copy todir="${build.output}">
			<fileset dir="${build.src}">
				<include name="**/*.xml"/>
				<include name="**/*.properties"/>
			</fileset>
		</copy>
	</target>

</project>
分享到:
评论
2 楼 f0rb 2011-07-14  
    public void contextInitialized(ServletContextEvent sce) {
        // 启动hsql数据库
        Server.main(new String[]{
                "-database.0", "E:\\ws_j2ee\\LoginApp\\db/czsdb",
                "-dbname.0", ALIAS,
                "-no_system_exit", "true"
        });
    }
1 楼 javer 2011-03-16  
试了下,在eclipse rcp下尝试加入hsqldb自启动,此方法不通;只得改用调cmd命令的方法,不知道其他人有什么高招没?

相关推荐

    MyOA.rar_easy _myoa_myoa靶机_oa_ssh mysql 框架

    一个OA项目,框架SSH 数据库是;mysql 前端是easy UI

    myoa.rar_SSH框架_java ssh mysql_myoa_myoa ssh_ssh

    ssh框架编写的oa系统,内含mysql数据库文件

    MYOA.rar_MySQL5_oa host.frm

    临近年末,很多企事业单位都会赶工期上马一些信息化项目,而OA办公系统无疑是其中关注和采购的重点,那么如何选好OA办公系统呢?每个系统都有自己的优缺点,究竟该如何取舍呢?本文就为选型者提供一个实用的参考。

    MYOA2016-9.7.161212破解补丁

    5、到D:\MYOA\BIN目录运行monitor.exe 并启动OA所有服务 6、检查OA所有服务是否正常开启。 7、在OA服务端上打开浏览器,输入http://localhost按提示升级(如果设置了端口的,末尾加上:端口号) 8、登录OA后按F5刷新...

    MYOA2013ADV0226

    MYOA2013ADV7.13.140226

    OA管理系统MyOA

    工作流的起源以及发展作了简单的介绍,其中主要介绍了在工作流领域的 BPMN2.0 规范,BPMN2.0 规范为工作流应用提供了语言以及图形的标准,在 1.2 小节介绍 BPMN2.0 规范目标以及该规范的部分内容,在 1.3 小节讲述了...

    MyOA开发.zip

    这是我们在学习完javaWeb所做的一个小项目,内含需求分析,数据库的dbm,代码注释也是很多滴,大家可以下载来看看,里面还有一些功能没有做,以后慢慢完善吧

    myoa 系统源代码

    这是一款公司内部的OA办公管理系统,功能比较完整,界面无刷新, 该源码比较适合二次开发人员使用,有需要的朋友不要错过啊。

    MYOA2010通达完整破解版本带通达精灵2

    MYOA2010通达完整破解版本带通达精灵2

    权限管理系统(MyOA)

    只是一个很好的权限管理模块,对于项目中的权限管理有很大的帮助,代码完整。

    通达OA MYOA2013 6.7.13.315 收集版(亲测可用)002

    1,通达OA MYOA2013 6.7.13.315 分二个压缩文件 2,通达OA2013 V6.7.130315破解补丁 V3.5 3.6-报表注册 OA精灵 分三个文件上传 以上内容经过本人测试使用正常,到目录为止没发现过不良问题 使用系统 : windows ...

    MyOA系统

    OA系统的单机版,Java制作,(使用ODBC)

    MyOA(办公自动化系统)

    传智播客的OA系统(改写版),使用Struts2,spring,hibernate,jbpm整合,系统包含了三大模块,分别是:系统管理,站内消息,审批流转。系统管理中还包含了权限分配,其中有很多技术点,比如,jquery的页面验证,强大的...

    关于.net的资料MyOA,希望有帮助

    有关.net的资料,自己在网上下载的 希望对爱好.net的人士来说有帮助 1、本系统在 Windows 2003 Server/Windows xp ...2、文件夹.MyOA\DB\下为系统所需要的数据库脚本文件 3、管理员登录名及初识口令:super/1

    myOA 系统

    数据库已经在里面了

    通达OA2011 MYOA2011 5.0.110920破解版

    我在网上找的通达OA2011破解版 ,具体版本是MYOA2011 5.0.110920,因为过大,我 分两次上传,另破解补丁也单传。我已经在我办公室电脑上测试用过。为完全破解版。望需要的用户下载,可以留言,但不要骂啊。这是第一...

    办公自动化系统(MyOA)

    这是一个标准的办公自动化系统,代码完整,可直接运行使用。

    MYOA2010通达完整破解版本带通达精灵

    MYOA2010通达完整破解版本带通达精灵 安装时请把破解版本中的webroot\general\email 删除,不能覆盖安装文件中,否者通达精灵打不开邮件系统 注意:这个是其中一个压缩包

    MyOA.rar_myoa

    本章实现了办公自动化系统,通过该系统,公司不同角色的员工可以通过网路完成日常的办公,包括撰写报告、审阅公文等。另外,系统还将实现一个系统管理员角色,对整个系统进行动态的维护。

Global site tag (gtag.js) - Google Analytics