
2007年5月17日
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 閱讀(403) |
評論 (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 閱讀(4365) |
評論 (23) |
編輯 收藏
開發的時候有時候會碰到這樣的情況,我們在寫程序的時候并不知道需要調用某個對象的哪個方法,只有程序運行后,我們才能夠知道?;蛟S我們需要根據客戶端傳過來的某個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 閱讀(10203) |
評論 (7) |
編輯 收藏
(String[])ArrayList.toArray(new String[0]);
posted @
2008-06-02 11:25 Dong 閱讀(802) |
評論 (0) |
編輯 收藏
XML里是無法直接正常輸出&等特殊字符的,可用&轉義表示!
posted @
2008-05-21 09:03 Dong 閱讀(484) |
評論 (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 閱讀(1762) |
評論 (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 閱讀(322) |
評論 (0) |
編輯 收藏
ApplicationContext ctx = new ClassPathXmlApplicationContext("application-config.xml");
Map<String,String> bureauMap = ((DictionaryService)ctx.getBean("dictionaryService")).getBureauMap();
posted @
2008-05-19 16:45 Dong 閱讀(268) |
評論 (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 閱讀(7750) |
評論 (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 閱讀(2691) |
評論 (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 閱讀(3489) |
評論 (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 閱讀(4978) |
評論 (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 閱讀(2960) |
評論 (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 閱讀(1255) |
評論 (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 閱讀(1081) |
評論 (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 閱讀(1139) |
評論 (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 閱讀(575) |
評論 (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 閱讀(253) |
評論 (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 閱讀(1517) |
評論 (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 閱讀(951) |
評論 (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 閱讀(1805) |
評論 (3) |
編輯 收藏
FusionCharts是一個能幫你創建其引人注目的動態圖像效果的Macromedia Flash控件。充分利用Macromedia Flash所具有的流暢功能來創建簡潔的、交互式的和引人注目的動態圖像。
技術細節
設想所有的圖形組成不需要任何的安裝,你可以在你的能想到的語言環境中進行工作,并能在多數的瀏覽器中運行,建立漂亮的、栩栩如生的效果。假設你的數據在有限的時間、空間、WEB內不停的發生改變。FusionCharts剛好幫助你實現所有想像出來的事物。
現在Flash的應用確實越來越廣泛,無論動畫、導航以及一些復雜的組件,都可以使用Flash技術很好的解決。Flash的前景我是非??春玫?。FusionCharts就是其中一個非常好的代表?。搧碚f應用起來也是非常方便的。而且功能強大、生成的圖表動態、而且美觀。
這個就是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 閱讀(1175) |
評論 (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 閱讀(219) |
評論 (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 閱讀(409) |
評論 (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 閱讀(7089) |
評論 (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 閱讀(327) |
評論 (0) |
編輯 收藏

usertable表是用戶信息表,其中userid為用戶賬號,每個賬號都有所屬于的城市.
logintable是用戶操作的一張表,兩張表通過userid相連,也就是說logintable中的每條數據通過userid標識出來
現在想統計出各個城市的紀錄條數,還有合格次數
比如杭州擁有dong和jack兩個賬號,dong和jack在logintable有兩個紀錄,所以得到2,合格一次.
現在是想通過一個最簡單的方法,輸出每個城市的情況,如下
杭州 2 1
上海 2 1
posted @
2007-07-18 13:34 Dong 閱讀(268) |
評論 (1) |
編輯 收藏
摘要: 原來在某個網站發現過一個很好用的可編輯下拉,這兩天因為需要使用再次的去找那個.卻怎么也找不到了,在一番baidu,google終于還是沒有找到.但是無心插柳,發現了一個更加不錯的,所以貼出來.同時為了保持下拉不被影響,可以將原來的輸入提示下拉去掉,代碼為autocomplete="off"
<!DOCTYPE HTML PUBLIC "-//W3C...
閱讀全文
posted @
2007-07-16 10:09 Dong 閱讀(404) |
評論 (0) |
編輯 收藏
這幾天真的是徹底成了一個美工了

posted @
2007-07-09 17:12 Dong 閱讀(149) |
評論 (0) |
編輯 收藏
經過幾天的努力,新版本的網站樣式終于搞定了,可能有點不完全。但是個人感覺還是不錯的。
posted @
2007-06-28 13:54 Dong 閱讀(175) |
評論 (0) |
編輯 收藏
解決方法:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\HideFileExt,將“UncheckedValue”的值改為0,即顯示文件擴展名,改為1則是不顯示。
posted @
2007-06-26 10:59 Dong 閱讀(1734) |
評論 (0) |
編輯 收藏
閑來無事,決定實現我前段時間的一個想法。寫一個五子棋程序,這樣的一個程序,本身來說是沒什么什么難度的。但是在寫的過程中卻真的是遇到了不少的麻煩~!
/* 到目前最新發現的問題是UDP嚴重的丟包現象,本程序是基于一個UDP網絡傳輸的。在寫的時候顯然沒有考慮到UDP的保障機制,原因是我一直覺得UDP應該不會有問題,或者說我覺得簡直會流暢的跟TCP一樣。事實證明我錯了,把五子棋的客戶端放到同學的電腦上后,通信真的是相當的困難~邀請進入游戲都沒有成功過。*/
發現原來程序不能成功運行的原因是因為自己在寫的時候出了一些錯誤,才會導致雙方不能成功的游戲以及通信!~還在這里責怪UDP機制,呵呵,特地將上方文字“注釋”掉。警戒一下,不過程序終于是跑起來了??磥硪院髮懗绦虺鲥e后應該先找程序本身有沒有問題了,不過第一個游戲終于走上了歷史舞臺。值得慶祝?。?br> 看來要寫好一個好程序真的有很多東西要照顧到,比如過如果退出游戲沒有System.exit的話,系統會繼續為程序保留資源,也就是說原先使用的端口也就不會釋放開,下面的通信也會造成不便。漫漫長路啊~~
界面是模仿QQ游戲中的五子棋
Download the game (使用于公網)
posted @
2007-06-08 13:16 Dong 閱讀(353) |
評論 (0) |
編輯 收藏
今天剛結束看完了這本在一個星期前買的僅僅有180多頁的書,只是買了第一冊。
坦白說我也沒有任何的文筆可言,原本也沒有想過也寫個關于本書的讀后感,但是總覺得不應該忘記了,雁過留聲,起碼不可以忘記書中說的那些最重要的思想,不然看了也沒有什么效果。所以就有了這篇文章。
買這本書的原因主要是無意中看到了作者的一個演講,感覺還不錯。作者擁有兩個父親,一個窮爸爸、一個富爸爸,窮爸爸為親生父親,代表了我們這個時代最普通的族群,努力工作努力提高工資。不去或者說很少投資,財務狀況基本上是長期處于負債的。而富爸爸則是一位對財富很有看法的人,擁有著很高的財商,當然最后也成為了夏威儀最有錢的幾個人之一。本書最主要的思想之一是教導人們去購買資產而不是負債。所謂的資產就是能夠為我們帶來收益的東西,比如說股票、基金、以及各種投資。而傳統意義上的汽車、房子都不算資產而是負債,因為如果你購買了汽車或者房子,本身會增加你的支出。傳統的理財是減少開銷,而書中所說的理財是讓我們怎么去獲得收益。
其實本書只能說是對于理財以及財商的一個啟蒙教育,只是將你推到了理財的門前。以后需要有很多的品質以及能力去建立,還有許多努力要做,但是重點是去嘗試,而不是害怕失敗。就像書中說的一樣:勝利是不害怕失敗。
posted @
2007-06-04 23:20 Dong 閱讀(220) |
評論 (0) |
編輯 收藏
剛從上?;貋?以前用ASP實現的網站被要求改版以及把界面美化一下.突然變成了一美工.
明顯我的美工功底是不行的!~做這份差讓我有些頭疼,坐到電腦前一個早上才有了一點點成果
管理界面

登陸界面

還有一大堆工作要做,當然也還有一堆 BUG要修復,看來要好好花點精力上去了.不可以馬虎了事!!
posted @
2007-05-29 16:30 Dong 閱讀(146) |
評論 (0) |
編輯 收藏
今天剛開始在弄一個JAVA圖表組件,原來剛接觸JAVA的時候記的在書上看到過一句話:開發有價值的JAVA組件是一件讓人相當興奮的事情。當然我做這個東西顯然沒有讓人興奮的感覺,實在是技術粗糙??偟膩碚f只是對自己的一種鍛煉了。
說說做的這個組件主要想實現的功能,客戶端用戶可以通過輸入創建Rect對象并調用對象的getRect()方法生成柱裝圖片,因為目前還沒有做別的形狀的圖形。并且需要輸入參數包括圖象的長和寬,以及表的各項的名稱及數值。等以后做好了發代碼上來。下面是生成圖片的雛形。

posted @
2007-05-24 13:08 Dong 閱讀(550) |
評論 (0) |
編輯 收藏
今天看書的時候看到JSP的內置對象pageContext的時候,有兩個疑問,希望大家幫忙看看。
①、ServletRequest req = new pageContext.getRequest( ) ;
String name = req.getParameter("name") ; // pageContext的這個調用request的方法和直接使用內置對象request有區別嗎?
如:String name = request.getParameter("name") ;
②、pageContext中有個方法 getServletContext( ) ,使用該方法創建的對象可以在各個頁面被訪問到,那么它的這個方法設置的對象與直接使用application內置對象創建的對象有什么區別嗎?
posted @
2007-05-17 22:05 Dong 閱讀(881) |
評論 (2) |
編輯 收藏