
2007年12月13日
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 閱讀(402) |
評論 (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 閱讀(7749) |
評論 (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) |
編輯 收藏