每日一得

          不求多得,只求一得 about java,hibernate,spring,design,database,Ror,ruby,快速開發
          最近關心的內容:SSH,seam,flex,敏捷,TDD
          本站的官方站點是:顛覆軟件

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            220 隨筆 :: 9 文章 :: 421 評論 :: 0 Trackbacks

          #

          轉自: 這里

          1. 配置RedHat AS 3

          操作系統版本:
          Red Hat Enterprise Linux AS release 3 (Taroon)
          Kernel 2.4.21-4.EL on an i686
          按照常規來安裝操作系統,記得要安裝開發工具(gcc等必要工具).

          1.1 檢查必要的硬件信息

          檢查內容 最小值 檢查命令參考
          物理內存 512M # grep MemTotal /proc/meminfo
          交換空間 1.0 GB或者2倍內存大小 # grep SwapTotal /proc/meminfo
          /tmp 空間 400 MB # df -k /tmp
          軟件所需空間 2.5 GB # df -k (空間越大越好,如果是正式系統,應該進行詳盡的規劃)
          數據庫文件 1.2 GB # df -k (空間越大越好,如果是正式系統,應該進行詳盡的規劃)
          檢查完如上各項之后, 應該修改核心參數.執行如下命令:

          #vi /etc/sysctl.conf

          #注釋:
          #表示使用root用戶操作,$表示使用oracle 用戶進行操作.提示符后面的藍色部分表示需要輸入的命令,以下同.

          在該文件末尾加入如下內容:
          kernel.shmall = 2097152
          kernel.shmmax = 2147483648
          kernel.shmmni = 4096
          kernel.sem = 250 32000 100 128
          fs.file-max = 65536
          net.ipv4.ip_local_port_range = 1024 65000

          編輯完之后,保存,執行 # /sbin/sysctl -p 命令操作來使我們所做的變更生效.
          注:上面kernel.shmmax/kernel.sem等是典型的核心參數配置.您可能需要根據您的實際環境進行適當的變動.

          關于這些核心參數的說明在Oracle的 Oracle9i Installation Guide Release 2 (9.2.0.1.0) for UNIX Systems 中有很詳細的說明.( http://download-west.oracle.com/docs/html/A96167_01/toc.htm )

          然后,應該檢查一下上面的操作是否正確:
          # /sbin/sysctl -a | grep sem
          # /sbin/sysctl -a | grep shm
          # /sbin/sysctl -a | grep file-max
          # /sbin/sysctl -a | grep ip_local_port_range

          為Oracle用戶設定Shell的限制
          一般來說,出于性能上的考慮,還需要需要進行如下的設定,以便改進Oracle用戶的有關 nofile(可打開的文件描述符的最大數)和nproc(單個用戶可用的最大進程數量)

          # vi /etc/security/limits.conf
          # 添加如下的行

          *?????????????? soft??? nproc?? 2047
          *?????????????? hard??? nproc?? 16384
          *?????????????? soft??? nofile? 1024
          *?????????????? hard??? nofile? 65536

          添加如下的行到/etc/pam.d/login 文件:
          session??? required???? /lib/security/pam_limits.so

          編輯 /etc/profile 文件,添加如下部分:
          if [ $USER = "oracle" ]; then?
          ??????? if [ $SHELL = "/bin/ksh" ]; then?
          ??????????????? ulimit -p 16384?
          ??????????????? ulimit -n 65536?
          ??????? else?
          ??????????????? ulimit -u 16384 -n 65536?
          ??????? fi?
          fi
          之后,執行$ ulimit 驗證一下.

          1.2 檢查并安裝相關補丁
          在這個版本的RHEL上安裝Oracle,必須要有幾個軟件包. 確認以下 rpm包都已經安裝:

          make-3.79
          binutils-2.11
          openmotif-2.2.2-16
          setarch-1.3-1
          compat-db-4.0.14.5
          compat-gcc-7.3-2.96.122
          compat-gcc-c++-7.3-2.96.122
          compat-libstdc++-7.3-2.96.122
          compat-libstdc++-devel-7.3-2.96.122

          # rpm -qa | grep compat
          # 在機器上輸出如下:

          compat-gcc-c++-7.3-2.96.122
          compat-libstdc++-7.3-2.96.122
          compat-libstdc++-devel-7.3-2.96.122
          compat-glibc-7.x-2.2.4.32.5
          compat-db-4.0.14-5
          compat-gcc-7.3-2.96.122

          # rpm -qa | grep openmotif
          openmotif-devel-2.2.2-16
          openmotif-2.2.2-16

          # rpm -qa | grep setarch
          setarch-1.3-1


          上面顯示的內容是在筆者已經安裝了具體的RPM包之后的結果.一般情況下,你的系統上的輸出結果和這個不同.如果個別包沒有安裝,把系統安裝光盤mount上,找到具體的軟件包(大多數在第三張光盤上),然后利用如下的命令來安裝相應的包:
          # rpm -ivh *.rpm

          要額外注意的是,這些軟件包之間是有依賴性的,先后的順序要找好.否則會報告不能安裝的錯誤. 此外,最好驗證一下 gcc和glibc的版本(要求是gcc-3.2.3-2 或者更高):
          #gcc -v
          #rpm -q glibc

          1.3 創建用戶和相關的組
          # /usr/sbin/groupadd oinstall
          # /usr/sbin/groupadd dba
          # /usr/sbin/useradd -g oinstall -G dba oracle
           

          如果只是測試目的的話,不創建oinstall組也沒什么. 不過還是規范一點比較好.如果oracle 用戶和dba組等已經存在,作適當的調整即可.

          1.4 檢查并調整環境變量
          登錄為oracle用戶

          # su - oracle
          $ cd
          $ vi .bash_profile

          #添加如下內容,你的具體值應該不會和這個完全相同.
          export ORACLE_BASE=/oracle
          export ORACLE_HOME=$ORACLE_BASE/product/dbse
          export ORACLE_SID=orcl
          export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
          export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
          export LC_CTYPE=en_US.UTF-8

          然后執行
          $ source .bash_profile

          使環境變量生效. /oracle 等目錄應該建立好并做合適的授權.

          2. 安裝Orale10g
          mount安裝盤.由于10g無法以root安裝,以前面建的oracle用戶登錄.執行:

          $ ./runInstaller

          按照提示安裝即可,最后還需要以root運行兩個腳本。

          3. 配置TNS參數
          在 /oracle/product/dbse/network/admin/ 目錄下有 listener.ora 和 tnsnames.ora 兩個文件,設置如下:

          #listener.ora
          SID_LIST_LISTENER =
          ? (SID_LIST =
          ???? (SID_DESC =
          ????? (GLOBAL_DBNAME = orcl)
          ????? (ORACLE_HOME = /oracle/product/dbse)
          ????? (SID_NAME = orcl)
          ???? )
          ? )

          LISTENER =
          ? (DESCRIPTION_LIST =
          ??? (DESCRIPTION =
          ??????? (ADDRESS_LIST =
          ????? (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
          ??????? )
          ??????? (ADDRESS_LIST =
          ????? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
          ??????? )
          ??? )
          ? )

          #tnsnames.ora
          ORCL =
          ? (DESCRIPTION =
          ??? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
          ??? (CONNECT_DATA =
          ????? (SERVER = DEDICATED)
          ????? (SERVICE_NAME = orcl)
          ??? )
          ? )

          EXTPROC_CONNECTION_DATA =
          ? (DESCRIPTION =
          ????? (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
          ??????? (CONNECT_DATA =
          ????? (SID = PLSExtProc)
          ????? (PRESENTATION = RO)
          ??? )
          ? )

          其中SERVICE_NAME與SID_NAME一定要和.bash_profile中的ORACLE_SID相一致,否則無法啟動

          4. 啟動Oracle
          以oracle用戶登錄

          4.1 啟動TNS監聽器
          $ lsnrctl start
          出現如下顯示,表示監聽服務成功開啟
          LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 22-FEB-2006 10:24:03

          Copyright (c) 1991, 2005, Oracle.? All rights reserved.

          Starting /oracle/product/dbse/bin/tnslsnr: please wait...

          TNSLSNR for Linux: Version 10.2.0.1.0 - Production
          System parameter file is /oracle/product/dbse/network/admin/listener.ora
          Log messages written to /oracle/product/dbse/network/log/listener.log
          Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
          Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))

          Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))
          STATUS of the LISTENER
          ------------------------
          Alias???????????????????? LISTENER
          Version?????????????????? TNSLSNR for Linux: Version 10.2.0.1.0 - Production
          Start Date??????????????? 22-FEB-2006 10:24:03
          Uptime??????????????????? 0 days 0 hr. 0 min. 0 sec
          Trace Level?????????????? off
          Security????????????????? ON: Local OS Authentication
          SNMP????????????????????? OFF
          Listener Parameter File?? /oracle/product/dbse/network/admin/listener.ora
          Listener Log File???????? /oracle/product/dbse/network/log/listener.log
          Listening Endpoints Summary...
          ? (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
          ? (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=1521)))
          Services Summary...
          Service "orcl" has 1 instance(s).
          ? Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
          The command completed successfully


          4.2啟動數據庫
          9i 之后已經沒有 svrmgrl 了,所有的管理工作都通過 sqlplus 來完成:
          $ sqlplus /nolog
          SQL> connect system/change_on_install as sysdba
          SQL> startup

          出現如下顯示,表示Oracle已經成功啟動
          ORACLE instance started.

          Total System Global Area? 285212672 bytes
          Fixed Size????????????????? 1218968 bytes
          Variable Size????????????? 88082024 bytes
          Database Buffers????????? 188743680 bytes
          Redo Buffers??????????????? 7168000 bytes
          Database mounted.
          Database opened.

          4.3 自動啟動與關閉

          編輯 /etc/oratab ,把所有的 instance 的重啟動標志設置成 'Y',如:
          orcl:/oracle/product/dbse:Y

          做一個啟動腳本 /etc/init.d/dbora ,如下所示:

          #!/bin/sh
          # description: Oracle auto start-stop script.
          # chkconfig: - 20 80
          #
          # Set ORA_HOME to be equivalent to the $ORACLE_HOME
          # from which you wish to execute dbstart and dbshut;
          #
          # Set ORA_OWNER to the user id of the owner of the
          # Oracle database in ORA_HOME.

          ORA_HOME=/oracle/product/dbse
          ORA_OWNER=oracle
          if [ ! -f $ORA_HOME/bin/dbstart ]
          then
          echo "Oracle startup: cannot start"
          exit
          fi
          case "$1" in
          'start')

          # Start the Oracle databases:
          # The following command assumes that the oracle login
          # will not prompt the user for any values

          su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
          su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
          ;;
          'stop')

          # Stop the Oracle databases:
          # The following command assumes that the oracle login
          # will not prompt the user for any values

          su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
          su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
          ;;
          'restart')
          $0 stop
          $0 start
          ;;
          esac

          賦予執行權限
          chmod 750 /etc/init.d/dbora

          作成以下鏈接:
          ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
          ln -s /etc/init.d/dbora /etc/rc3.d/S99dbora


          執行以下命令:
          chkconfig --level 345 dbora on

          這樣就OK了。下次開關機的時候,Oracle也會隨之啟動/停止。

          參考信息

          http://www.dbanotes.net

          posted @ 2006-05-09 13:12 Alex 閱讀(916) | 評論 (5)編輯 收藏

          注:本文繼續分頁的上一篇 關于分頁,標簽,緩存
          hibernate分頁有現成的支持:

          query.setFirstResult(start);
          query.setMaxResults(rowNum);?


          MySql如下:
          select?*?from?table?where??limit?start,rowNum;


          Oracle如下
          select?*?from?table?where??and?rowid?not?in(select?rowid?from?t_table?where? .... and? rownum<=?(pageIndex-1)?*?size)
          and?rownum?<=?size;

          PageBean以前是設置currentPage,然后在頁面里自己判斷上一頁下一頁是什么,后來發現純粹多余,完全可以把目標頁寫進去,而且參數也統一了,以前頁面傳到Action有好幾個參數:

          if(method.equals("lastPage")){

          }
          else?if(method.equals("nextPage")){

          }
          else?if(method.equals("targetPage")){
          ????
          //.
          }


          現在統一一個參數就是pageIndex,爽多了? :)
          PageBean代碼如下:
          int?currentPage?=?1;//當前頁:Action控制
          ????int?totalPages?=?0;//總頁數?:自己運算
          ????public?static?int?pageRecorders?=?10;?//每頁記錄數,默認為10,可以在初始化的時候修改//總數據數
          ????int?pageStartRow?=?0;?//每頁的起始數? [這個字段可以去掉]
          ????int?pageEndRow?=?0;?//每頁顯示數據的終止數? [這個字段也可以去掉]
          ????boolean?hasNextPage?=?false;?//是否有下一頁:自己運算
          ????boolean?hasPreviousPage?=?false;?//是否有前一頁?:自己運算
          ????List?objList?=?new?ArrayList();//存放欲展示的對象列表
          ????int?totalRows;//總記錄數,由底層service提供

          ????
          //增加上一頁索引?[directly?to?target?page]
          ????private?int?lastPageIndex?=?1;
          ????
          //增加下一頁索引?[directly?to?target?page]
          ????private?int?nextPageIndex?=?1;

          ????
          public?int?getLastPageIndex()?{
          ????????
          return?currentPage?-?1;
          ????}

          ????
          public?int?getNextPageIndex()?{
          ????????
          return?currentPage?+?1;
          ????}


          ????
          //是否有上一頁
          ????public?boolean?isHasPreviousPage()?{
          ????????
          return?(currentPage?>?1???true?:?false);
          ????}

          ????
          //共有多少頁,service只提供有多少條記錄,多少頁數由PageBean自己運算
          ????public?int?getTotalPages()?{
          ????????
          if?(totalRows?<=?pageRecorders)?return?1;
          ????????
          return?(totalRows?%?pageRecorders?==?0???totalRows?/?pageRecorders?:?totalRows?/?pageRecorders?+?1);
          ????}

          ????
          public?int?getCurrentPage()?{
          ????????
          return?currentPage;
          ????}

          ????
          public?int?getPageEndRow()?{
          ????????
          return?pageEndRow;
          ????}

          ????
          //是否有下一頁
          ????public?boolean?isHasNextPage()?{
          ????????
          return?(currentPage?<?this.getTotalPages()???true?:?false);
          ????}

          ????
          public?int?getTotalRows()?{
          ????????
          return?totalRows;
          ????}

          ????
          public?int?getPageStartRow()?{
          ????????
          return?pageStartRow;
          ????}

          ????
          public?int?getPageRecorders()?{
          ????????
          return?pageRecorders;
          ????}

          ????
          public?void?setObjList(List?objList)?{
          ????????
          this.objList?=?objList;
          ????}

          ????
          public?void?setHasPreviousPage(boolean?hasPreviousPage)?{
          ????????
          this.hasPreviousPage?=?hasPreviousPage;
          ????}

          ????
          public?void?setTotalPages(int?totalPages)?{
          ????????
          this.totalPages?=?totalPages;
          ????}

          ????
          public?void?setCurrentPage(int?currentPage)?{
          ????????
          this.currentPage?=?currentPage;
          ????}

          ????
          public?void?setPageEndRow(int?pageEndRow)?{
          ????????
          this.pageEndRow?=?pageEndRow;
          ????}

          ????
          public?void?setHasNextPage(boolean?hasNextPage)?{
          ????????
          this.hasNextPage?=?hasNextPage;
          ????}

          ????
          public?void?setTotalRows(int?totalRows)?{
          ????????
          this.totalRows?=?totalRows;
          ????}

          ????
          public?void?setPageStartRow(int?pageStartRow)?{
          ????????
          this.pageStartRow?=?pageStartRow;
          ????}

          ????
          public?void?setPageRecorders(int?pageRecorders)?{
          ????????
          this.pageRecorders?=?pageRecorders;
          ????}

          ????
          public?List?getObjList()?{
          ????????
          return?objList;
          ????}
          }

          在action中負責把pageIndex傳給PageBean,以及通過service得到的記錄總數傳給pageBean就OK了


          補充:另,在IDEA中文站上看到一篇文章?
          分頁,心中的痛? ????? 提到用一個統一的接口來規范:
          代碼如下:
          public?interface?Page?{
          boolean?isFirstPage();
          boolean?isLastPage();
          boolean?hasNextPage();
          boolean?hasPreviousPage();
          int?getLastPageNumber();
          Object?getThisPageElements();
          int?getTotalNumberOfElements();
          int?getThisPageFirstElementNumber();
          int?getThisPageLastElementNumber();
          int?getNextPageNumber();
          int?getPreviousPageNumber();
          int?getPageSize();
          int?getThisPageNumber?();
          }

          個人感覺思想挺好,不過我還是喜歡用一個PageBean類就足夠了,沒必要搞復雜了,在PageBean中其實是currentPage為核心.

          一個工具能夠在任何地方都能容易的嵌入進去,這就很小巧了,也就夠用了.? :)
          posted @ 2006-05-08 22:46 Alex 閱讀(1197) | 評論 (0)編輯 收藏

          注:這個說的挺全面,考慮到了兩種情況,一個是超連接,一個是表單

          原文是這里


          Struts Token 機制可以解決這個問題。

          1. ? 防止通過超鏈接重復訪問 Struts Action 。

          如果我們要防止 A 的默認頁面 J 中指向 K 的超鏈接重復提交數據,按照下列步驟即可:

          a. ? 如果 J 是從 Struts Action 轉發而來,我們要在該 Struts Action execute 方法中添加下面的一行:

          ??? saveToken(request);

          b. ? 如果 J 不是從 Struts Action 轉發而來,那么新建一個 Struts Action ,在該 Struts Action excute 方法中增加上面的一行,然后再從該 action 轉到 J 頁面。

          c. ? J 頁面中使用 Struts 標簽生成指向 K 的超鏈接,如:

          ?? <html:link action="/deleteLayoutAction?layoutId=0" transaction="true" >delete</html:link>

          ?? 注意紅色字體部分。

          d. ? <html:link> 標簽指向的 action excute 方法中加入下面的代碼:

          ?? if (!isTokenValid(request)) {

          ???????????????????? return mapping.findForward(" 這種情況下就是重復提交,轉到相應的頁面 ");

          ????????????? }

          e All Done.

          2. ? 防止通過表單重復提交數據。

          a. ? 如果 J 是從 Struts Action 轉發而來,我們要在該 Struts Action execute 方法中添加下面的一行:

          ??? saveToken(request);

          b. ? 如果 J 不是從 Struts Action 轉發而來,那么新建一個 Struts Action ,在該 Struts Action excute 方法中增加上面的一行,然后再從該 action 轉到 J 頁面。

          c. ? J 頁面中表單 Action 屬性指向的 Struts action excute 方法中加入下面的代碼:

          ?? if (!isTokenValid(request)) {

          ?????????? saveToken(request);

          ???????????????????? return mapping.findForward(" 這種情況下就是重復提交,轉到相應的頁面 ");

          ?? saveToken(request);

          ????????????? }

          e All Done.
          posted @ 2006-05-08 10:02 Alex 閱讀(359) | 評論 (0)編輯 收藏

          在新窗口中添加內容到父窗口

          代碼如下:
          父窗口: form.html
          <script?language="JavaScript">
          function?addItems()?
          {
          ????
          var?AWnd=window.open('items.htm','fwId','resizable=yes,scrollbars=yes,width=300,height=400');
          ????AWnd.focus();

          }
          function?delItems()?
          {
          ??
          var?sel=document.menu.fwId;
          ??
          for(i=0;i<=sel.options.length;i++)
          ??{
          ??
          if(sel.options[i]!=null)
          ????
          if(sel.options[i].selected)
          ????{
          ??????sel.options[i]
          =null;
          ??????i
          --;
          ????}
          ??}
          }
          </script>

          <form?method="post"?name="menu">

          <select?name="fwId"?size="5"?multiple>
          </select>?
          <input?name="item"?type="button"?onClick="addItems()"?value="ìí?ó">?
          <input?name="itemDel"?type="button"?onClick="delItems()"?value="é?3y"?>?
          </form>




          新開窗口items.html:

          <script?language="JavaScript">
          function?doSubmit(value,name)?
          {
          ??????
          var?aa?=?window.opener.document;
          ????
          var?myop?=?aa.createElement("OPTION");

          ????
          for(var?j?=?0;?j?<?aa.menu.fwId.options.length;?j++)?
          ????{
          ??????????
          if(value?==?aa.menu.fwId.options[j].value)
          ????????????{
          ????????????????alert(
          "ò??-±?????£?");
          ????????????????
          return;
          ????????????}
          ????}
          ????myop.text?
          =name;
          ????myop.value?
          =value;
          ????aa.menu.fwId.add(myop);?
          }
          </script>

          <form?name="items">
          ????
          <a?onclick="javascript:doSubmit('1','test1');"?href="#">test1</a><br>
          ????
          <a?onclick="javascript:doSubmit('2','test2');"?href="#">test2</a><br>
          </form>

          posted @ 2006-05-05 20:37 Alex 閱讀(3540) | 評論 (0)編輯 收藏

          想用緩存又不想用oscache覺得
          麻煩,自己寫了個簡單的緩存,不小心發現getAllCity結果總是在第一次進去的時候數量加倍,第二次就好了,真實怪事.

          代碼如下:
          public?static?List?getAllCity(boolean?bInit)?throws XXException?{
          ????????List?cityList?
          =?new?ArrayList();
          ????????
          if?(null?==?CityInfos?||?CityInfos.size()?==?0)?bInit?=?true;
          ????????
          synchronized?(CityInfos)?{
          ????????????
          if?(bInit)?{?//retrieve?city?info?from?database
          ????????????????CityService?service?=?new?CityService();
          ????????????????cityList?
          =?service.getAllCitys();
          ????????????????CityInfos.clear();
          ????????????????
          if?(null?!=?cityList?&&?cityList.size()?>?0)?{
          ????????????????????log.info(
          "========"?+?"cityList?size?:?"?+?cityList.size()?+?"========");
          ????????????????????
          for?(Iterator?it?=?cityList.iterator();?it.hasNext();)?{
          ????????????????????????CityVo?cityVo?
          =?(CityVo)?it.next();
          ????????????????????????CityInfos.put(cityVo.getId(),?cityVo);
          ????????????????????}
          ????????????????}
          ????????????}

          ????????????cityList.addAll(CityInfos.values());
          ????????}
          ????????
          return?cityList;
          ????}

          CityInfos是一個static Hashtable,查了下原來是共用了cityList,將synchronized 里面的cityList 改成
          List tmpCityList 就可以了? :)? 為什么會犯低級錯誤呢?? :(
          posted @ 2006-03-30 14:18 Alex 閱讀(164) | 評論 (0)編輯 收藏

          ???? 時間走到了21世紀,一切都那么快,那么忙碌,那么紛繁,java世界的新觀點,新技術,恩,還有新框架層出不窮,看的我都累死了,你累么?? :)

          ???? 學完servlet學jsp,學完jsp又來了struts,用了Struts又說webwork不賴;剛學會jdbc又來了hibernate,剛對hibernate掌握了點皮毛又來了個無所不能的Spring.看看Springside里包含的技術點,看著也夠嚇人的,我在想,什么樣的項目里會用到這么多的東東呢?你會了我會么,我會了他會么? 也許xp的可能性太小了,一群牛人才能在那xp.

          ???? 哦,還有模式,感覺模式就像是ML里的姿勢,一會是老漢推車一會是69式,你可能忙的滿頭是漢,不過對方很可能就沒有feeling,也沒有high,你是不是感覺很冤? 其實有時候不需要太多的技巧,多一天體貼就夠了,那么,你體貼你的客戶了么? 反過來說,你的客戶在乎你的那些奇淫怪巧么?

          ???? 世界正變得越來越復雜,所以我們應該變得越來越簡單才對.? 這話是哪個牛人說的? 真TMD的經典? 反思下,你的思緒變的復雜了還是簡單了??
          ???
          ???? 技術不是上帝,但客戶是我們的上帝

          ???? 讓我們一起想一想,怎么體貼我們的客戶??

          ???? 一點牢騷,胡亂說幾句,不要拍磚.
          posted @ 2006-03-29 16:19 Alex 閱讀(521) | 評論 (10)編輯 收藏

          keyword: Live Templates XDoclet

          在IDEA中要寫hibernate標簽想不想用自動提示功能?  :)

          Come on!
          1. 進入 這里
          2. 把hibernate.xml文本拷到本機
          3. 把hibernate.xml copy 到IDEA的config/templates目錄下
          4. 重啟IDEA
          5. 進入IDEA的設置里的Erros,找到Unknown javadoc tags,把以下代碼copy進來
           
          happy吧    :)
          posted @ 2006-03-16 00:56 Alex 閱讀(854) | 評論 (0)編輯 收藏

          喜歡在bloglines里看一些rss,一些想有時間再看的內容就點選" keep new ",時間長了也留了不少了,清理一下,移到這里,算是backup.
          1. Equinox 1.6 發布 [appfuse的輕量級版本實現]

          2. Design Pattern , 應該選哪本書? [Head First Design Patterns]

          3. Simple Persistence for Java 1.1.0 發布 [一個簡易的方式持久化數據]
          4. hql語句查詢時,根據屬性和物理字段混查 [hibernate支持物理字段查詢,用別名的時候只能用屬性]

          5. 關于Java加密擴展的出口限制 [JAVA_HOME==>lib目錄下的local_policy.jar和US_export_policy.jar文件替換調就OK了]

          6. 使用dom4j和XPath xpath對xml的所有操作變得異常的簡單和方便,關于XPath的教程可以參照 xpath教程 另外,用oo的方式操作xml可以參考利用XMLBean輕輕松松讀寫XML感覺前者更適宜普通的配置文件的操作,后者針對大量的xml文件的讀寫操作,比如相互傳遞xml文件進行數據交換.

          7. 初識wxPython(環境配置篇) [據說開發GUI是個不錯的選擇,下載下來看了一下初步感覺不賴]
          8. 使用struts的同步令牌避免form的重復提交

          9. 重溫Struts--Validator和Tiles

          10. 本人寫的分頁的標簽,和.net中的datagrid標簽相似,只需要設置幾個屬性就可以實現分頁功能了

          11. 比較完整全面的分頁

          12. 關于分頁設計的一些做法

          13. 擴展的 通用表單驗證函數 [提到了普通html中的用法,但是不知道如果在Struts標簽中是否不支持]
          14. [原創]JAVA中圖片上疊加文字的方法

          15. 自己實現的一個加密算法

          16. 淺談hibernate性能優化的幾點建議

          17. JDBC實現oracle blob 出庫入庫

          posted @ 2006-03-12 03:55 Alex 閱讀(457) | 評論 (0)編輯 收藏

          keyword: IDEA 開發工具

          IDE其實沒什么,以前總會有人討論這個好那個好,最終也沒什么定論,各有所好,就像以前總有人喜歡討論哪個語言如何如何,新手津津樂道,老手感覺無聊。但是我今天還是要提下IDE,我只是把我認為不錯的東西分享下,僅此而已。

          偶用過的工具不多,曾用過wsad,jbuilder,netbeans和Eclipse也就裝過,幾乎沒用過。用的最多的就數jbuilder了,說實話感覺jbuilder不錯,挺方便的,而且支持的東西也比較全,不過也有一些問題,比如有時候莫名其妙的就出現編譯不通過,還有一些其他的擴展功能似乎不怎么樣。

          很早就聽說IDEA這個工具,不過身邊的人用的不多,一直也沒怎么用,裝了一個在桌面上這次終于因為是時間充足的緣故或是沖動的緣故就用了下,這一用就丟不開了? :)

          好了,下面就請跟隨我一起參與這個快樂之旅吧.

          第一。IDEA很漂亮
          ??????? 在它身上你既看到jbuilder的身影,又能感覺到Eclipse的舞姿,還有netbeans的微笑,是不是太夸張了?? :)

          第二。優化你的代碼.
          ??????? 你一直在寫代碼,但是你有過多少機會你的項目經理或者其他xp的人給你提過你的代碼建議? 也許你會說我會用checkstyle,但是單獨用這個的好像也不多,恩,我的意思是說IDEA里有一個現成的東西,就是那個Analyze下的Inspect Code,你對自己的代碼會有很多的發現哦。

          第三。jsp頁面也可以format。
          ??????? 用jbuilder的時候對普通java代碼的格式化是允許的,但是對于jsp頁面則沒有這個功能,令我開心的是我在這里碰到了,你的那些亂七八糟的html代碼可以一下子舊貌換新顏了,偷著樂吧。

          第四。裝載Struts插件,支持Struts開發.
          ??????? 恩,一開始我不敢用IDEA的考慮之一就是沒有直接的Struts支持,怕會出問題,不過這個問題現在看來已經不是問題了.
          首先請在settting===>Plugins里下載Struts Assistant[IDEA的插件不需要你單獨下載,直接在Resource里下載update就可以了],安裝好后重啟IDEA,會在控制面板出現一個Struts Assistant的button,點擊,進行屬性設置,設置"Struts distributive",目錄指向一個Struts的目錄,我是從Apache下的一個1.2的版本,同時支持1.1和1.2,就用這個吧,設置完就OK了。下一步,在IDEA里打開你的struts-config.xml文件,這是IDEA會自動產生一個struts-config.awf文件,有了這個文件后你就可以在左邊的struts assistant的panel里看到你的form和action了,以及forward,看起來很簡潔。現在你就可以new一個form或者action都可以了,怎么樣,一點也不難吧。
          另外,在jsp頁面里你會發現導入的標簽變紅了,提示找不到標簽,這一點和jbuilder不同,它不能在web.xml里直接發現這個tld文件,還需要在Resource里做一下映射,算是步太聰明,不過也就麻煩一回,do it.

          第五。導入你的項目文件到IDEA.
          ???????? IDEA支持直接從jbuilder的項目導入,也可以從Eclipse的項目導入,如果沒有看到可以從Plugins里找相應的插件,速度也很快。當然,如果你不愿意通過導入的方式這里也介紹另一個適用的辦法,在IDEA里直接新建一個工程,然后目錄直接指向你的其他項目所在的目錄就OK了,然后IDEA會自動發現src目錄,在這個的wizard過程中你還可以根據自己的情況進行調整,比如有些目錄需要Exclude,有些作為Test.這一切都是可以調整,靈活就在這里。

          第六。版本控制。
          ??????? IDEA內建支持大多數的版本控制,cvs,svn,perforce,sourcesafe,應該夠用了吧。

          第七。html文件和javascrip的動態語法支持,偶最喜歡了。
          ?????? html的任一個元素你都可以點擊鼠標跟進去看到底有哪些東西,javaScrip編輯也相當方便,這在jbuilder里是沒有的事情,恩,如果你需要其他的關于javaScrip的功能,去Plugins里看看吧,會有收獲的。

          ??????? 有用IDEA的兄弟不妨一起交流下心得,偶的msn : eclipse.wang@gmail.com

          ???????? 哎,寫說這幾點吧,我用的感覺不錯,有興趣的兄弟也嘗試一下吧,唱歌半個通宵回來寫點東西,天亮了,偶該睡覺了? :)?


          ???????? 對了,偶沒有拿IDEA的好處費在做宣傳哦,這年頭什么鳥都有,^_^
          posted @ 2006-03-05 06:42 Alex 閱讀(4643) | 評論 (11)編輯 收藏

          keyword: struts錯誤,持續構建,checkbox

          前天在運行應用時有一個頁面一點button就轉到系統錯誤頁面,折騰了好半天,在Action里打樁調試連調試信息都見不到,還以為時log4j配置出了問題,改來改去也不知道原因在哪,最后檢查居然時在Action里用錯了Form,哎,真是要命.回憶了一下,以前這個地方一直正常,怎么這次修改了別的地方就影響到這了呢,記憶中好像是因為做了一次重構不小心在批量修改的時候把這里給改了.

          現在總結一下Struts里可能常出現的錯誤的原因:

            1.配置文件里的input或者forward寫錯
            2.jsp里的Action對應的.do寫錯,實際就是對應的Form也錯了
            3.Action里Form寫錯,或者forward為空
            4.還有Form里的屬性和jsp頁面的屬性不一致

          經過這次的教訓也讓我有了一個以前不怎么重視的想法要實現,就是持續構建,如果有了持續構建我的每一次的提交都有報告和分析結果出來,防患于未然,也不至于讓我折騰半天為了一行代碼.
          方案就選maven + cc .

          目前國內用的多么?沒有調查過,不過就我目前了解到的情況,好多公司的做法真是讓人覺得有點shit,但愿越來越好,越來越規范.

          寫到這里又想起一個關于jsp的checkbox問題,例如,在一個產品刪除的頁面里,每條記錄前面有一個checkbox,我們一般的做法是給checkbox的value賦值為產品ID的值,然后Action根據ID就可以直接刪除產品了,但是問題是有時候我除了需要刪除這個產品,同時還需要在下一個頁面里再將當前頁面的東西顯示一次,讓用戶確認,就還需要除產品ID以外的信息了,該怎么辦呢?  我以前有一個比較笨的辦法就是在value里拼數據,
          比如id | name | quantity | other,最后在Action里再解析,現在想來其實沒有必要,可以用<logic:iterator/>里的indexId屬性來做。
          具體請參看這里:
          這里貼下關鍵部分的代碼:
          jsp代碼:

          <logic:iterate id="testqclist" name="testQCActionForm" property="result" indexId="index" >
          <tr bgcolor="#FFFFFF">
          <td height="26" bgcolor="#EEEEEE">
          <div align= "center" >
          <input type="checkbox" name="checkboxVal" value="<%=index%>" ></div>
          </td>
          </tr>
          </logic:iterate>

          Action代碼: [原文作者寫在Form里實現,不過我個人喜歡在Action里做,看你情況了]

          if (checkboxVal != null && checkboxVal.length > 0){

                
          for (int i = 0; i < checkboxVal.length; i++){

                  
          int chkVal = Integer.parseInt(checkboxVal[i]); //取得checkbox的index值

                  //..........................

                  checkform.setSaamsampleid (datesampledVal[chkVal].toString());//取得和checkbox為true的其他屬性的值

                  checkform.setSaamsampleid(saamsampleidVal[chkVal].toString());

                  //......................................................

                }


              }



           

          posted @ 2006-03-05 05:58 Alex 閱讀(969) | 評論 (0)編輯 收藏

          keyword :  Meta  html  header  content
            引言

            您的個人網站即使做得再精彩,在“浩瀚如?!钡木W絡空間中,也如一葉扁舟不易為人發現,如何推廣
          個人網站,人們首先想到的方法無外乎以下幾種:
            
            ● 在搜索引擎中登錄自己的個人網站
            
            ● 在知名網站加入你個人網站的鏈接

            ● 在論壇中發帖子宣傳你的個人網站

            很多人卻忽視了HTML標簽META的強大功效,一個好的META標簽設計可以大大提高你的個人網站被搜索到的可能性,有興趣嗎,誰我來重新認識一下META標簽吧!

            META標簽是HTML語言HEAD區的一個輔助性標簽,它位于HTML文檔頭部的<HEAD>標記和<TITLE>標記之間,它提供用戶不可見的信息。meta標簽通常用來為搜索引擎robots定義頁面主題,或者是定義用戶瀏覽器上的cookie;它可以用于鑒別作者,設定頁面格式,標注內容提要和關鍵字;還可以設置頁面使其可以根據你定義的時間間隔刷新自己,以及設置RASC內容等級,等等。


            詳細介紹

            下面介紹一些有關 標記的例子及解釋。

            META標簽分兩大部分:HTTP標題信息(HTTP-EQUIV)和頁面描述信息(NAME)。


            ★HTTP-EQUIV

            HTTP-EQUIV類似于HTTP的頭部協議,它回應給瀏覽器一些有用的信息,以幫助正確和精確地顯示網頁內容。常用的HTTP-EQUIV類型有:


            1、Content-Type和Content-Language (顯示字符集的設定)

            說明:設定頁面使用的字符集,用以說明主頁制作所使用的文字已經語言,瀏覽器會根據此來調用相應的字符集顯示page內容。

            用法:<Meta http-equiv="Content-Type" Content="text/html; Charset=gb2312">
                <Meta http-equiv="Content-Language" Content="zh-CN">

            注意: 該META標簽定義了HTML頁面所使用的字符集為GB2132,就是國標漢字碼。如果將其中的“charset=GB2312”替換成“BIG5”,則該頁面所用的字符集就是繁體中文Big5碼。當你瀏覽一些國外的站點時,IE瀏覽器會提示你要正確顯示該頁面需要下載xx語支持。這個功能就是通過讀取HTML頁面META標簽的Content-Type屬性而得知需要使用哪種字符集顯示該頁面的。如果系統里沒有裝相應的字符集,則IE就提示下載。其他的語言也對應不同的charset,比如日文的字符集是“iso-2022-jp ”,韓文的是“ks_c_5601”。
                
            Content-Type的Content還可以是:text/xml等文檔類型;
            Charset選項:ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1,x-cns11643-2等字符集;Content-Language的Content還可以是:EN、FR等語言代碼。

            2、Refresh (刷新)

             說明:讓網頁多長時間(秒)刷新自己,或在多長時間后讓網頁自動鏈接到其它網頁。
             用法:<Meta http-equiv="Refresh" Content="30">
                <Meta http-equiv="Refresh" Content="5; Url=http://www.xia8.net">
             注意:其中的5是指停留5秒鐘后自動刷新到URL網址。

            3、Expires (期限)

             說明:指定網頁在緩存中的過期時間,一旦網頁過期,必須到服務器上重新調閱。
             用法:<Meta http-equiv="Expires" Content="0">
                <Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT">
             注意:必須使用GMT的時間格式,或直接設為0(數字表示多少時間后過期)。

            4、Pragma (cach模式)

             說明:禁止瀏覽器從本地機的緩存中調閱頁面內容。
             用法:<Meta http-equiv="Pragma" Content="No-cach">
             注意:網頁不保存在緩存中,每次訪問都刷新頁面。這樣設定,訪問者將無法脫機瀏覽。

            5、Set-Cookie (cookie設定)

            說明:瀏覽器訪問某個頁面時會將它存在緩存中,下次再次訪問時就可從緩存中讀取,以提高速度。當你希望訪問者每次都刷新你廣告的圖標,或每次都刷新你的計數器,就要禁用緩存了。通常HTML文件沒有必要禁用緩存,對于ASP等頁面,就可以使用禁用緩存,因為每次看到的頁面都是在服務器動態生成的,緩存就失去意義。如果網頁過期,那么存盤的cookie將被刪除。
             用法:<Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday,
                 21-Oct-98 16:14:21 GMT; path=/">
             注意:必須使用GMT的時間格式。

            6、Window-target (顯示窗口的設定)

             說明:強制頁面在當前窗口以獨立頁面顯示。
             用法:<Meta http-equiv="Widow-target" Content="_top">
             注意:這個屬性是用來防止別人在框架里調用你的頁面。Content選項:_blank、_top、_self、_parent。

            7、Pics-label (網頁RSAC等級評定)
             說明:在IE的Internet選項中有一項內容設置,可以防止瀏覽一些受限制的網站,而網站的限制級
                別就是通過該參數來設置的。
             用法:<META http-equiv="Pics-label" Contect=
                         "(PICS-1.1'http://www.rsac.org/ratingsv01.html'
                 I gen comment 'RSACi North America Sever' by 'inet@microsoft.com'
                 for 'http://www.microsoft.com' on '1997.06.30T14:21-0500' r(n0 s0 v0 l0))">

             注意:不要將級別設置的太高。RSAC的評估系統提供了一種用來評價Web站點內容的標準。用戶可以設置Microsoft Internet Explorer(IE3.0以上)來排除包含有色情和暴力內容的站點。上面這個例子中的HTML取自Microsoft的主頁。代碼中的(n 0 s 0 v 0 l 0)表示該站點不包含不健康內容。級別的評定是由RSAC,即美國娛樂委員會的評級機構評定的,如果你想進一步了解RSAC評估系統的等級內容,或者你需要評價自己的網站,可以訪問RSAC的站點:http://www.rsac.org/。

            8、Page-Enter、Page-Exit (進入與退出)

             說明:這個是頁面被載入和調出時的一些特效。
             用法:<Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)">
                <Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)">
             注意:blendTrans是動態濾鏡的一種,產生漸隱效果。另一種動態濾鏡RevealTrans也可以用于頁面進入與退出效果:

                <Meta http-equiv="Page-Enter" Content="revealTrans(duration=x, transition=y)">
                <Meta http-equiv="Page-Exit" Content="revealTrans(duration=x, transition=y)">

                 Duration  表示濾鏡特效的持續時間(單位:秒)
                 Transition 濾鏡類型。表示使用哪種特效,取值為0-23。

                 0 矩形縮小
                 1 矩形擴大
                 2 圓形縮小
                 3 圓形擴大
                 4 下到上刷新
                 5 上到下刷新
                 6 左到右刷新
                 7 右到左刷新
                 8 豎百葉窗
                 9 橫百葉窗
                 10 錯位橫百葉窗
                 11 錯位豎百葉窗
                 12 點擴散
                 13 左右到中間刷新
                 14 中間到左右刷新
                 15 中間到上下
                 16 上下到中間
                 17 右下到左上
                 18 右上到左下
                 19 左上到右下
                 20 左下到右上
                 21 橫條
                 22 豎條
                 23 以上22種隨機選擇一種

            9、MSThemeCompatible (XP主題)
             說明:是否在IE中關閉 xp 的主題
             用法:<Meta http-equiv="MSThemeCompatible" Content="Yes">
             注意:關閉 xp 的藍色立體按鈕系統顯示樣式,從而和win2k 很象。

            10、IE6 (頁面生成器)
             說明:頁面生成器generator,是ie6
             用法:<Meta http-equiv="IE6" Content="Generator">
             注意:用什么東西做的,類似商品出廠廠商。

            11、Content-Script-Type (腳本相關)
             說明:這是近來W3C的規范,指明頁面中腳本的類型。
             用法:<Meta http-equiv="Content-Script-Type" Content="text/javascript">
             注意:

            ★NAME變量

            name是描述網頁的,對應于Content(網頁內容),以便于搜索引擎機器人查找、分類(目前幾乎所有的搜索引擎都使用網上機器人自動查找meta值來給網頁分類)。
            name的value值(name="")指定所提供信息的類型。有些值是已經定義好的。例如description(說明)、keyword(關鍵字)、refresh(刷新)等。還可以指定其他任意值,如:creationdate(創建日期) 、
          document ID(文檔編號)和level(等級)等。
            name的content指定實際內容。如:如果指定level(等級)為value(值),則Content可能是beginner(初級)、intermediate(中級)、advanced(高級)。


            1、Keywords (關鍵字)
             說明:為搜索引擎提供的關鍵字列表
             用法:<Meta name="Keywords" Content="關鍵詞1,關鍵詞2,關鍵詞3,關鍵詞4,……">
             注意:各關鍵詞間用英文逗號“,”隔開。META的通常用處是指定搜索引擎用來提高搜索質量的關鍵詞。當數個META元素提供文檔語言從屬信息時,搜索引擎會使用lang特性來過濾并通過用戶的語言優先參照來顯示搜索結果。例如:
                <Meta name="Kyewords" Lang="EN" Content="vacation,greece,sunshine">
                <Meta name="Kyewords" Lang="FR" Content="vacances,grè:ce,soleil">

            2、Description (簡介)
             說明:Description用來告訴搜索引擎你的網站主要內容。
             用法:<Meta name="Description" Content="你網頁的簡述">
             注意:

            3、Robots (機器人向導)
             說明:Robots用來告訴搜索機器人哪些頁面需要索引,哪些頁面不需要索引。Content的參數有all、none、index、noindex、follow、nofollow。默認是all。
             用法:<Meta name="Robots" Content="All|None|Index|Noindex|Follow|Nofollow">
             注意:許多搜索引擎都通過放出robot/spider搜索來登錄網站,這些robot/spider就要用到meta元素的一些特性來決定怎樣登錄。

              all:文件將被檢索,且頁面上的鏈接可以被查詢;
              none:文件將不被檢索,且頁面上的鏈接不可以被查詢;(和 "noindex, no follow" 起相同作用)
              index:文件將被檢索;(讓robot/spider登錄)
              follow:頁面上的鏈接可以被查詢;
              noindex:文件將不被檢索,但頁面上的鏈接可以被查詢;(不讓robot/spider登錄)
             nofollow:文件將不被檢索,頁面上的鏈接可以被查詢。(不讓robot/spider順著此頁的連接往下探找)

            4、Author (作者)
             說明:標注網頁的作者或制作組
             用法:<Meta name="Author" Content="張三,abc@sina.com">
             注意:Content可以是:你或你的制作組的名字,或Email

            5、Copyright (版權)
             說明:標注版權
             用法:<Meta name="Copyright" Content="本頁版權歸Zerospace所有。All Rights Reserved">
             注意:

            6、Generator (編輯器)
             說明:編輯器的說明
             用法:<Meta name="Generator" Content="PCDATA|FrontPage|">
             注意:Content="你所用編輯器"

            7、revisit-after (重訪)
             說明:
             用法:<META name="revisit-after" CONTENT="7 days" >
             注意:

            ★Head中的其它一些用法


            1、scheme (方案)
             說明:scheme can be used when name is used to specify how the value of content should
                be interpreted.
             用法:<meta scheme="ISBN" name="identifier" content="0-14-043205-1" />
             注意:

            2、Link (鏈接)
             說明:鏈接到文件
             用法:<Link href="soim.ico" rel="Shortcut Icon">
             注意:很多網站如果你把她保存在收件夾中后,會發現它連帶著一個小圖標,如果再次點擊進入之后還會發現地址欄中也有個小圖標?,F在只要在你的頁頭加上這段話,就能輕松實現這一功能。<LINK> 用來將目前文件與其它 URL 作連結,但不會有連結按鈕,用於 <HEAD> 標記間, 格式如下:
                 <link href="URL" rel="relationship">
                 <link href="URL" rev="relationship">

            3、Base (基鏈接)
             說明:插入網頁基鏈接屬性
             用法:<Base target="_blank">
             注意:你網頁上的所有相對路徑在鏈接時都將在前面加上“http://www.cn8cn.com/”。其中target="_blank"是鏈接文件在新的窗口中打開,你可以做其他設置。將“_blank”改為“_parent”是鏈接文件將在當前窗口的父級窗口中打開;改為“_self”鏈接文件在當前窗口(幀)中打開;改為“_top”鏈接文件全屏顯示。


            以上是META標簽的一些基本用法,其中最重要的就是:Keywords和Description的設定。為什么呢?道理很簡單,這兩個語句可以讓搜索引擎能準確的發現你,吸引更多的人訪問你的站點!根據現在流行搜索引擎(Google,Lycos,AltaVista等)的工作原理,搜索引擎先派機器人自動在WWW上搜索,當發現新的網站時,便于檢索頁面中的Keywords和Description,并將其加入到自己的數據庫,然后再根據關鍵詞的密度將網站排序。

            由此看來,我們必須記住添加Keywords和Description的META標簽,并盡可能寫好關鍵字和簡介。否則,
          后果就會是:
            
            ● 如果你的頁面中根本沒有Keywords和Description的META標簽,那么機器人是無法將你的站點加入數
              據庫,網友也就不可能搜索到你的站點。

            ● 如果你的關鍵字選的不好,關鍵字的密度不高,被排列在幾十甚至幾百萬個站點的后面被點擊的可
              能性也是非常小的。

            寫好Keywords(關鍵字)要注意以下幾點:


            ● 不要用常見詞匯。例如www、homepage、net、web等。

            ● 不要用形容詞,副詞。例如最好的,最大的等。

            ● 不要用籠統的詞匯,要盡量精確。例如“愛立信手機”,改用“T28SC”會更好。


            “三人之行,必有我師”,尋找合適關鍵詞的技巧是:到Google、Lycos、Alta等著名搜索引擎,搜索與
          你的網站內容相仿的網站,查看排名前十位的網站的META關鍵字,將它們用在你的網站上,效果可想而知了。

            ★小竅門

            為了提高搜索點擊率,這里還有一些“捷徑”可以幫得到你:

            ● 為了增加關鍵詞的密度,將關鍵字隱藏在頁面里(將文字顏色定義成與背景顏色一樣)。

            ● 在圖像的ALT注釋語句中加入關鍵字。如:<IMG SRC="xxx.gif" Alt="Keywords">

            ● 利用HTML的注釋語句,在頁面代碼里加入大量關鍵字。用法: <!-- 這里插入關鍵字 -->


          <head>
            <title>文件頭,顯示在瀏覽器標題區</title>
            <meta http-equiv="Content-Language" content="zh-cn">
            <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
            <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
            <meta name="ProgId" content="FrontPage.Editor.Document">
            <meta name="制作人" content="唐蓉生">
            <meta name="主題詞" content="HTML 網頁制作 課件">
          </head>
          posted @ 2006-03-02 15:46 Alex 閱讀(329) | 評論 (0)編輯 收藏

          1. Java組件VLDocking 2.0.6 新版發布[swing的輔助工具]
          2. 七劍與java開源工具 [Eclipse + cvs + ant + junit + hibernate + spring + struts]
          3. InfoWorld 預測:2006年值得期待的11項創新
          4. Java API文檔工具Ashkelon 0.9 發布
          5. 問題跟蹤管理工具JIRA 3.5 發布
          6. JAVA操作Excel的方法
          7. Jetspeed介紹


          posted @ 2006-02-26 00:35 Alex 閱讀(166) | 評論 (0)編輯 收藏

               摘要: keyword:分頁 緩存 eXtremeTable oscache 引子:這幾天在弄一個關于頁面的分頁,查了一下網上的資料,大都不合要求,要么就是說怎么在數據庫這個層面上如何實現,暈,有了hibernate我用那么費勁翻身么.看到一個用的比較多的方案是做了一個Page工具類,實現諸如getBooks(),getNextPage(),看了一下底層實現居然是"select * from book",...  閱讀全文
          posted @ 2006-02-25 21:26 Alex 閱讀(2683) | 評論 (6)編輯 收藏

               摘要: keyword: 配置 Tomcat配置 MySql配置 server.conf my.ini 啟動參數 虛擬機參數 jsp預編譯 Author: Alex發布環境: Tomcat5 + MySql4 +Hibernate + Win2003 一.MySql配置文件 my.ini文件配置Code highlighting produced by Actipro CodeHighlighte...  閱讀全文
          posted @ 2006-02-24 12:52 Alex 閱讀(2499) | 評論 (4)編輯 收藏

          keyword:MySql字段,Hibernate session

          一.MySql字段敏感

          這幾天怪問題真是不少,這不剛建的一個數據庫的表用MiddleGen批量生成hbm.xml文件居然和數據庫的數據類型不一致.
          MySql建表語句如下:
          drop table if exists book;

          /*==============================================================*/
          /* Table: book                                                  */
          /*==============================================================*/
          create table book
          (
             id                             
          int                            not null,
             name                           
          varchar(100),
             author                         
          varchar(100),
             date                           date,
             price                          
          int,
             
          primary key (id)
          )
          comment
          ="Book table"
          type 
          = InnoDB;

          生成的hbm.xml文件如下:

          <?xml version="1.0"?>
          <!DOCTYPE hibernate-mapping PUBLIC
              "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" 
          >
              
          <hibernate-mapping>
          <!-- 
              Created by the Middlegen Hibernate plugin 2.1

              http://boss.bekk.no/boss/middlegen/
              http://www.hibernate.org/
          -->

          <class 
              
          name="net.foxlog.prj.Book" 
              table
          ="book"
          >
              
          <meta attribute="class-description" inherit="false">
                 @hibernate.class
                  table="book"
              
          </meta>

              
          <id
                  
          name="id"
                  type
          ="java.lang.Long"
                  column
          ="id"
              
          >
                  
          <meta attribute="field-description">
                     @hibernate.id
                      generator-class="assigned"
                      type="java.lang.Long"
                      column="id"


                  
          </meta>
                  
          <generator class="assigned" />
              
          </id>

              
          <property
                  
          name="name"
                  type
          ="java.lang.String"
                  column
          ="name"
                  length
          ="100"
              
          >
                  
          <meta attribute="field-description">
                     @hibernate.property
                      column="name"
                      length="100"
                  
          </meta>    
              
          </property>
              
          <property
                  
          name="author"
                  type
          ="java.lang.String"
                  column
          ="author"
                  length
          ="100"
              
          >
                  
          <meta attribute="field-description">
                     @hibernate.property
                      column="author"
                      length="100"
                  
          </meta>    
              
          </property>
              
          <property
                  
          name="date"
                  type
          ="java.sql.Date"
                  column
          ="date"
                  length
          ="10"
              
          >
                  
          <meta attribute="field-description">
                     @hibernate.property
                      column="date"
                      length="10"
                  
          </meta>    
              
          </property>
              
          <property
                  
          name="price"
                  type
          ="java.lang.String"
                  column
          ="price"
                  length
          ="10"
              
          >
                  
          <meta attribute="field-description">
                     @hibernate.property
                      column="price"
                      length="10"
                  
          </meta>    
              
          </property>

              
          <!-- Associations -->
            

          </class>
          </hibernate-mapping>

          注意到沒有,id的類型變成了Long型了,而price居然變成了String了,暈啊.

          各位碰到過這個問題么?

          最后還是找到問題所在了,實際上是建表有問題,問題就出在字段的名稱上,把id改為ID,price改為PRICE就沒問題了!  MySql對id和price敏感? 不得而知,目前看來好像是這樣.只是提醒我以后建表養成一個習慣,都用大寫的就沒問題了.
          沒想到一次測試中隨便建的一個表發現了這么個有趣的事情  :)

          二.Hibernate的session關閉問題
          用hibernate的工具類獲得session有沒有碰到過session is closed的錯誤提示? 我又幸運的碰到這個問題了,呵呵,我怎么有那么多問題啊,暈了,我看來是問題先生了,我的一個同事上次也跟我說過這個事情,后來他沒有正面解決這個,繞過去了,他用Spring去替自己解決了,呵呵,也夠狠的.不過問題實際上是獲得session的時候需要增加一個判斷. 即 session.isOpen() == false;
           
          DBUtil.java代碼如下:
          /**
               * 返回一個可用的數據庫Session連接
               * 
          @return Hibernate中對數據庫的Session連接
               * 
          @throws HibernateException
               
          */
              
          public static Session currentSession() throws HibernateException
              {
                  Session s 
          = (Session) session.get();
                  
          // Open a new Session, if this Thread has none yet
                  if (null==|| s.isOpen()==false)//注意這里
                  {
                      s 
          = sessionFactory.openSession();
                      session.set(s);
                  }
                  
          return s;
              }


          posted @ 2006-02-24 00:25 Alex 閱讀(1376) | 評論 (0)編輯 收藏

          僅列出標題
          共15頁: First 上一頁 7 8 9 10 11 12 13 14 15 下一頁 
          主站蜘蛛池模板: 阳新县| 敖汉旗| 怀集县| 土默特左旗| 女性| 惠水县| 平顺县| 浮梁县| 齐齐哈尔市| 综艺| 理塘县| 交口县| 吉水县| 锦屏县| 江都市| 福清市| 文昌市| 即墨市| 雅江县| 昌都县| 定结县| 凯里市| 潢川县| 怀宁县| 锦州市| 西吉县| 南丹县| 桑植县| 登封市| 健康| 杂多县| 浦县| 邢台市| 云安县| 阿拉善右旗| 黑山县| 商水县| 辰溪县| 巴塘县| 娄烦县| 介休市|