<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 42,  comments - 84,  trackbacks - 0
      2007年8月25日
    CJDBC官網(wǎng)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       
          
          轉(zhuǎn)自:http://lzj0470.javaeye.com/blog/445348
    一、前言
             cjdbc ( http://c-jdbc.objectweb.org/ ) 是一個open source的數(shù)據(jù)庫集群中間件,任何基于jdbc的應(yīng)用都可以通過它透明地訪問數(shù)據(jù)庫集群,它可以進(jìn)行各個節(jié)點之間的數(shù)據(jù)復(fù)制,并且可以實現(xiàn)各個節(jié)點的查詢負(fù)載均衡。通過這樣的軟件,偶們可以方便的實現(xiàn)RAIDb - Redundant Array of Inexpensive Database 廉價數(shù)據(jù)庫冗余陣列。
            大型應(yīng)用隨著用戶量訪問越來越大,增加數(shù)據(jù)庫存儲和做好數(shù)據(jù)庫冗余可以增加系統(tǒng)的可靠性和性能。

            下面利用cjdbc,把兩臺對等的 Mysql 做 RAIDb,本文假定你已經(jīng)搭建好兩臺對等的 Mysql環(huán)境并建好一個需要做集群冗余的數(shù)據(jù)庫 clusterdb。
    二、配置環(huán)境
    Mysql: 5.0.19, 并使用 InnoDB 作為 Mysql 引擎

    C-jdbc: 2.0.2

    Jdk: 1.5
    三、選擇合適的 C-JDBC RAIDb 機(jī)制

    cjdbc有幾種RAIDb的機(jī)制可以選擇,如RAIDb-0,RAIDb-1等等,可以根據(jù)不同的情況選擇不同的RAIDb的機(jī)制。各種 RAIDb的機(jī)制詳情請查看 cjdbc 的文檔和 Demo。

    RAIDb-1有如下功能:
    完全鏡像處理機(jī)制,每個節(jié)點上都有完整的數(shù)據(jù)庫結(jié)構(gòu),這種方式提供了最好的容錯處理,并且通過設(shè)置合理的Loading Balance策略,可以帶來查詢性能相當(dāng)好的提高。但是由于對于任何的寫操作(create/update/delete),需要在各個節(jié)點上進(jìn)行傳播復(fù)制,寫操作就會比原來慢一些了,如下圖:



    這里選擇 RAIDb-1 做為 cjdbc RAIDb 機(jī)制。

    四、給兩臺對等的 Mysql 建表,假設(shè)兩臺 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 驅(qū)動程序,把它放到
    /usr/local/c-jdbc/drivers 中

    七、配置 C-JDBC Controller
    1、在 /usr/local/c-jdbc/config/virtualdatabase 目錄中創(chuàng)建 虛擬數(shù)據(jù)庫配置文件,并把它命名為 mysql-raidb1-distribution.xml,內(nèi)容如下:

    <?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 目錄中創(chuàng)建 C-JDBC controller 配置文件,并把它命名為 uud-controller-distributed.xml,內(nèi)容如下:

    <?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 目錄中創(chuàng)建啟動 C-JDBC controller sh,并把它命名為 uud-distributed-raidb1-controller.sh,內(nèi)容如下:

    #!/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 條數(shù)據(jù)到 Mysql 中,程序如下:

    /**
    * @author 胡榮華
    * @Company 世紀(jì)龍 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、程序執(zhí)行完畢后,分別到 Mysql Node 192.168.0.2 和 192.168.0.3 查詢,看看是否已同步了數(shù)據(jù),如果兩個 Mysql Node 都有相同的數(shù)據(jù),說明 C-JDBC 環(huán)境搭建成功。

    posted @ 2010-03-25 20:23 Dong 閱讀(403) | 評論 (0)編輯 收藏

    最近做了一個日志管理系統(tǒng)
    個人覺得采用了一套非常非常創(chuàng)新或者變態(tài)的開發(fā)方式,就像題目說的那樣,使用web的方法開發(fā)桌面應(yīng)用程序,當(dāng)然所有的技術(shù)都是基于java的。
    總結(jié)一下在整個項目中使用到的技術(shù)

    1、底層服務(wù)器的開發(fā)socket通信、http報文解析、反射機(jī)制(這些技術(shù)其實就是開發(fā)了一款小型的服務(wù)器,讓我們的web代碼能夠在本地運行起來,之所以選擇自己開發(fā)服務(wù)器的原因是,tomcat對于我們這個小桌面程序來說還是太大了點,如果作為桌面啟動,用戶不可能等待程序啟動這么長的時間,我給這個服務(wù)器起了個名字叫做jnet
    2、SWT,包括的瀏覽器控件和窗口等。
    3、使用installanywhere來打包程序,方便發(fā)布
    4、前臺展現(xiàn)數(shù)據(jù)使用了ext2.2
    5、擴(kuò)展自己開發(fā)的服務(wù)器jnet,開發(fā)出自己的“action”,應(yīng)該來說還是符合MVC的
    數(shù)據(jù)庫使用的是access,采用jdbc的方式訪問,你知道,如果在桌面軟件上使用hibernate...

    好了,不說廢話
    先貼出成品的效果圖

    1、桌面圖標(biāo)


    2、登錄界面


    3、登錄效果圖


    4、主界面


    是不是覺得還不錯呢?JAVA也可以揚眉吐氣開發(fā)出這樣的桌面系統(tǒng),可惜的是因為使用到了SWT,所以整個項目并不能跨平臺,放到linux系統(tǒng)下去運行。
    好了先理一理,發(fā)一張項目的原理圖


    看圖說話,我們整個項目的構(gòu)架,就是這個樣子的,采用SWT封裝了IE作為前臺展現(xiàn),后臺使用自己開發(fā)的服務(wù)器作為后臺來處理數(shù)據(jù),中間數(shù)據(jù)通信方式當(dāng)然就只能是http了

    所以中心思想就是,我開發(fā)了個服務(wù)器,這個服務(wù)器能夠讓用戶擴(kuò)展自己的類,自己的方法,然后用戶就可以根據(jù)自己的需要來書寫自己的系統(tǒng),最最最重要的就是,讓我們這些寫慣了J2EE的人能夠使用已經(jīng)形成的思維來編寫桌面系統(tǒng),我們可以不需要再去學(xué)swing和swt,可以使用html的方式來做前臺的布局,因為老實說我每次寫桌面程序的時候,總會把代碼弄得一團(tuán)糟,在web系統(tǒng)上容易規(guī)規(guī)矩矩的寫出分層的代碼,桌面系統(tǒng)...布局就讓我頭大(我的意思是當(dāng)你跑出去接私活干的時候,不用再學(xué)一套東西,呵呵)。

    好了,這個帖子只是一個簡單的介紹,整個系統(tǒng)具體的實現(xiàn)方式,會在后續(xù)的帖子中一步步解析,大家有什么意見或者建議可以給我留言,謝謝!
    posted @ 2009-03-19 15:16 Dong 閱讀(4365) | 評論 (23)編輯 收藏

      開發(fā)的時候有時候會碰到這樣的情況,我們在寫程序的時候并不知道需要調(diào)用某個對象的哪個方法,只有程序運行后,我們才能夠知道。或許我們需要根據(jù)客戶端傳過來的某個String參數(shù)的值來判斷我們應(yīng)該執(zhí)行哪個方法。在這種情況下JAVA的反射執(zhí)行就可以幫上忙了。下面是我做的一個簡單的測試代碼,提供給大家做個參考。

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;

    /**
     * 
    @author Dong
     * 測試JAVA reflect機(jī)制
     
    */

    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 閱讀(10204) | 評論 (7)編輯 收藏
    (String[])ArrayList.toArray(new String[0]);
    posted @ 2008-06-02 11:25 Dong 閱讀(802) | 評論 (0)編輯 收藏
    XML里是無法直接正常輸出&等特殊字符的,可用&amp;轉(zhuǎn)義表示!
    posted @ 2008-05-21 09:03 Dong 閱讀(484) | 評論 (0)編輯 收藏
    1、數(shù)字格式化
    <fmt:formatNumber value="33.33333" pattern="#.0"></fmt:formatNumber>-->輸出33.3
    pattern中符號的約束規(guī)定
    0                     一個數(shù)位
    #                     一個數(shù)位,前導(dǎo)零和追尾零不顯示
    .                      小數(shù)點分割位置
    ,                     組分隔符的位置
    -                      負(fù)數(shù)前綴
    %                    用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 閱讀(269) | 評論 (0)編輯 收藏
    今天在調(diào)試一個Servlet程序的時候,報了以下錯誤!
    java.lang.IllegalStateException: Cannot forward after response has been committed
    根據(jù)字面理解的話,意識是在response已經(jīng)提交后程序不能再一次的跳轉(zhuǎn)!

    研究代碼以后發(fā)現(xiàn),是因為前面已經(jīng)執(zhí)行過一次request.request.getRequestDispatcher().forward()
    但是后面的request.request.getRequestDispatcher().forward()依然被執(zhí)行到了!

    那么很有理由相信request.request.getRequestDispatcher().forward()跳轉(zhuǎn)本身是不會返回什么,也不會終止程序體的執(zhí)行!
    程序體后面該執(zhí)行的還是會執(zhí)行!
    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'錯誤

    在網(wǎng)絡(luò)上尋覓后發(fā)現(xiàn)是因為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的方式

    建立一個繼承自DispatchActionAction

    此類Action允許我們在表單中帶有參數(shù),根據(jù)參數(shù)執(zhí)行Action中的不同方法,以此實現(xiàn)Action的多用

    步驟

         建立一個繼承自DispatchActionAction規(guī)定方法名稱

         在表單頁面中添加一個隱藏域值,假設(shè)為codi   value=”insert”

         Struts-config.xml的相應(yīng)Formaction項目中設(shè)置parameter參數(shù)值為codi

    那么當(dāng)表單提交的時候,Action中的insert()方法就會被執(zhí)行,可以通過改隱藏域中的值的方式來改變Action要執(zhí)行的方法

    2、 解決ActionForm過多的問題

    通過動態(tài)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

    更改相應(yīng)的action中的attributenameabcForm

    這樣就配置好了一個動態(tài)的ActionForm

    3、 解決動態(tài)ActionForm的驗證問題

    通過動態(tài)驗證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配置相應(yīng)的action,添加validate=true添加驗證支持

        添加struts Plugin插件

    設(shè)置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());

    對于循環(huán)讀出可以使用
    sheet.getRows();方法得到行數(shù)
    sheet.getColumns();方法得到列數(shù)

    寫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"值,風(fēng)格為wcf,如果寫入的是數(shù)字則使用jxl.write.Number
    sheet.addCell(name);
    try
       {
        book.write();
        book.close();
       }
       catch(WriteException e){}
       catch(IOException e){}

    單元格風(fēng)格:

    設(shè)置邊框—
    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)兩個單元格

    設(shè)置字體-
    WritableFont wf = new WritableFont(WritableFont.ARIAL,12, WritableFont.BOLD, false);
    WritableCellFormat wcf = new WritableCellFormat(wf);
    以及其它各種單元格樣式,如設(shè)置背景顏色
    都可以通過設(shè)置WritableCellFormat來設(shè)置

    還有一點需要說明一下,JXL組件對于公式的支持似乎比Apache的poi好
    posted @ 2008-02-01 16:16 Dong 閱讀(4979) | 評論 (2)編輯 收藏
    原來弄過QuaQua的東西,但是一直不能把JFrame和JDialog變成Ox mac的樣式
    原因是,如果系統(tǒng)并不是蘋果的系統(tǒng)就需要顯示的加載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主要是用來對我們的程序代碼進(jìn)行白盒測試的一個組件。
    首先我們需要得到Junit.jar的包,可以到www.junit.org下載得到。
    下載以后將我們的Junit.jar包添加到工程里面,那么OK,就可以開始對我們的程序進(jìn)行測試了。
    對一個文件進(jìn)行測試的時候需要自己制作一個類并繼承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的構(gòu)造方法、setUp方法(對程序中使用的一些資源進(jìn)行分配)、運行測試、tearDown()(去處一些使用到的資源)
    這樣程序會自動判斷Sample類中的getName方法返回的值是不是符合我們的要求,使用Junit測試的運行方式,程序會調(diào)用Assert類中的靜態(tài)方法對測試程序的返回值和期望值等情況進(jìn)行判斷、還有一些判斷對象是否為空的方法,當(dāng)出現(xiàn)綠色的時候代表程序是正常運行的
    當(dāng)書寫了很多測試類后,可以條使用TestSuite類對測試類進(jìn)行打包測試,如:

    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 ;
     }
    }

    程序需要實現(xiàn)suite()方法,并且返回出一個TestSuite對象。

    posted @ 2007-12-25 16:12 Dong 閱讀(1255) | 評論 (2)編輯 收藏

    1、實現(xiàn)自定義Taglib的類需要實現(xiàn)javax.servlet.jsp.tagext.IterationTag或者

    javax.servlet.jsp.tagext.TagSupport、javax.servlet.jsp.tagext.BodyTag接口,目前J2EE提供了兩

    個分別實現(xiàn)了這兩個接口的類,我們只需要直接繼承就可以,它們分別為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標(biāo)準(zhǔn)文檔的一種,可以通過tld文件配置出Taglib的各種標(biāo)記所對應(yīng)的類實現(xiàn)
    <?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>//標(biāo)簽描述
     <jspversion>1.1</jspversion>
     <shortname>mytag</shortname>
     <uri></uri>
     <tag>
      <name>hello</name>//標(biāo)簽方法名
      <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>
    這樣一個自定義標(biāo)記就寫好了,但是要使用它我們還需要在項目中配置
    3、項目部署文件web.xml
    <taglib>
     <taglib-uri>hello</taglib-uri>
     <taglib-location>/WEB-INF/Web.tld</taglib-location>
    </taglib>
    4、在JSP頁面中調(diào)用Taglib
    <%@ taglib uri="hello" prefix="show" %>
    這樣我們就完成了所有配置
    在頁面中使用類似<show:hello name="dong"/>就可以看到我們配置的Taglib起的作用了

    posted @ 2007-12-19 11:07 Dong 閱讀(1081) | 評論 (3)編輯 收藏

    我對DAO的理解就是對數(shù)據(jù)庫的訪問封裝在一個接口里,當(dāng)用戶需要訪問數(shù)據(jù)庫的時候只需要簡單的對調(diào)用接口,而不需要和數(shù)據(jù)庫有直接的接觸。
    下面介紹一個簡單的DAO對數(shù)據(jù)庫訪問的建立:

    首先我們需要建立
    1、一個DAO接口:UserDAO.java在里面定義數(shù)據(jù)庫操作的所有方法
    2、一個實現(xiàn)了DAO接口的類、UserDAOImpl.java,完成了對DAO的實現(xiàn)并且將取得的數(shù)據(jù)存放到VO類中。
    3、一個數(shù)據(jù)庫訪問的基礎(chǔ)類、DataBaseConnection.java里面封裝了對數(shù)據(jù)庫的連接Connection,外部訪問這個類的方法可以返回一個Connection接口的實現(xiàn)
    4、一個VO類,UserVO.java,里面包含了所有需要返回的出來的數(shù)據(jù)、利用set方法和get方法對類對象進(jìn)行基本的設(shè)置
    5、一個Factory類,封裝了具體實現(xiàn)了UserDAO接口的UserDAOImpl類對象,調(diào)用Factory類的時候直接返回一個UserDAO的對象

    這樣的話一個DAO設(shè)計就完成了
    這個時候當(dāng)我們需要對數(shù)據(jù)庫進(jìn)行訪問的時候只需要聲明一個UserDAO接口然后實例化一個工廠類實現(xiàn)UserDAO接口,這樣我們就可以遍歷VO類得到我們要的數(shù)據(jù)。

    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做一定的向下轉(zhuǎn)型。

    而實現(xiàn)HttpSessionListener 的Listener Servlet中的傳遞的對象是HttpSessionEvent的對象,想在其中實現(xiàn)對Application對象的訪問的話:arg0.getSession().getServletContext().setAttribute();

    另:今天把MySQL裝到電腦上,利用Servlet連接了一下,老是報ClassNotFound的錯誤,原因是MySQL的JDBC驅(qū)動只有一個mysql-connector-java-5.0.8-bin.jar,另外一個不能夠拷到lib目錄下。

    posted @ 2007-12-13 01:02 Dong 閱讀(575) | 評論 (0)編輯 收藏
    Struts 使用 Model 2 架構(gòu)。Struts 的ActionServlet 控制導(dǎo)航流。其他Struts 類,比如
    Action, 用來訪問業(yè)務(wù)邏輯類。當(dāng) ActionServlet 從容器接收到一個請求,它使用URI (或者
    路徑“path”) 來決定那個Action 將用來處理請求。一個 Action可以校驗輸入,并且訪問業(yè)務(wù)
    層以從數(shù)據(jù)庫或其他數(shù)據(jù)服務(wù)中檢索信息。
    為校驗輸入或者使用輸入來更新數(shù)據(jù)庫, Action 需要知道什么指被提交上來。并不是
    強(qiáng)制每個Action 從請求中抓取這些值,而是由 ActionServlet 將輸入綁定到JavaBean中。
    輸入 bean是Struts ActionForm c類的子類。ActionServlet 通過查找請求的路徑可以決定使用
    哪個ActionForm,Action 也是通過同樣的方法選取的。ActionForm 擴(kuò)展
    org.apache.struts.action.ActionForm類。每個都必須以HTTP 響應(yīng)進(jìn)行應(yīng)答。 通
    常, Struts
    Action 并不自行加工響應(yīng)信息,而是將請求轉(zhuǎn)發(fā)到其他資源,比如JSP 頁面。Struts 提
    供一個ActionForward 類,用來將一個頁面的路徑存儲為邏輯名稱。當(dāng)完成業(yè)務(wù)邏輯后,
    Action 選擇并向Servlet返回一個ActionForward。Servlet 然后使用存儲在ActionForward 對
    象中的路徑來調(diào)用頁面完成響應(yīng)。
    Struts 將這些細(xì)節(jié)都綁定在一個ActionMapping 對象中。每個ActionMapping 相對于一
    個特定的路徑。當(dāng)某個路徑被請求時,Servlet 就查詢ActionMapping 對象。ActionMapping
    對象告訴servlet,哪個Actions, ActionForms, 和 ActionForwards 將被使用。
    所有這些細(xì)節(jié),關(guān)于Action, ActionForm, ActionForward, ActionMapping,以及其
    他一些東西,都在struts-config.xml 文件中定義。 ActionServlet 在啟動時讀取這個配置文件,
    并創(chuàng)建一個配置對象數(shù)據(jù)庫。在運行時,Struts 應(yīng)用根據(jù)文件創(chuàng)建的配置對象,而不是文件
    本身
    posted @ 2007-12-08 10:52 Dong 閱讀(253) | 評論 (0)編輯 收藏
    <head>
    <title>無標(biāo)題文檔</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>標(biāo)題一</span></a></li>
    <li><a href="#" onmouseover="switchTag('content2');this.blur();"><span>標(biāo)題二</span></a></li>
    <li><a href="#" onmouseover="switchTag('content3');this.blur();"><span>標(biāo)題三</span></a></li>
    <li><a href="#" onmouseover="switchTag('content4');this.blur();"><span>標(biāo)題四</span></a></li>
    <li><a href="#" onmouseover="switchTag('content5');this.blur();"><span>標(biāo)題五</span></a></li>
    </ul>
    </div>
    <div id="content" class="content1">

    <div id="content1" >標(biāo)題一中的東西</div>
    <div id="content2" class="hidecontent">標(biāo)題二中的東西</div>
    <div id="content3" class="hidecontent">標(biāo)題三中的東西</div>
    <div id="content4" class="hidecontent">標(biāo)題四中的東西</div>
    <div id="content5" class="hidecontent">標(biāo)題五中的東西</div>

    </div>
    </body>
    </html>
    只是一個簡單的實現(xiàn)方法,具體的樣式美觀方面的東西可以自己修改。
    posted @ 2007-11-11 11:39 Dong 閱讀(1517) | 評論 (4)編輯 收藏

            最近開發(fā)個后臺系統(tǒng),使用到了eWebEditor,原先并沒有使用過相關(guān)方面的在線編輯器。所以一用起來問題一大堆!都不知道用什么編輯器好,研究了FCKEditor等一些國外的編輯器后還是覺得應(yīng)該支持國貨!
             選頂了編輯器后之后還算順利,但是沒過多久就出現(xiàn)了另外一個問題,使用eWebEditor編輯后并保存到數(shù)據(jù)庫中的字符串是以HTML源碼的形式!這樣上傳和前臺顯示是都沒有問題的。但是后臺中有個修改新聞的功能,當(dāng)我將HTML形式的代碼傳遞給eWebEditor的時候,驚喜就出現(xiàn)了!!編輯器顯然不買我的帳~~~沒反應(yīng)???
            下面的就是調(diào)用編輯器的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>
        經(jīng)過一夜奮戰(zhàn),以及對于問題的研究。終于找到解決方法了,步驟如下:
        1、講content的內(nèi)容進(jìn)行Html編譯,Server.HTMLEncode(content)
        2、第二個問題將隱藏的文本框改成文本域,就可以了
    posted @ 2007-11-08 23:59 Dong 閱讀(951) | 評論 (2)編輯 收藏
    硬盤中出現(xiàn)了兩個病毒程序SVOHOST.EXE 和AUTORUN.INF文件。
    1)打開任務(wù)管理器將SVOHOST.EXE結(jié)束任務(wù)
    2)運行 cmd
    進(jìn)入出現(xiàn)問題的盤符,如e:
    輸入:dir/a
    看看有沒有SVOHOST.EXE 和AUTORUN.INF
    如果有
    則輸入:attrib -a -s -h -r sxs.exe
            attrib -a -s -h -r autorun.inf
    分別執(zhí)行(目的是取消這兩個文件的隱藏屬性)
    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)編輯 收藏
    主站蜘蛛池模板: 亚洲综合免费视频| 亚洲精品~无码抽插| 亚洲高清无码综合性爱视频| 亚洲av午夜精品一区二区三区 | 色欲国产麻豆一精品一AV一免费 | 四虎国产精品免费久久| 国产精品深夜福利免费观看| 一区免费在线观看| a级午夜毛片免费一区二区| 日韩成人精品日本亚洲| 一区视频免费观看| 日韩午夜理论免费TV影院| 在线观看免费人成视频色9| 全黄性性激高免费视频| 又色又污又黄无遮挡的免费视| 国产a v无码专区亚洲av| 亚洲AV日韩精品久久久久| 色偷偷亚洲女人天堂观看欧| 精品在线免费视频| 男人的天堂网免费网站| 精品国产麻豆免费人成网站| 中文毛片无遮挡高潮免费| 国产成人免费在线| 日韩精品免费一区二区三区| 免费看大美女大黄大色| 韩国日本好看电影免费看| 国产午夜亚洲不卡| 亚洲一级特黄特黄的大片| 国产久爱免费精品视频| 2021国产精品成人免费视频| 午夜亚洲福利在线老司机| 亚洲国产成人久久综合一区77 | 精品亚洲成a人片在线观看少妇| 亚洲午夜成人精品无码色欲| 亚洲大码熟女在线观看| 国产一精品一av一免费爽爽 | 国内精品免费视频自在线| 亚洲AV永久精品爱情岛论坛| 亚洲国产精品久久久久久| 日韩精品亚洲专区在线影视| 亚洲黄色免费网站|