2007年5月24日
CJDBC官网http://c-jdbc.ow2.org/
cjdbc与hibernate的整合
Configuring C-JDBC with Hibernate
C-JDBC just has to be defined as any JDBC driver in Hibernate, leaving the syntax set to the proper database. Here is a configuration example to use Hibernate with a C-JDBC cluster made of Sybase backends:
## C-JDBC
hibernate.dialect net.sf.hibernate.dialect.SybaseDialect
hibernate.connection.driver_class org.objectweb.cjdbc.driver.Driver
hibernate.connection.username user
hibernate.connection.password pass
hibernate.connection.url jdbc:cjdbc://localhost:25322/test
转自:http://lzj0470.javaeye.com/blog/445348
一、前言 |
cjdbc ( http://c-jdbc.objectweb.org/ ) 是一个open source的数据库集群中间件,任何基于jdbc的应用都可以通过它透明地访问数据库集群,它可以进行各个节点之间的数据复制,并且可以实现各个节点的查询负载均衡。通过这样的软件,偶们可以方便的实现RAIDb - Redundant Array of Inexpensive Database 廉价数据库冗余阵列。
大型应用随着用户量访问越来越大,增加数据库存储和做好数据库冗余可以增加系统的可靠性和性能。
下面利用cjdbc,把两台对等的 Mysql 做 RAIDb,本文假定你已经搭建好两台对等的 Mysql环境并建好一个需要做集群冗余的数据库 clusterdb。 |
|
二、配置环境 |
Mysql: 5.0.19, 并使用 InnoDB 作为 Mysql 引擎
C-jdbc: 2.0.2
Jdk: 1.5 |
|
三、选择合适的 C-JDBC RAIDb 机制 |
cjdbc有几种RAIDb的机制可以选择,如RAIDb-0,RAIDb-1等等,可以根据不同的情况选择不同的RAIDb的机制。各种 RAIDb的机制详情请查看 cjdbc 的文档和 Demo。
RAIDb-1有如下功能:
完全镜像处理机制,每个节点上都有完整的数据库结构,这种方式提供了最好的容错处理,并且通过设置合理的Loading Balance策略,可以带来查询性能相当好的提高。但是由于对于任何的写操作(create/update/delete),需要在各个节点上进行传播复制,写操作就会比原来慢一些了,如下图:
这里选择 RAIDb-1 做为 cjdbc RAIDb 机制。
|
|
四、给两台对等的 Mysql 建表,假设两台 Mysql 的IP分别是 192.168.0.2和192.168.0.3 |
bash> mysql -h192.168.0.2 -uroot
bash> use clusterdb
bash> create table user (id int(3) not null auto_increment primary key, name char(50) not null) engine innodb;
bash> exit;
bash> mysql -h192.168.0.3 -uroot
bash> use clusterdb
bash> create table user (id int(3) not null auto_increment primary key, name char(50) not null) engine innodb;
bash> exit; |
|
五、在 Linux 下安装 C-JDBC Controller |
bash> mkdir -p /usr/local/c-jdbc
bash> cd /usr/local/c-jdbc
bash> tar xvfz c-jdbc-2.0.2-bin.tar.gz
bash> export CJDBC_HOME=/usr/local/c-jdbc
|
|
六、把 Mysql JDBC Driver 放到 C-JDBC Controller 中来 |
这里我们使用 mysql-connector-java-3.1.12-bin.jar 驱动程序,把它放到
/usr/local/c-jdbc/drivers 中
|
|
七、配置 C-JDBC Controller |
1、在 /usr/local/c-jdbc/config/virtualdatabase 目录中创建 虚拟数据库配置文件,并把它命名为 mysql-raidb1-distribution.xml,内容如下:
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE C-JDBC PUBLIC "-//ObjectWeb//DTD C-JDBC 2.0.2//EN" "http://c-jdbc.objectweb.org/dtds/c-jdbc-2.0.2.dtd">
<C-JDBC>
<VirtualDatabase name="myDB">
<Distribution>
</Distribution>
<AuthenticationManager>
<Admin>
<User username="admin" password="c-jdbc"/>
</Admin>
<VirtualUsers>
<VirtualLogin vLogin="boss" vPassword="boss"/>
</VirtualUsers>
</AuthenticationManager>
<DatabaseBackend name="mysqlNode211" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://192.168.0.2/clusterdb" connectionTestStatement="select 1">
<ConnectionManager vLogin="boss" rLogin="boss_user" rPassword="123456">
<VariablePoolConnectionManager initPoolSize="10" minPoolSize="10" maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
</ConnectionManager>
</DatabaseBackend>
<DatabaseBackend name="mysqlNode213" driver="org.gjt.mm.mysql.Driver" url="jdbc:mysql://192.168.0.3/clusterdb" connectionTestStatement="select 1">
<ConnectionManager vLogin="boss" rLogin="boss_user" rPassword="123456">
<VariablePoolConnectionManager initPoolSize="10" minPoolSize="10" maxPoolSize="50" idleTimeout="30" waitTimeout="10"/>
</ConnectionManager>
</DatabaseBackend>
<RequestManager>
<RequestScheduler>
<RAIDb-1Scheduler level="passThrough"/>
</RequestScheduler>
<LoadBalancer>
<RAIDb-1>
<WaitForCompletion policy="first"/>
<RAIDb-1-LeastPendingRequestsFirst/>
</RAIDb-1>
</LoadBalancer>
</RequestManager>
</VirtualDatabase>
</C-JDBC>
|
2、在 /usr/local/c-jdbc/config/controller 目录中创建 C-JDBC controller 配置文件,并把它命名为 uud-controller-distributed.xml,内容如下:
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE C-JDBC-CONTROLLER PUBLIC "-//ObjectWeb//DTD C-JDBC-CONTROLLER 2.0.2//EN" "http://c-jdbc.objectweb.org/dtds/c-jdbc-controller-2.0.2.dtd">
<C-JDBC-CONTROLLER>
<Controller port="25323">
<JmxSettings>
<RmiJmxAdaptor port="1091"/>
</JmxSettings>
<VirtualDatabase configFile="mysql-raidb1-distribution.xml" virtualDatabaseName="myDB" autoEnableBackends="true"/>
</Controller>
</C-JDBC-CONTROLLER>
|
3、在 /usr/local/c-jdbc/config/demo 目录中创建启动 C-JDBC controller sh,并把它命名为 uud-distributed-raidb1-controller.sh,内容如下:
#!/bin/sh
export CJDBC_HOME=/usr/local/c-jdbc
export JAVA_HOME=/opt/jdk1.5
cd $CJDBC_HOME/bin
echo "Waiting for mysql servers to finish start up"
echo "Starting Controller"
./controller.sh -f ../config/controller/uud-controller-distributed.xml &
|
|
|
八、启动 C-JDBC Controller |
bash> cd /usr/local/c-jdbc/demo
bash> chmod u+rwx uud-distributed-raidb1-controller.sh
bash> ./uud-distributed-raidb1-controller.sh &
如果启动正常,显示的信息如下:
Waiting for mysql servers to finish start up
Starting Controller
2006-04-20 10:32:21,126 INFO controller.core.Controller C-JDBC controller (2.0.2)
2006-04-20 10:32:21,189 INFO controller.core.Controller Loading configuration file: ../config/controller/uud-controller-distributed.xml
2006-04-20 10:32:21,278 INFO controller.core.Controller JMX is enabled
2006-04-20 10:32:21,308 INFO controller.core.Controller Starting JMX server on host: 127.0.0.1
2006-04-20 10:32:21,674 INFO backend.DatabaseBackend.mysqlNode211 Adding connection manager for virtual user "boss"
2006-04-20 10:32:21,749 INFO backend.DatabaseBackend.mysqlNode213 Adding connection manager for virtual user "boss"
2006-04-20 10:32:21,809 INFO controller.RequestManager.myDB Request manager will parse requests with the following granularity: NO_PARSING
2006-04-20 10:32:21,814 INFO controller.virtualdatabase.myDB Configuring jgroups using: file:/usr/local/c-jdbc/config/jgroups.xml
-------------------------------------------------------
GMS: address is 127.0.0.1:32773
-------------------------------------------------------
2006-04-20 10:32:26,476 INFO controller.virtualdatabase.myDB Group myDB connected to /127.0.0.1:32773[/127.0.0.1:32773]
2006-04-20 10:32:26,476 INFO controller.virtualdatabase.myDB First controller in group myDB
2006-04-20 10:32:26,477 WARN controller.virtualdatabase.myDB No recovery log has been configured, enabling backend without checkpoint.
[1]+ Done ./uud-distributed-raidb1-controller.sh
|
|
|
八、编写 C-JDBC 客户端程序 |
1、把 C-JDBC Drivers(/usr/local/c-jdbc/drivers/c-jdbc-driver.jar) 放置到 CLASSPATH 中
2、编写插入 10 条数据到 Mysql 中,程序如下:
/**
* @author 胡荣华
* @Company 世纪龙 21cn
*/
package com.cjdbc.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.DriverManager;
/**
*
*/
public class GenerateSampleData {
public void generate() {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 这是 c-jdbc drivers 的 Drivers class,注意不是 mysql 的 Drivers class
Class.forName("org.objectweb.cjdbc.driver.Driver").newInstance();
// 192.168.0.1 是 cjdbc controller 所在的 ip
// myDB 是在 文件 mysql-raidb1-distribution.xml 里定义的 <VirtualDatabase name="myDB">
// user=boss&password=boss 是在 文件 mysql-raidb1-distribution.xml 里定义的
// <VirtualUsers>
// <VirtualLogin vLogin="boss" vPassword="boss"/>
// </VirtualUsers>
String url = "jdbc:cjdbc://192.168.0.1:25323/myDB?user=boss&password=boss";
conn = DriverManager.getConnection(url);
try{
conn.setAutoCommit(false);
pstmt = conn.prepareStatement("insert into user values ('', ?)");
int numOfTestRecords = 10;
System.out.println("Update Record Start.");
for (int i=0;i<numOfTestRecords;i++) {
String newkey = i + "-" + i;
pstmt.setString(1, "hua_" + newkey);
pstmt.executeUpdate();
}
conn.commit();
System.out.println("Update Record Success.");
}
catch(Exception ex){
conn.rollback();
ex.printStackTrace();
}
finally{
try {
if( pstmt != null )
pstmt.close();
if( conn != null)
conn.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GenerateSampleData g = new GenerateSampleData();
g.generate();
}
}
|
3、程序执行完毕后,分别到 Mysql Node 192.168.0.2 和 192.168.0.3 查询,看看是否已同步了数据,如果两个 Mysql Node 都有相同的数据,说明 C-JDBC 环境搭建成功。
|
|
posted @
2010-03-25 20:23 Dong 阅读(394) |
评论 (0) |
编辑 收藏
最近做了一个日志管理系统
个人觉得采用了一套非常非常创新或者变态的开发方式,就像题目说的那样,使用web的方法开发桌面应用程序,当然所有的技术都是基于java的。
总结一下在整个项目中使用到的技术
1、底层服务器的开发socket通信、http报文解析、反射机制(这些技术其实就是开发了一款小型的服务器,让我们的web代码能够在本地运行起来,之所以选择自己开发服务器的原因是,tomcat对于我们这个小桌面程序来说还是太大了点,如果作为桌面启动,用户不可能等待程序启动这么长的时间,我给这个服务器起了个名字叫做jnet)
2、SWT,包括的浏览器控件和窗口等。
3、使用installanywhere来打包程序,方便发布
4、前台展现数据使用了ext2.2
5、扩展自己开发的服务器jnet,开发出自己的“action”,应该来说还是符合MVC的
数据库使用的是access,采用jdbc的方式访问,你知道,如果在桌面软件上使用hibernate...
好了,不说废话
先贴出成品的效果图
1、桌面图标
2、登录界面
3、登录效果图
4、主界面
是不是觉得还不错呢?JAVA也可以扬眉吐气开发出这样的桌面系统,可惜的是因为使用到了SWT,所以整个项目并不能跨平台,放到linux系统下去运行。
好了先理一理,发一张项目的原理图
看图说话,我们整个项目的构架,就是这个样子的,采用SWT封装了IE作为前台展现,后台使用自己开发的服务器作为后台来处理数据,中间数据通信方式当然就只能是http了
所以中心思想就是,我开发了个服务器,这个服务器能够让用户扩展自己的类,自己的方法,然后用户就可以根据自己的需要来书写自己的系统,最最最重要的就是,让我们这些写惯了J2EE的人能够使用已经形成的思维来编写桌面系统,我们可以不需要再去学swing和swt,可以使用html的方式来做前台的布局,因为老实说我每次写桌面程序的时候,总会把代码弄得一团糟,在web系统上容易规规矩矩的写出分层的代码,桌面系统...布局就让我头大(我的意思是当你跑出去接私活干的时候,不用再学一套东西,呵呵)。
好了,这个帖子只是一个简单的介绍,整个系统具体的实现方式,会在后续的帖子中一步步解析,大家有什么意见或者建议可以给我留言,谢谢!
posted @
2009-03-19 15:16 Dong 阅读(4351) |
评论 (23) |
编辑 收藏
开发的时候有时候会碰到这样的情况,我们在写程序的时候并不知道需要调用某个对象的哪个方法,只有程序运行后,我们才能够知道。或许我们需要根据客户端传过来的某个String参数的值来判断我们应该执行哪个方法。在这种情况下JAVA的反射执行就可以帮上忙了。下面是我做的一个简单的测试代码,提供给大家做个参考。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/** *//**
* @author Dong
* 测试JAVA reflect机制
*/
public class TestRef{
/** *//**
* @param args
*/
public static void main(String[] args){
TestBean test = new TestBean();
Method[] methods = test.getClass().getMethods();
test.setAbc("---");
for(int i=0;i<methods.length;i++){
if(methods[i].getName().equalsIgnoreCase("getabc")){
try {
System.out.println(methods[i].invoke(test));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
}
posted @
2008-06-05 16:36 Dong 阅读(10165) |
评论 (7) |
编辑 收藏
(String[])ArrayList.toArray(new String[0]);
posted @
2008-06-02 11:25 Dong 阅读(791) |
评论 (0) |
编辑 收藏
XML里是无法直接正常输出&等特殊字符的,可用&转义表示!
posted @
2008-05-21 09:03 Dong 阅读(473) |
评论 (0) |
编辑 收藏
1、数字格式化
<fmt:formatNumber value="33.33333" pattern="#.0"></fmt:formatNumber>-->输出33.3
pattern中符号的约束规定
0 一个数位
# 一个数位,前导零和追尾零不显示
. 小数点分割位置
, 组分隔符的位置
- 负数前缀
% 用100乘,并显示百分号
其他任何符号 在输出字符串中包括指定符号
2、日期格式化
<fmt:formatDate value="${vo.lateCompleteDate}" type="both" pattern="yy-MM-dd"/>
posted @
2008-05-20 09:29 Dong 阅读(1754) |
评论 (0) |
编辑 收藏
HashMap<String,String> testMap = new HashMap<String,String>();
for (Map.Entry<String, String> entry : testMap .entrySet()) {
entry.getKey();
entry.getValue();
}
posted @
2008-05-19 17:09 Dong 阅读(312) |
评论 (0) |
编辑 收藏
ApplicationContext ctx = new ClassPathXmlApplicationContext("application-config.xml");
Map<String,String> bureauMap = ((DictionaryService)ctx.getBean("dictionaryService")).getBureauMap();
posted @
2008-05-19 16:45 Dong 阅读(259) |
评论 (0) |
编辑 收藏
今天在调试一个Servlet程序的时候,报了以下错误!
java.lang.IllegalStateException: Cannot forward after response has been committed
根据字面理解的话,意识是在response已经提交后程序不能再一次的跳转!
研究代码以后发现,是因为前面已经执行过一次request.request.getRequestDispatcher().forward()
但是后面的request.request.getRequestDispatcher().forward()依然被执行到了!
那么很有理由相信request.request.getRequestDispatcher().forward()跳转本身是不会返回什么,也不会终止程序体的执行!
程序体后面该执行的还是会执行!
posted @
2008-04-17 10:28 Dong 阅读(7736) |
评论 (1) |
编辑 收藏
<Resource name="jdbc/dong" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/dong">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value>colorful</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/dong</value>
</parameter>
</ResourceParams>
使用如上配置的时候一直报这个
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'错误
在网络上寻觅后发现是因为Tomcat版本引起的,改成如下问题就消失了
<Resource
name="jdbc/dong"
type="javax.sql.DataSource"
password="colorful"
driverClassName="org.gjt.mm.mysql.Driver"
maxIdle="2"
maxWait="5000"
username="root"
url="jdbc:mysql://localhost:3306/dong"
maxActive="4"/>
posted @
2008-02-24 13:47 Dong 阅读(2682) |
评论 (1) |
编辑 收藏
1、 解决Action过多问题
通过DispatchAction的方式
建立一个继承自DispatchAction的Action
此类Action允许我们在表单中带有参数,根据参数执行Action中的不同方法,以此实现Action的多用
步骤
① 建立一个继承自DispatchAction的Action规定方法名称
② 在表单页面中添加一个隐藏域值,假设为codi value=”insert”
③ 在Struts-config.xml的相应Form中action项目中设置parameter参数值为codi
那么当表单提交的时候,Action中的insert()方法就会被执行,可以通过改隐藏域中的值的方式来改变Action要执行的方法
2、 解决ActionForm过多的问题
通过动态ActionForm的方式,即DynaActionForm
步骤
① 在Struts-config.xml
<form-beans>
<form-bean name=”abcForm” type=”org.apache.struts.action.DynaActionForm”>
<form-property name=”userid” type=”java.long.String”></form-property>
</form-bean>
</form-beans>
② 在Struts-config.xml
更改相应的action中的attribute和name为abcForm
这样就配置好了一个动态的ActionForm
3、 解决动态ActionForm的验证问题
通过动态验证ActonForm的方式,即DynaValidatorForm
步骤
① 在Struts-config.xml
同2的第一步,但是type需要改成org.apache.struts.action.DynaValidatorForm
② 配置一个validation.xml文件
<form-validation>
<formset>
<form name="abcForm">
<field property="userid" depends="required">
<arg key="err.userid" resource="true"/>
</field>
</form>
</formset>
</form-validation>
③ 在Struts资源文件中配置err.userid、以及errors.required
④ 在Struts-config.xml配置相应的action,添加validate=”true”添加验证支持
⑤ 添加struts Plugin插件
设置plugin class为org.apache.struts.validator.ValidatorPlugIn
添加propertys
Propertyà pathnames
Valueà /WEB-INF/validator-rules.xml,/WEB-INF/validation.xml
这样一个验证框架就配置好了!
posted @
2008-02-12 13:47 Dong 阅读(3473) |
评论 (6) |
编辑 收藏
读Excel:
Workbook workbook = null;
try
{
workbook = Workbook.getWorkbook(new File(path));
}
catch(Exception e)
{
System.out.println(e);
}
Sheet sheet = workbook.getSheet(0);
Cell cell=sheet.getCell(i,j);//读第i列,第j行表格的值
System.out.println(cell.getContents());
对于循环读出可以使用
sheet.getRows();方法得到行数
sheet.getColumns();方法得到列数
写Excel:
Workbook wb = Workbook.getWorkbook(new File(path));
WritableCellFormat wcf = new WritableCellFormat();
book = Workbook.createWorkbook(new File(path, wb);
sheet = book.getSheet(0);
jxl.write.Label name = new jxl.write.Label(i,j,"abc",wcf);//在第i列,第j行写入"abc"值,风格为wcf,如果写入的是数字则使用jxl.write.Number
sheet.addCell(name);
try
{
book.write();
book.close();
}
catch(WriteException e){}
catch(IOException e){}
单元格风格:
设置边框—
WritableCellFormat wcf = new WritableCellFormat();
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setBorder(Border.RIGHT,BorderLineStyle.THIN);
wcf.setBorder(Border.LEFT,BorderLineStyle.THIN);
wcf.setBorder(Border.BOTTOM,BorderLineStyle.THIN);
合并单元格-
sheet.mergeCells(0,1,0,2)
合并(0,1)、(0,2)两个单元格
设置字体-
WritableFont wf = new WritableFont(WritableFont.ARIAL,12, WritableFont.BOLD, false);
WritableCellFormat wcf = new WritableCellFormat(wf);
以及其它各种单元格样式,如设置背景颜色
都可以通过设置WritableCellFormat来设置
还有一点需要说明一下,JXL组件对于公式的支持似乎比Apache的poi好
posted @
2008-02-01 16:16 Dong 阅读(4975) |
评论 (2) |
编辑 收藏
原来弄过QuaQua的东西,但是一直不能把JFrame和JDialog变成Ox mac的样式
原因是,如果系统并不是苹果的系统就需要显示的加载JFrame和JDialog的样式
System.setProperty("Quaqua.tabLayoutPolicy","wrap");
if(!System.getProperty("os.name").toLowerCase().startsWith("mac"))
{
try
{
Methods.invokeStatic(JFrame.class, "setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
Methods.invokeStatic(JDialog.class, "setDefaultLookAndFeelDecorated", Boolean.TYPE, Boolean.TRUE);
}
catch(NoSuchMethodException e)
{
e.printStackTrace();
}
}
try
{
UIManager.setLookAndFeel("ch.randelshofer.quaqua.QuaquaLookAndFeel");
}
catch(Exception e){}
posted @
2008-01-26 13:01 Dong 阅读(2958) |
评论 (6) |
编辑 收藏
Junit主要是用来对我们的程序代码进行白盒测试的一个组件。
首先我们需要得到Junit.jar的包,可以到www.junit.org下载得到。
下载以后将我们的Junit.jar包添加到工程里面,那么OK,就可以开始对我们的程序进行测试了。
对一个文件进行测试的时候需要自己制作一个类并继承TestCase,如:
package cn.colorful.junit;
import junit.framework.Assert;
import junit.framework.TestCase;
import cn.colorful.sample.*;
public class TestSample extends TestCase {
private Sample sam = null;
protected void setUp() throws Exception {
sam = new Sample();
}
protected void tearDown() throws Exception {
sam = null;
}
public void testSample() {
Assert.assertNotNull(sam);
Assert.assertEquals("ab", sam.getName("a", "b"));
Assert.assertEquals("dong", sam.getName("do", "ng"));
}}
其中程序的运行过程是TestCase的构造方法、setUp方法(对程序中使用的一些资源进行分配)、运行测试、tearDown()(去处一些使用到的资源)
这样程序会自动判断Sample类中的getName方法返回的值是不是符合我们的要求,使用Junit测试的运行方式,程序会调用Assert类中的静态方法对测试程序的返回值和期望值等情况进行判断、还有一些判断对象是否为空的方法,当出现绿色的时候代表程序是正常运行的
当书写了很多测试类后,可以条使用TestSuite类对测试类进行打包测试,如:
package cn.colorful.junit;
import junit.framework.Test;
import junit.framework.TestSuite;
public class TestPackage{
public static Test suite()
{
TestSuite tes = new TestSuite("Test for cn.colorful.sample");
tes.addTestSuite(TestSample.class);
tes.addTestSuite(TestSampleTwo.class);
return tes ;
}
}
程序需要实现suite()方法,并且返回出一个TestSuite对象。
posted @
2007-12-25 16:12 Dong 阅读(1253) |
评论 (2) |
编辑 收藏
1、实现自定义Taglib的类需要实现javax.servlet.jsp.tagext.IterationTag或者
javax.servlet.jsp.tagext.TagSupport、javax.servlet.jsp.tagext.BodyTag接口,目前J2EE提供了两
个分别实现了这两个接口的类,我们只需要直接继承就可以,它们分别为BodyTagSupport、TagSupport
继承两个类中的一个就可以完成一个属于自己的Taglib类
package cn.dong;
import java.io.IOException;
import cn.dong.Person ;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagServer extends TagSupport {
String name ;
public void setName(String name) {
this.name = name;
}
public int doStartTag() throws JspException {
Person per = new Person() ;
try {
pageContext.getOut().println("Userid:"+name) ;
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY ;
}
}
2、写tld文件
tld文件本身是xml标准文档的一种,可以通过tld文件配置出Taglib的各种标记所对应的类实现
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>//标签描述
<jspversion>1.1</jspversion>
<shortname>mytag</shortname>
<uri></uri>
<tag>
<name>hello</name>//标签方法名
<tagclass>cn.dong.TagServer</tagclass>//指向的类
<bodycontent>empty</bodycontent>
<info>Tag with Parameter</info>
<attribute>//定义传递的属性值
<name>name</name>//属性名
<required>true</required>//属性值是否必须传输
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
这样一个自定义标记就写好了,但是要使用它我们还需要在项目中配置
3、项目部署文件web.xml
<taglib>
<taglib-uri>hello</taglib-uri>
<taglib-location>/WEB-INF/Web.tld</taglib-location>
</taglib>
4、在JSP页面中调用Taglib
<%@ taglib uri="hello" prefix="show" %>
这样我们就完成了所有配置
在页面中使用类似<show:hello name="dong"/>就可以看到我们配置的Taglib起的作用了
posted @
2007-12-19 11:07 Dong 阅读(1079) |
评论 (3) |
编辑 收藏
我对DAO的理解就是对数据库的访问封装在一个接口里,当用户需要访问数据库的时候只需要简单的对调用接口,而不需要和数据库有直接的接触。
下面介绍一个简单的DAO对数据库访问的建立:
首先我们需要建立
1、一个DAO接口:UserDAO.java在里面定义数据库操作的所有方法
2、一个实现了DAO接口的类、UserDAOImpl.java,完成了对DAO的实现并且将取得的数据存放到VO类中。
3、一个数据库访问的基础类、DataBaseConnection.java里面封装了对数据库的连接Connection,外部访问这个类的方法可以返回一个Connection接口的实现
4、一个VO类,UserVO.java,里面包含了所有需要返回的出来的数据、利用set方法和get方法对类对象进行基本的设置
5、一个Factory类,封装了具体实现了UserDAO接口的UserDAOImpl类对象,调用Factory类的时候直接返回一个UserDAO的对象
这样的话一个DAO设计就完成了
这个时候当我们需要对数据库进行访问的时候只需要声明一个UserDAO接口然后实例化一个工厂类实现UserDAO接口,这样我们就可以遍历VO类得到我们要的数据。
posted @
2007-12-16 16:30 Dong 阅读(1136) |
评论 (1) |
编辑 收藏
Filter Servlet中传递的request和response对象分别是ServletRequest和ServletResponse接口的对象,而不是一般Servlet中的HttpServletRequest和HttpServletResponse接口的对象,ServletRequest是HttpServletRequest的父接口,很多方法是没有的,比如说request.getSession() ;所以如果想在Filter中读取session对象必须对request做一定的向下转型。
而实现HttpSessionListener 的Listener Servlet中的传递的对象是HttpSessionEvent的对象,想在其中实现对Application对象的访问的话:arg0.getSession().getServletContext().setAttribute();
另:今天把MySQL装到电脑上,利用Servlet连接了一下,老是报ClassNotFound的错误,原因是MySQL的JDBC驱动只有一个mysql-connector-java-5.0.8-bin.jar,另外一个不能够拷到lib目录下。
posted @
2007-12-13 01:02 Dong 阅读(572) |
评论 (0) |
编辑 收藏
Struts 使用 Model 2 架构。Struts 的ActionServlet 控制导航流。其他Struts 类,比如
Action, 用来访问业务逻辑类。当 ActionServlet 从容器接收到一个请求,它使用URI (或者
路径“path”) 来决定那个Action 将用来处理请求。一个 Action可以校验输入,并且访问业务
层以从数据库或其他数据服务中检索信息。
为校验输入或者使用输入来更新数据库, Action 需要知道什么指被提交上来。并不是
强制每个Action 从请求中抓取这些值,而是由 ActionServlet 将输入绑定到JavaBean中。
输入 bean是Struts ActionForm c类的子类。ActionServlet 通过查找请求的路径可以决定使用
哪个ActionForm,Action 也是通过同样的方法选取的。ActionForm 扩展
org.apache.struts.action.ActionForm类。每个都必须以HTTP 响应进行应答。 通
常, Struts
Action 并不自行加工响应信息,而是将请求转发到其他资源,比如JSP 页面。Struts 提
供一个ActionForward 类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后,
Action 选择并向Servlet返回一个ActionForward。Servlet 然后使用存储在ActionForward 对
象中的路径来调用页面完成响应。
Struts 将这些细节都绑定在一个ActionMapping 对象中。每个ActionMapping 相对于一
个特定的路径。当某个路径被请求时,Servlet 就查询ActionMapping 对象。ActionMapping
对象告诉servlet,哪个Actions, ActionForms, 和 ActionForwards 将被使用。
所有这些细节,关于Action, ActionForm, ActionForward, ActionMapping,以及其
他一些东西,都在struts-config.xml 文件中定义。 ActionServlet 在启动时读取这个配置文件,
并创建一个配置对象数据库。在运行时,Struts 应用根据文件创建的配置对象,而不是文件
本身
posted @
2007-12-08 10:52 Dong 阅读(225) |
评论 (0) |
编辑 收藏
<head>
<title>无标题文档</title>
<style type="text/css">
<!--
.hidecontent {display:none;}
-->
</style>
<script language="javascript">
function switchTag(content)
{
// alert(tag);
// alert(content);
for(i=1; i <6; i++)
{
if ("content"+i==content)
{
document.getElementById(content).className="";
}else{
document.getElementById("content"+i).className="hidecontent";
}
document.getElementById("content").className=content;
}
}
</script>
</head>
<body>
<div id="container">
<ul>
<li><a href="#" onmouseover="switchTag('content1');this.blur();"><span>标题一</span></a></li>
<li><a href="#" onmouseover="switchTag('content2');this.blur();"><span>标题二</span></a></li>
<li><a href="#" onmouseover="switchTag('content3');this.blur();"><span>标题三</span></a></li>
<li><a href="#" onmouseover="switchTag('content4');this.blur();"><span>标题四</span></a></li>
<li><a href="#" onmouseover="switchTag('content5');this.blur();"><span>标题五</span></a></li>
</ul>
</div>
<div id="content" class="content1">
<div id="content1" >标题一中的东西</div>
<div id="content2" class="hidecontent">标题二中的东西</div>
<div id="content3" class="hidecontent">标题三中的东西</div>
<div id="content4" class="hidecontent">标题四中的东西</div>
<div id="content5" class="hidecontent">标题五中的东西</div>
</div>
</body>
</html>
只是一个简单的实现方法,具体的样式美观方面的东西可以自己修改。
posted @
2007-11-11 11:39 Dong 阅读(1513) |
评论 (4) |
编辑 收藏
最近开发个后台系统,使用到了eWebEditor,原先并没有使用过相关方面的在线编辑器。所以一用起来问题一大堆!都不知道用什么编辑器好,研究了FCKEditor等一些国外的编辑器后还是觉得应该支持国货!
选顶了编辑器后之后还算顺利,但是没过多久就出现了另外一个问题,使用eWebEditor编辑后并保存到数据库中的字符串是以HTML源码的形式!这样上传和前台显示是都没有问题的。但是后台中有个修改新闻的功能,当我将HTML形式的代码传递给eWebEditor的时候,惊喜就出现了!!编辑器显然不买我的帐~~~没反应???
下面的就是调用编辑器的JS代码,其中value中的content值代表Html源码!!然后eWebEditor就不能显示出来,也不报错,就是在页面中空了一块,哪位仁兄知道解决办法,麻烦告诉一下,Thanks!!!!!!
<script language=javascript>
document.write ("<INPUT type='hidden' name='content1' value='<%=content%>'>");
document.write ("<IFRAME ID='eWebEditor1' src='ewebeditor.htm?id=content1&style=" + URLParams["style"] + "' frameborder='0' scrolling='no' width='580' height='300'></IFRAME>");
setTimeout("setValue();",1000);
</script>
经过一夜奋战,以及对于问题的研究。终于找到解决方法了,步骤如下:
1、讲content的内容进行Html编译,Server.HTMLEncode(content)
2、第二个问题将隐藏的文本框改成文本域,就可以了
posted @
2007-11-08 23:59 Dong 阅读(947) |
评论 (2) |
编辑 收藏
硬盘中出现了两个病毒程序SVOHOST.EXE 和AUTORUN.INF文件。
1)打开任务管理器将SVOHOST.EXE结束任务
2)运行 cmd
进入出现问题的盘符,如e:
输入:dir/a
看看有没有SVOHOST.EXE 和AUTORUN.INF
如果有
则输入:attrib -a -s -h -r sxs.exe
attrib -a -s -h -r autorun.inf
分别执行(目的是取消这两个文件的隐藏属性)
3)然后 del sxs.exe
del autorun.inf
(目的是删除文件)
4)运行 regedit
搜索 sxs.exe
在注册表中找到后直接删除所有的sxs.exe文件
5)最后运行msconfig 在启动项中把SVOHOST.EXE去掉
posted @
2007-08-25 12:58 Dong 阅读(1802) |
评论 (3) |
编辑 收藏
FusionCharts是一个能帮你创建其引人注目的动态图像效果的Macromedia Flash控件。充分利用Macromedia Flash所具有的流畅功能来创建简洁的、交互式的和引人注目的动态图像。
技术细节
设想所有的图形组成不需要任何的安装,你可以在你的能想到的语言环境中进行工作,并能在多数的浏览器中运行,建立漂亮的、栩栩如生的效果。假设你的数据在有限的时间、空间、WEB内不停的发生改变。FusionCharts刚好帮助你实现所有想像出来的事物。
现在Flash的应用确实越来越广泛,无论动画、导航以及一些复杂的组件,都可以使用Flash技术很好的解决。Flash的前景我是非常看好的。FusionCharts就是其中一个非常好的代表!!应该来说应用起来也是非常方便的。而且功能强大、生成的图表动态、而且美观。
这个就是FusionCharts免费版本生成的一张图表
http://www.fusioncharts.com/LiveDemos.asp
http://www.sstc.org.cn/Components/DetailView.aspx?id=d0e65bb6-4192-4c17-a940-200640703d5b&typename=basic
posted @
2007-08-23 16:04 Dong 阅读(1170) |
评论 (1) |
编辑 收藏
server.xml中的<host></host>中写入
<Context path="" docBase="E:\myweb" debug="0" reloadable="true" crossContext="true" />
//科学计数法的转换//
DecimalFormat df = newDecimalFormat("####.000");
df.format(要格式的值);
/***************//
DecimalFormat format = (DecimalFormat) NumberFormat.getPercentInstance();
format.applyPattern("#####0");
String temp = format.format(Double.MAX_VALUE);
System.out.println(temp);
posted @
2007-07-31 12:26 Dong 阅读(215) |
评论 (0) |
编辑 收藏
MapXtreme Java,是目前用于Internet或企业Intranet唯一的100%纯Java地图服务器。MapInfo MapXtreme Java与J2EE兼容,为开发人员开发应用提供了无与伦比的灵活性。MapXtreme Java向应用开发商提供了一个高度可视化的、直观的组件,方便他们将地图功能集成到任何Web应用中。MapXtreme Java帮助用户在企业内部轻松实现信息共享,更好地向顾客提供服务,做出商业决策,更有效地管理资产和运营。
可扩展性
MapXtreme Java使用智能Java线程,可同时为多个客户端服务,这样降低了每个客户端的内存消耗,并当增加CPU(或者集群)后保证性能成比例提高。它可以适于处理高强度的使用需求。
多平台
MapXtreme Java 可以在异构硬件环境下运行(Linux,UNIX,NT等)。 Map Xtreme Java 向所有PC或UNIX工作站的web浏览器发送地图,而无需专用插件。
编写一次,随处运行
无论未来选择何种硬件和软件平台,Map Xtreme Java 应用(代码)都可以方便地被移植和重用,节约了开发时间和成本。
快速应用开发与部署
Map Xtreme Java版附带有Java Beans,可加快应用开发。因为它可以用于可视化的Internet开发环境 (IDEs),例如Borland JBuilder、Oracle Jdeveloper或Sun ONE Studio,开发商可以采用标准的拖放、设置属性机制,将对象添加到应用中。
灵活性
MapXtreme Java支持大量的网络开发,包括瘦、中和胖的web浏览器客户端。
测试环境
操作系统
Solaris 8&9 HP UX11
Red Hat Linux Advanced Server 2.1
Windows 2000 Server Edition
Windows Server 2003 Enterprise Edition
应用服务器
Tomcat 4.1.18
Weblogic7
WebSphere 5.X (需提供J2SE 1.4)
Sun ONE 7
Oracle IAS
数据库Oracle 8i Spatial (8.1.7) \ Oracle 9i2 Spatial \Oracle 9i2 Locato \SQL Server 2000 w/SpatialWare 4.6 \Informix 9.3w/SpatialWare 4.5
系统要求
MapXtreme Java版的目的是允许在任何支持Java虚拟机的平台上开发地图应用。下面是实施地图应用的必要条件:
支持Sun servlet 2.3的servlet容器
与1.4.1 02或更高版本的虚拟机相兼容的Java 2 平台
安装在服务器上的视频卡。对Sun Solaris来说,可以是视频卡,也可以是虚拟框架缓冲(如Java 2D增强图形功能所需)
9MB(针对服务器文件)-760MB(全部安装)的硬驱空间(安装需要40MB)
地图数据需要的135MB的硬盘空间
256MB内存
地址:http://www.mapinfo.com.cn
posted @
2007-07-30 12:11 Dong 阅读(407) |
评论 (0) |
编辑 收藏
java2word 是一个在java程序中调用 MS Office Word 文档的组件(类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。
这些服务包括:
打开文档、新建文档、
查找文字、替换文字,
插入文字、插入图片、插入表格,
在书签处插入文字、插入图片、插入表格等。
填充数据到表格中
读取表格数据
在线文档:http://www.heavenlake.com/java2word/doc
下载地址:http://dev.heavenlake.com:81/developer/listthreads?forum=8
posted @
2007-07-26 15:35 Dong 阅读(7082) |
评论 (3) |
编辑 收藏
{InstallAnywhere 6 Enterprise}\resource\installer_vms下放着可用的vm,任意选择一个,把其文件后缀改为zip文件解压,可得到两个文件:vm.properties和vm.zip,解压vm.zip可以得到vm文件夹,其下就是java的jre中的所有内容,如果你的JRE是缺省安装的话可以到C:\Program Files\Java\j2re1.4.2下对照,一目了然,一模一样,只是在压缩了C:\Program Files\Java\j2re1.4.2这个文件下的所有内容后得到vm.zip,添加一个vm.properties,其内容为:
vm.platform=windows
vm.platform.flavor=win32
vm.name=Sun JRE 1.4.2_06 I18N Win32
vm.exe.path=bin\\java.exe
然后再次压缩vm.zip和vm.properties得到了InstallAnywhere所需要的vm包.
posted @
2007-07-19 13:49 Dong 阅读(325) |
评论 (0) |
编辑 收藏
usertable表是用户信息表,其中userid为用户账号,每个账号都有所属于的城市.
logintable是用户操作的一张表,两张表通过userid相连,也就是说logintable中的每条数据通过userid标识出来
现在想统计出各个城市的纪录条数,还有合格次数
比如杭州拥有dong和jack两个账号,dong和jack在logintable有两个纪录,所以得到2,合格一次.
现在是想通过一个最简单的方法,输出每个城市的情况,如下
杭州 2 1
上海 2 1
posted @
2007-07-18 13:34 Dong 阅读(264) |
评论 (1) |
编辑 收藏
摘要: 原来在某个网站发现过一个很好用的可编辑下拉,这两天因为需要使用再次的去找那个.却怎么也找不到了,在一番baidu,google终于还是没有找到.但是无心插柳,发现了一个更加不错的,所以贴出来.同时为了保持下拉不被影响,可以将原来的输入提示下拉去掉,代码为autocomplete="off"
<!DOCTYPE HTML PUBLIC "-//W3C...
阅读全文
posted @
2007-07-16 10:09 Dong 阅读(399) |
评论 (0) |
编辑 收藏
这几天真的是彻底成了一个美工了
posted @
2007-07-09 17:12 Dong 阅读(145) |
评论 (0) |
编辑 收藏
经过几天的努力,新版本的网站样式终于搞定了,可能有点不完全。但是个人感觉还是不错的。
posted @
2007-06-28 13:54 Dong 阅读(169) |
评论 (0) |
编辑 收藏
解决方法:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\HideFileExt,将“UncheckedValue”的值改为0,即显示文件扩展名,改为1则是不显示。
posted @
2007-06-26 10:59 Dong 阅读(1731) |
评论 (0) |
编辑 收藏
闲来无事,决定实现我前段时间的一个想法。写一个五子棋程序,这样的一个程序,本身来说是没什么什么难度的。但是在写的过程中却真的是遇到了不少的麻烦~!
/* 到目前最新发现的问题是UDP严重的丢包现象,本程序是基于一个UDP网络传输的。在写的时候显然没有考虑到UDP的保障机制,原因是我一直觉得UDP应该不会有问题,或者说我觉得简直会流畅的跟TCP一样。事实证明我错了,把五子棋的客户端放到同学的电脑上后,通信真的是相当的困难~邀请进入游戏都没有成功过。*/
发现原来程序不能成功运行的原因是因为自己在写的时候出了一些错误,才会导致双方不能成功的游戏以及通信!~还在这里责怪UDP机制,呵呵,特地将上方文字“注释”掉。警戒一下,不过程序终于是跑起来了。看来以后写程序出错后应该先找程序本身有没有问题了,不过第一个游戏终于走上了历史舞台。值得庆祝!!
看来要写好一个好程序真的有很多东西要照顾到,比如过如果退出游戏没有System.exit的话,系统会继续为程序保留资源,也就是说原先使用的端口也就不会释放开,下面的通信也会造成不便。漫漫长路啊~~
界面是模仿QQ游戏中的五子棋
Download the game (使用于公网)
posted @
2007-06-08 13:16 Dong 阅读(351) |
评论 (0) |
编辑 收藏
今天刚结束看完了这本在一个星期前买的仅仅有180多页的书,只是买了第一册。
坦白说我也没有任何的文笔可言,原本也没有想过也写个关于本书的读后感,但是总觉得不应该忘记了,雁过留声,起码不可以忘记书中说的那些最重要的思想,不然看了也没有什么效果。所以就有了这篇文章。
买这本书的原因主要是无意中看到了作者的一个演讲,感觉还不错。作者拥有两个父亲,一个穷爸爸、一个富爸爸,穷爸爸为亲生父亲,代表了我们这个时代最普通的族群,努力工作努力提高工资。不去或者说很少投资,财务状况基本上是长期处于负债的。而富爸爸则是一位对财富很有看法的人,拥有着很高的财商,当然最后也成为了夏威仪最有钱的几个人之一。本书最主要的思想之一是教导人们去购买资产而不是负债。所谓的资产就是能够为我们带来收益的东西,比如说股票、基金、以及各种投资。而传统意义上的汽车、房子都不算资产而是负债,因为如果你购买了汽车或者房子,本身会增加你的支出。传统的理财是减少开销,而书中所说的理财是让我们怎么去获得收益。
其实本书只能说是对于理财以及财商的一个启蒙教育,只是将你推到了理财的门前。以后需要有很多的品质以及能力去建立,还有许多努力要做,但是重点是去尝试,而不是害怕失败。就像书中说的一样:胜利是不害怕失败。
posted @
2007-06-04 23:20 Dong 阅读(214) |
评论 (0) |
编辑 收藏
刚从上海回来,以前用ASP实现的网站被要求改版以及把界面美化一下.突然变成了一美工.
明显我的美工功底是不行的!~做这份差让我有些头疼,坐到电脑前一个早上才有了一点点成果
管理界面
登陆界面
还有一大堆工作要做,当然也还有一堆 BUG要修复,看来要好好花点精力上去了.不可以马虎了事!!
posted @
2007-05-29 16:30 Dong 阅读(144) |
评论 (0) |
编辑 收藏
今天刚开始在弄一个JAVA图表组件,原来刚接触JAVA的时候记的在书上看到过一句话:开发有价值的JAVA组件是一件让人相当兴奋的事情。当然我做这个东西显然没有让人兴奋的感觉,实在是技术粗糙。总的来说只是对自己的一种锻炼了。
说说做的这个组件主要想实现的功能,客户端用户可以通过输入创建Rect对象并调用对象的getRect()方法生成柱装图片,因为目前还没有做别的形状的图形。并且需要输入参数包括图象的长和宽,以及表的各项的名称及数值。等以后做好了发代码上来。下面是生成图片的雏形。
posted @
2007-05-24 13:08 Dong 阅读(547) |
评论 (0) |
编辑 收藏