`
kiki1120
  • 浏览: 314475 次
  • 性别: 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 框架

    【标题】"MyOA.rar_easy_myoa_myoa靶机_oa_ssh mysql 框架" 描述了一个基于SSH框架和MySQL数据库的在线办公(OA)系统,名为MyOA,并且它具有一个易于使用的前端界面——Easy UI。这个项目可能用于企业内部的自动化...

    myoa.rar_SSH框架_java ssh mysql_myoa_myoa ssh_ssh

    这个名为"myoa.rar"的压缩包显然包含了使用SSH框架开发的一个办公自动化(OA)系统的源代码和数据库文件。让我们深入探讨一下SSH框架的各个组件以及它们在OA系统中的作用。 1. **Struts2**:这是一个基于MVC设计...

    MyOA系统

    在这款系统中,ODBC作为一个中间件,使得MyOA能够兼容多种数据库系统,如MySQL、Oracle、SQL Server等,提高了系统的灵活性和可扩展性。 在Java编程中,MyOA系统可能采用了Spring Boot框架,它简化了初始化配置,...

    myOA 系统

    在数据库方面,myOA系统可能使用了SQL Server,这是微软提供的一个强大关系型数据库管理系统,与ASP.NET有很好的集成。数据库设计应遵循规范化原则,确保数据的一致性和减少冗余,同时,可能还应用了事务处理以保证...

    myoa.zip_myoa系统

    【标题】"myoa.zip_myoa系统"指的是一个名为"myoa"的办公自动化(OA)系统的压缩包文件。这个系统设计简洁,注重用户体验,提供了基础但实用的功能,便于日常办公事务的处理。 【描述】"简单的OA系统,界面清晰,...

    权限管理系统(MyOA)

    权限管理系统(MyOA)是专为项目中的权限控制设计的一款高效解决方案。在现代软件开发中,权限管理是一个至关重要的组成部分,它确保了不同用户、角色和组能够访问和操作相应资源的安全性。MyOA系统提供了完整的代码...

    MyOA.rar_myoa

    《基于Struts2+Hibernate+Spring的华天动力系统——MyOA详解》 在IT行业中,企业级应用的开发是一项复杂而重要的任务,这通常涉及到各种框架和技术的整合使用。"MyOA.rar_myoa"这个压缩包文件,显然包含了华天动力...

    MyOA开发.zip

    【标题】"MyOA开发.zip"是一个包含JavaWeb项目的压缩包,该项目名为"MyOA",意味着这可能是一个企业级的在线办公系统。开发者通过这个项目,展示了他们在JavaWeb开发中的技能和实践经验。从描述中我们可以推测,这个...

    办公自动化系统(MyOA)

    3. **工作流审批**:MyOA 实现了工作流自动化,如报销申请、请假审批等,通过电子化流程,简化审批过程,减少纸质文档的使用,提升办公效率。用户可以自定义工作流模板,适应不同部门和业务的需求。 4. **通知公告*...

    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刷新...

    MYOA.rar_myoa_myoa20_tongda

    在“MYOA.rar_myoa_myoa20_tongda”这个压缩包中,用户可能遇到了一个常见问题——OA桌面显示乱码。这通常是由字符编码不匹配或者数据库配置错误导致的。针对这个问题,压缩包内提供了一个修复工具,它包含三个关键...

    MyOA.rar_myoa_文档全

    《MyOA.rar——初学者的法宝:C#与MyOA文档全解析》 在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows应用程序和Web应用时,它的强大功能和易用性使得它成为了开发者们的首选。"MyOA.rar"这个压缩包文件...

    myoa 系统源代码

    【标题】"myoa 系统源代码"是一款企业级的办公自动化(OA)系统,专为提升内部工作效率而设计。这款系统具有完整的功能模块,且界面采用无刷新技术,提供流畅的用户体验。 【描述】该OA办公管理系统适用于二次开发...

    MYOA2013ADV0226

    MYOA2013ADV7.13.140226

    MYOA_2013补丁包含手机短信功能

    首先,手机短信功能的引入,意味着MYOA_2013不仅限于电脑端的使用,它能够通过短信与手机用户进行交互。这对于那些无法及时登录办公系统的员工,如外出工作人员,提供了实时信息接收和发送的可能,提高了工作效率。...

    OA管理系统MyOA

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

    myoa.rar_myoa_员工_员工管理

    《员工管理OA系统——myoa》 员工管理是企业日常运营中的重要环节,而myoa系统则是一款专为员工管理设计的在线办公自动化(Office Automation,简称OA)平台。myoa系统通过集成化的功能模块,使得员工信息管理、...

    myoa.rar_MYoA是什么_https 345dao com_myoa_用户系统

    《MYOA用户管理系统详解》 MYOA,全称可能为"My Office Automation",是一个专用于企业内部用户管理的系统。该系统集成了多种关键功能,旨在优化人力资源管理,提升工作效率,确保信息安全。从标题和描述中我们可以...

Global site tag (gtag.js) - Google Analytics