posts - 42,  comments - 84,  trackbacks - 0
            2007年7月30日
          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 閱讀(407) | 評論 (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 閱讀(4367) | 評論 (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 閱讀(10206) | 評論 (7)編輯 收藏
          (String[])ArrayList.toArray(new String[0]);
          posted @ 2008-06-02 11:25 Dong 閱讀(807) | 評論 (0)編輯 收藏
          XML里是無法直接正常輸出&等特殊字符的,可用&amp;轉(zhuǎn)義表示!
          posted @ 2008-05-21 09:03 Dong 閱讀(489) | 評論 (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 閱讀(1763) | 評論 (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 閱讀(326) | 評論 (0)編輯 收藏
          ApplicationContext ctx = new ClassPathXmlApplicationContext("application-config.xml");
          Map<String,String> bureauMap = ((DictionaryService)ctx.getBean("dictionaryService")).getBureauMap();
          posted @ 2008-05-19 16:45 Dong 閱讀(273) | 評論 (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 閱讀(7751) | 評論 (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 閱讀(2695) | 評論 (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 閱讀(3492) | 評論 (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 閱讀(4980) | 評論 (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 閱讀(2962) | 評論 (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 閱讀(1258) | 評論 (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 閱讀(1082) | 評論 (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 閱讀(1141) | 評論 (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 閱讀(577) | 評論 (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 閱讀(256) | 評論 (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 閱讀(953) | 評論 (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 閱讀(1807) | 評論 (3)編輯 收藏

          FusionCharts是一個能幫你創(chuàng)建其引人注目的動態(tài)圖像效果的Macromedia Flash控件。充分利用Macromedia Flash所具有的流暢功能來創(chuàng)建簡潔的、交互式的和引人注目的動態(tài)圖像。

          技術(shù)細(xì)節(jié)

          設(shè)想所有的圖形組成不需要任何的安裝,你可以在你的能想到的語言環(huán)境中進(jìn)行工作,并能在多數(shù)的瀏覽器中運行,建立漂亮的、栩栩如生的效果。假設(shè)你的數(shù)據(jù)在有限的時間、空間、WEB內(nèi)不停的發(fā)生改變。FusionCharts剛好幫助你實現(xiàn)所有想像出來的事物。

          現(xiàn)在Flash的應(yīng)用確實越來越廣泛,無論動畫、導(dǎo)航以及一些復(fù)雜的組件,都可以使用Flash技術(shù)很好的解決。Flash的前景我是非常看好的。FusionCharts就是其中一個非常好的代表!!應(yīng)該來說應(yīng)用起來也是非常方便的。而且功能強(qiáng)大、生成的圖表動態(tài)、而且美觀。

          這個就是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 閱讀(1177) | 評論 (1)編輯 收藏
          server.xml中的<host></host>中寫入
          <Context   path=""   docBase="E:\myweb"   debug="0"   reloadable="true"   crossContext="true"   />
          //科學(xué)計數(shù)法的轉(zhuǎn)換//
          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 閱讀(221) | 評論 (0)編輯 收藏

          MapXtreme Java,是目前用于Internet或企業(yè)Intranet唯一的100%純Java地圖服務(wù)器。MapInfo MapXtreme Java與J2EE兼容,為開發(fā)人員開發(fā)應(yīng)用提供了無與倫比的靈活性。MapXtreme Java向應(yīng)用開發(fā)商提供了一個高度可視化的、直觀的組件,方便他們將地圖功能集成到任何Web應(yīng)用中。MapXtreme Java幫助用戶在企業(yè)內(nèi)部輕松實現(xiàn)信息共享,更好地向顧客提供服務(wù),做出商業(yè)決策,更有效地管理資產(chǎn)和運營。

          可擴(kuò)展性
          MapXtreme Java使用智能Java線程,可同時為多個客戶端服務(wù),這樣降低了每個客戶端的內(nèi)存消耗,并當(dāng)增加CPU(或者集群)后保證性能成比例提高。它可以適于處理高強(qiáng)度的使用需求。

          多平臺
          MapXtreme Java 可以在異構(gòu)硬件環(huán)境下運行(Linux,UNIX,NT等)。 Map Xtreme Java 向所有PC或UNIX工作站的web瀏覽器發(fā)送地圖,而無需專用插件。

          編寫一次,隨處運行
          無論未來選擇何種硬件和軟件平臺,Map Xtreme Java 應(yīng)用(代碼)都可以方便地被移植和重用,節(jié)約了開發(fā)時間和成本。

          快速應(yīng)用開發(fā)與部署
          Map Xtreme Java版附帶有Java Beans,可加快應(yīng)用開發(fā)。因為它可以用于可視化的Internet開發(fā)環(huán)境 (IDEs),例如Borland JBuilder、Oracle Jdeveloper或Sun ONE Studio,開發(fā)商可以采用標(biāo)準(zhǔn)的拖放、設(shè)置屬性機(jī)制,將對象添加到應(yīng)用中。

          靈活性
          MapXtreme Java支持大量的網(wǎng)絡(luò)開發(fā),包括瘦、中和胖的web瀏覽器客戶端。

          測試環(huán)境
          操作系統(tǒng)
          Solaris 8&9 HP UX11 
          Red Hat Linux Advanced Server 2.1
          Windows 2000 Server Edition 
          Windows Server 2003 Enterprise Edition 

          應(yīng)用服務(wù)器
          Tomcat 4.1.18  
          Weblogic7 
          WebSphere 5.X (需提供J2SE 1.4)
          Sun ONE 7 
          Oracle IAS

          數(shù)據(jù)庫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

          系統(tǒng)要求
          MapXtreme Java版的目的是允許在任何支持Java虛擬機(jī)的平臺上開發(fā)地圖應(yīng)用。下面是實施地圖應(yīng)用的必要條件:
          支持Sun servlet 2.3的servlet容器
          與1.4.1 02或更高版本的虛擬機(jī)相兼容的Java 2 平臺
          安裝在服務(wù)器上的視頻卡。對Sun Solaris來說,可以是視頻卡,也可以是虛擬框架緩沖(如Java 2D增強(qiáng)圖形功能所需)
          9MB(針對服務(wù)器文件)-760MB(全部安裝)的硬驅(qū)空間(安裝需要40MB)
          地圖數(shù)據(jù)需要的135MB的硬盤空間
          256MB內(nèi)存

          地址:http://www.mapinfo.com.cn

          posted @ 2007-07-30 12:11 Dong 閱讀(410) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 衡阳县| 安图县| 福州市| 黑水县| 大余县| 彰化县| 万全县| 科技| 施甸县| 惠水县| 海丰县| 大庆市| 石景山区| 四子王旗| 宁强县| 南丰县| 芒康县| 突泉县| 新兴县| 吉林市| 南召县| 弥勒县| 繁峙县| 黎川县| 稻城县| 壶关县| 炎陵县| 海口市| 彩票| 五大连池市| 新民市| 常山县| 汝城县| 电白县| 库车县| 丘北县| 苍梧县| 连平县| 淮南市| 台北市| 溆浦县|