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

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

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

    細(xì)心!用心!耐心!

    吾非文人,乃市井一俗人也,讀百卷書(shū),跨江河千里,故申城一游; 一兩滴辛酸,三四年學(xué)業(yè),五六點(diǎn)粗墨,七八筆買(mǎi)賣,九十道人情。

    BlogJava 聯(lián)系 聚合 管理
      1 Posts :: 196 Stories :: 10 Comments :: 0 Trackbacks

    劉杰劉杰隨時(shí)都在家,因?yàn)閯⒔懿豢帷5乾F(xiàn)在不會(huì)了,因?yàn)閯⒔茉谟巫?#8230;…

    2006-08-31

    今天整理了一下深喉嚨

    歸類于: 心情日記 — maxazure @ 5:53 pm

    用了一天的時(shí)間,查缺補(bǔ)漏,截至目前為止,全新采集已經(jīng)做上去了,修改了審核界面。還有問(wèn)題就是,采集的時(shí)候經(jīng)常會(huì)采到重名的,所以要注意一下。呵呵。

    2006-08-30

    關(guān)于頁(yè)面優(yōu)化和偽靜態(tài)

    歸類于: PHP技術(shù) — maxazure @ 6:41 pm

    內(nèi)容提要:
    1)版面優(yōu)化
    2)偽靜態(tài)(重點(diǎn)涉及apache,smarty,正則)

    詳細(xì)內(nèi)容:

    一、版面優(yōu)化:
    版面優(yōu)化其實(shí)主要涉及HTML,JS,CSS,XML之間的關(guān)系(XML相關(guān)在此不作描述).
    1)一般來(lái)說(shuō),在資源共享的前提下,我們最基本的目的是讓搜索引擎所收錄(很多人被AJAX所迷惑,到處使用AJAX,但我的觀點(diǎn)是,只有在后臺(tái)或用戶操作部分才使用).
    因此,首先我們應(yīng)該按搜索引擎的收錄準(zhǔn)則來(lái)設(shè)計(jì)(其實(shí)下面說(shuō)的“偽靜態(tài)”還不是為了搜索引擎,由于相關(guān)文檔有好幾個(gè)PAGE,請(qǐng)自行搜索),主要是html的使用問(wèn)題,如<h1> <meta> <title>以及標(biāo)簽屬性的使用問(wèn)題.

    2)然后解決加載速度和內(nèi)容純度問(wèn)題:
    主要是以下幾個(gè)原則:
    1>不要為了版面美觀,把無(wú)謂的HTML加上去,建議把版面美觀的任務(wù)交給CSS,并認(rèn)真考慮CSS的可重用性,HTML只作為對(duì)信息內(nèi)容的描述(好像是XML的重點(diǎn)吧)。我在網(wǎng)上抽查了好一部分的站點(diǎn),好的網(wǎng)站,html占總內(nèi)容的50%以下,但有的站點(diǎn),文字內(nèi)容占總內(nèi)容不到20%,
    2>把JS,CSS寫(xiě)成文件.只要是利用了瀏覽器的CAHCHE,減少內(nèi)容下載
    3>HTML標(biāo)簽應(yīng)該盡量減少嵌套,我見(jiàn)過(guò)夸張的一個(gè)站點(diǎn),TABLE嵌套居然是11層..狂汗….

    3)解決數(shù)據(jù)合理處理時(shí)間
    這個(gè)涉及內(nèi)容比較多,主要是

    二、偽靜態(tài)
    這里主要描述apache,smarty的應(yīng)用,當(dāng)然,其實(shí)使用什么模板甚至不使用模板都沒(méi)什么關(guān)系的,只是筆者長(zhǎng)年使用smarty,深濃感受到它的強(qiáng)大
    該部分主要針對(duì)的是對(duì)系統(tǒng)有控制權(quán)和對(duì)apache、正則較為熟悉的用戶。

    在這里,核心是強(qiáng)調(diào)正則的應(yīng)用,如果你不會(huì)正則表達(dá)式,那么你就只能停留一成不變的抄襲階段,甚至無(wú)法使用.而且正則在應(yīng)用上普遍(基本上什么語(yǔ)言都有)、頻繁和強(qiáng)大,筆者還是建議花點(diǎn)時(shí)間,學(xué)精一點(diǎn),受用終生
    對(duì)于搜索引擎,據(jù)我所知,關(guān)鍵是處理GET中的”?”、”&”.”php”,還有就是URL長(zhǎng)度的問(wèn)題就OK了,形式就看個(gè)人愛(ài)好了。
    先說(shuō)APACHE,關(guān)鍵是使用mod_rewrite,打開(kāi)mod_rewrite模塊(在httpd.conf中,把LoadModule rewrite_module modules/mod_rewrite.so前面的“#”去除)

    如果使用了vhost(<VirtualHost>),可以在vhost里面加入類似下面的代碼:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^xxx.com$
    RewriteRule ^/([^\.\/]+)\.html$ /index.php?action=$1 [L]

    解釋:
    以上配置不一定放在vhost里,按你個(gè)人要求放得合適就行。
    第一行,表示該vhost將要使用rewrite(URL重寫(xiě))
    第二行,RewriteCond是用于如果后面條件符合(第一個(gè)參數(shù)滿足第二個(gè)參數(shù),其中第二個(gè)參數(shù)為正則表達(dá)式),則執(zhí)行下面的RewriteRule指令,其中%{xxxx}表示是apache的變量,%{HTTP_HOST}表示URL的主機(jī)(域名),其它變量請(qǐng)查看apache2手冊(cè)
    第三行,實(shí)現(xiàn)url重寫(xiě)(重頭戲),第一個(gè)參數(shù)為在瀏覽器中輸入的url,滿足該正則的uri才執(zhí)行重寫(xiě),第二個(gè)參數(shù)是重寫(xiě)規(guī)則,即把滿足第一個(gè)參數(shù)的url按照該規(guī)則轉(zhuǎn)換成你須要的url在這里筆者必須指出,重寫(xiě)后的url如果包含”http://”,跳轉(zhuǎn)后的地址會(huì)顯示在瀏覽器的地址欄中。第三個(gè)參數(shù)是一些控制,如以上[L]表示該重寫(xiě)是最后一條,后面的重寫(xiě)規(guī)則不再被執(zhí)行。

    smarty部分:
    主要是處理輸出的頁(yè)面內(nèi)容,你使用apache的rewrite后,你頁(yè)面中的鏈接當(dāng)然使用了它的規(guī)則了,如:原來(lái)是abc.php?action=doit就要改用類似abc/action-doit.html這樣的方式表示,當(dāng)然,你可以在做頁(yè)面時(shí)自己手動(dòng)去改,但我覺(jué)得這是比較笨的方法.為什么不去使用ob_xxxxx()去控制呢?(ob_xxxx()系的函數(shù)使用請(qǐng)參考php手冊(cè)).在這里的介紹使用smarty去代替,因?yàn)檫@樣會(huì)更加靈活
    在smarty中,使用register_outputfilter()注冊(cè)一個(gè)處理方法即可,具體方法類似為:
    //先定義好一個(gè)處理函數(shù)
    function change_url($tpl_output, &$smarty)
    {
            $tpl_output=preg_replace(”/\/index.php?\?action=([^&]+)/i”,”/\\1.html”,$tpl_output);
            return $tpl_output;
            }
    //該函數(shù)第一個(gè)參數(shù)是smarty的頁(yè)面內(nèi)容,第二個(gè)是smarty指針
    //然后使用
    $tpl->register_outputfilter(”change_url”);

    register_outputfilter()方法是輸出過(guò)濾函數(shù),即交給 change_url($tpl_output, &$smarty)第一個(gè)參數(shù)是smarty處理后的頁(yè)面內(nèi)容
    同類型的還有前過(guò)濾方法register_prefilter(),即把smarty模板交給第一個(gè)參數(shù),詳細(xì)使用方法請(qǐng)參考smarty手冊(cè)

    如果上述內(nèi)容有錯(cuò)漏,請(qǐng)?jiān)彶⒅刚?/p>

    看了下表,一點(diǎn)了..已經(jīng)寫(xiě)了一個(gè)小時(shí),累.要想午覺(jué)了…

    FedoraCore5下PHP服務(wù)器配置

    歸類于: PHP技術(shù) — maxazure @ 6:31 pm

    系統(tǒng)已經(jīng)安裝的軟件:
    zlib: zlib-1.2.3-1.2.1
    libxml: libxml2-2.6.23-1.2
    libpng: libpng-1.2.8-2.2.1
    freetype: freetype-2.1.10-5.2.1
    gd: gd-2.0.33-6.2

    需要下載安裝的軟件:
    把以下軟件包下載到:/root/software/目錄下
    apache2: httpd-2.0.59.tar.gz
    mysql5: mysql-max-5.0.24-linux-i686-glibc23.tar.gz
    jpeg6: jpegsrc.v6b.tar.gz
    php5:php-5.1.5.tar.gz

    安裝apache2:
    進(jìn)入目錄/root/software/
    # cd /root/software/
    解壓httpd-2.0.59.tar.gz
    # tar -zvxf httpd-2.0.59.tar.gz
    進(jìn)入httpd-2.0.59目錄
    # cd httpd-2.0.59
    生成/usr/local/apache2目錄
    # mkdir -p /usr/local/apache2
    配置安裝目錄
    # ./configure –prefix=/usr/local/apache2 –enable-modules=so –enable-rewrite
    編譯
    # make
    安裝
    # make install
    安裝完畢
    啟動(dòng)apahce
    # /usr/local/apache2/bin/apachectl -k start
    用瀏覽器查看http://localhost,如果可以正常顯示,說(shuō)明apache已經(jīng)配置成功了
    停止apache
    # /usr/local/apache2/bin/apachectl -k stop

    安裝mysql:
    添加mysql用戶及用戶組
    # groupadd mysql
    # useradd -g mysql mysql
    解壓
    # cd /root/software/
    # gunzip < mysql-max-5.0.24-linux-i686-glibc23.tar.gz | tar xvf -
    復(fù)制
    # cp -r mysql-max-5.0.24-linux-i686-glibc23   /usr/local/mysql
    生成mysql系統(tǒng)數(shù)據(jù)庫(kù)
    # cd /usr/local/mysql
    # scripts/mysql_install_db –user=mysql
    更改權(quán)限
    chown -R root  .
    chown -R mysql data
    chgrp -R mysql .
    啟動(dòng)mysql服務(wù)
    # /usr/local/mysql/bin/mysqld_safe –user=mysql &
    用root帳號(hào)訪問(wèn)mysql數(shù)據(jù)庫(kù)
    # /usr/local/mysql/bin/mysql -u root
    關(guān)閉mysql服務(wù)
    # /usr/local/mysql/bin/mysqladmin shutdown

    安裝 jpeg6:
    建立目錄
    # mkdir -p /usr/local/jpeg6
    # mkdir -p /usr/local/jpeg6/bin
    # mkdir -p /usr/local/jpeg6/lib
    # mkdir -p /usr/local/jpeg6/include
    # mkdir -p /usr/local/jpeg6/man
    # mkdir -p /usr/local/jpeg6/man1
    # mkdir -p /usr/local/jpeg6/man/man1
    解壓,編譯,安裝
    # cd /root/software/
    # tar -zvxf jpegsrc.v6b.tar.gz
    # cd jpeg-6b
    # ./configure –prefix=/usr/local/jpeg6/ –enable-shared –enable-static
    # make
    # make install

    復(fù)制GD庫(kù)文件:
    復(fù)制文件gd.h和libgd.so到gd-2.0.33目錄下
    cp  /usr/include/gd.h  /usr/share/doc/gd-2.0.33
    cp  /usr/lib/libgd.so    /usr/share/doc/gd-2.0.33

    安裝php5:
    解壓
    # cd /root/software/
    # tar -zvxf php-5.1.5.tar.gz
    # mkdir -p /usr/local/php
    # cd php-5.1.5
    編譯,安裝
    # ./configure –prefix=/usr/local/php –with-apxs2=/usr/local/apache2/bin/apxs –with-mysql=/usr/local/mysql/ –with-libxml-dir=/usr/share/doc/libxml2-2.6.23 –with-gd=/usr/share/doc/gd-2.0.33 –with-jpeg-dir=/usr/local/jpeg6/ –with-png=/usr/share/doc/libpng-1.2.8 –with-zlib-dir=/usr/share/doc/zlib-1.2.3 –with-freetype-dir=/usr/share/doc/freetype-2.1.10 –enable-ftp –enable-soap
    # make
    # make install
    復(fù)制配置文件
    # cp php.ini-dist /usr/local/php/php.ini

    其中
    –prefix=/usr/local/php
    –with-apxs2=/usr/local/apache2/bin/apxs
    –with-mysql=/usr/local/mysql/
    –with-libxml-dir=/usr/share/doc/libxml2-2.6.23
    是必要的選項(xiàng)

    配置php:
    #  vi  /usr/local/php/php.ini
    找到register_globals = off,把off修改為on
    找到;extension=php_mbstring.dll,把前面的;號(hào)刪掉
    找到;extension=php_mysql.dll,把前面的;號(hào)刪掉

    配置apache2支持php:
    # vi /usr/local/apache2/conf/httpd.conf
    找到DirectoryIndex index.html…這一行
    修改為DirectoryIndex index.htm index.html index.php
    找到LoadModule php5_module modules/libphp5.so在其下添加以下內(nèi)容:
    PHPIniDir “/usr/local/php”
    找到 AddType application/x-gzip .gz .tgz 在其下添加如下內(nèi)容:
    AddType application/x-httpd-php .php
    重啟apache
    # /usr/local/apache2/bin/apachectl restart
    在/usr/local/apache2/htdocs目錄里新建index.php文件,文件內(nèi)容為:
    <?php
    phpinfo();
    ?>
    在瀏覽器中輸入U(xiǎn)RL為http://localhost/index.php進(jìn)行測(cè)試

    新概念不可不知

    歸類于: 技術(shù)前沿 — maxazure @ 5:42 pm

    RSS RSS的全稱是Really Simple Syndication,是一種描述和同步網(wǎng)站內(nèi)容的格式,是目前使用最廣泛的XML應(yīng)用。RSS搭建了信息迅速傳播的一個(gè)技術(shù)平臺(tái),使得每個(gè)人都成為潛在的信息提供者。發(fā)布一個(gè)RSS文件后,這個(gè)RSS中包含的信息就能直接被其他站點(diǎn)調(diào)用,而且由于這些數(shù)據(jù)都是標(biāo)準(zhǔn)的XML格式,所以也能在其他的終端和服務(wù)中使用。

    Feed Feed比起RSS更為廣義。是RSS,Atom的綜合稱謂,并且包容各個(gè)版本。比如RSS2.0,RSS0.91,Atom0.3。 Atom 簡(jiǎn)單的講ATOM是一種訂閱Blog的格式。它與RSS相比來(lái)講,有更大的彈性。深入的講是與XML的格式定義的問(wèn)題。但與RSS一樣,可以用于訂閱閱讀。

    網(wǎng)摘 網(wǎng)摘是一個(gè)在線的網(wǎng)頁(yè)收藏夾,它可以讓您收藏每一個(gè)您感興趣的網(wǎng)頁(yè)、網(wǎng)址,將它們保存下來(lái),以便日后查閱。通過(guò)網(wǎng)摘收藏夾,還可以把您收藏的網(wǎng)頁(yè)共享給大家。網(wǎng)摘不同于blog,網(wǎng)摘所關(guān)注的不是書(shū)寫(xiě),而是閱讀,是如何消化數(shù)字媒體(包括blog)。

    Podcast Podcast這個(gè)單詞源于Broadcast和iPod組合。是一種在互聯(lián)網(wǎng)上發(fā)布文件并允許用戶訂閱feed以自動(dòng)接收新文件的方法,或用此方法來(lái)制作的電臺(tái)節(jié)目。

    2006-08-29

    JSP中 contentType 和 pageEncoding 的差異

    歸類于: JAVA — maxazure @ 4:21 pm

     

    contentType — 指定的是JSP頁(yè)最終 Browser(客戶端)所見(jiàn)到的網(wǎng)頁(yè)內(nèi)容的編碼.
    就是 Mozilla的 Character encoding, 或者是 IE6的 encoding. 例如 JSPtw Forum 用的contentType就是 Big5.
    pageEncoding — 指定JSP編寫(xiě)時(shí)所用的編碼
    如果你的是 WIN98, 或 ME 的NOTEPAD記事本編寫(xiě)JSP, 就一定是常用的是Big5 或 gb2312, 如果是用 WIN2k winXP的
    NOTEPAD時(shí), SAVE時(shí)就可以選擇不同的編,碼, 包括 ANSI(BIG5/GB2312)或 UTF-8 或 UNIONCODE(估是 UCS 16).
    因?yàn)?JSP要經(jīng)過(guò) 兩次的”編碼”,
    第一階段會(huì)用 pageEncoding, 第二階段會(huì)用 utf-8 至utf-8, 第三階段就是由TOMCAT出來(lái)的網(wǎng)頁(yè), 用的是contentType.
    階段一是 JSPC的 JSP至JAVA(.java)原碼的”翻譯”, 它會(huì)跟據(jù) pageEncoding 的設(shè)定讀取JSP. 結(jié)果是 由指定的
    pageEncoding(utf-8,Big5,gb2312)的JSP 翻譯成統(tǒng)一的utf-8 JAVA原碼(.java). 如果pageEncoding設(shè)定錯(cuò)了, 或沒(méi)設(shè)定
    (預(yù)設(shè) ISO8859-1), 出來(lái)的 在這個(gè)階段 就已是中文亂碼.
    階段二是由 JAVAC的JAVA原碼至JAVA BYTECODE的編譯. 不論JSP的編寫(xiě)時(shí)是用(utf-8,Big5,gb2312),經(jīng)過(guò)階段一的結(jié)果全
    都是utf-8的ENCODING的JAVA原碼.
    JAVAC用 utf-8的ENCODING讀取AVA原碼, 編譯成字符串是 utf-8 ENCODING的二進(jìn)制碼(.class). 這是 JAVA VIRTUAL MACNHINE
    對(duì)常數(shù)字符串在 二進(jìn)制碼(JAVA BYTECODE)內(nèi)表逹的規(guī)范.
    階段三是TOMCAT(或其的application container)加載和執(zhí)行階段二得來(lái)的JAVA二進(jìn)制碼, 輸出的結(jié)果( 也就是BROWSER(客戶端))
    見(jiàn)到的. 這時(shí)一早隱藏在階段一和二的參數(shù)contentType, 就發(fā)揮了功效. (見(jiàn) 階段一的 ).
    response.setContentType(”text/html; charset=utf-8″);
    出來(lái)的可以是 utf-8, Big5, gb2312, 看的就是JSP ? contentType的設(shè)定.
    <%@ page session=”false” pageEncoding=”big5″ contentType=”text/html; charset=utf-8″ %>
    還有, pageEncoding 和contentType的預(yù)設(shè)都是 ISO8859-1. 而隨便設(shè)定了其中一個(gè), 另一個(gè)就跟著一樣了(TOMCAT4.1.27是如此).
    但這不是絕對(duì), 看的各自JSPC的處理方式. 而pageEncoding不等于contentType, 更有利亞洲區(qū)的文字 CJKV系JSP網(wǎng)頁(yè)的開(kāi)發(fā)和展示,
    (例pageEncoding=Big5 不等于 contentType=utf-8).
    一個(gè)簡(jiǎn)單的解決方法是在包含和被包含文件的開(kāi)始部分都加上:
    <%@ page contentType=”text/html;charset=GB2312″ language=”java” %>

     

    JSP中文解決之道

    歸類于: JAVA — maxazure @ 4:16 pm

     

    自從接觸Java和JSP以來(lái),就不斷與Java的中文亂碼問(wèn)題打交道,現(xiàn)在終于得到了徹底的解決,現(xiàn)將我們的解決心得與大家共享。
    一、Java中文問(wèn)題的由來(lái)
    Java的內(nèi)核和class文件是基于unicode的,這使Java程序具有良好的跨平臺(tái)性,但也帶來(lái)了一些中文亂碼問(wèn)題的麻煩。原因主要有兩方面,Java和JSP文件本身編譯時(shí)產(chǎn)生的亂碼問(wèn)題和Java程序于其他媒介交互產(chǎn)生的亂碼問(wèn)題。
    首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字節(jié)流的,如果Java和JSP編譯成class文件過(guò)程中,使用的編碼方式與源文件的編碼不一致,就會(huì)出現(xiàn)亂碼。基于這種亂碼,建議在Java文件中盡量不要寫(xiě)中文(注釋部分不參與編譯,寫(xiě)中文沒(méi)關(guān)系),如果必須寫(xiě)的話,盡量手動(dòng)帶參數(shù)-ecoding GBK或-ecoding gb2312編譯;對(duì)于JSP,在文件頭加上<%@ page contentType=”text/html;charset=GBK”%>或<%@ page contentType=”text/html;charset=gb2312″%>基本上就能解決這類亂碼問(wèn)題。
    本文要重點(diǎn)討論的是第二類亂碼,即Java程序與其他存儲(chǔ)媒介交互時(shí)產(chǎn)生的亂碼。很多存儲(chǔ)媒介,如數(shù)據(jù)庫(kù),文件,流等的存儲(chǔ)方式都是基于字節(jié)流的,Java程序與這些媒介交互時(shí)就會(huì)發(fā)生字符(char)與字節(jié)(byte)之間的轉(zhuǎn)換,具體情況如下:
    從頁(yè)面form提交數(shù)據(jù)到j(luò)ava程序 byte->char
    從java程序到頁(yè)面顯示 char—>byte
    從數(shù)據(jù)庫(kù)到j(luò)ava程序 byte—>char
    從java程序到數(shù)據(jù)庫(kù) char—>byte
    從文件到j(luò)ava程序 byte->char
    從java程序到文件 char->byte
    從流到j(luò)ava程序 byte->char
    從java程序到流 char->byte
    如果在以上轉(zhuǎn)換過(guò)程中使用的編碼方式與字節(jié)原有的編碼不一致,很可能就會(huì)出現(xiàn)亂碼。
    二、解決方法

    前面已經(jīng)提到了Java程序與其他媒介交互時(shí)字符和字節(jié)的轉(zhuǎn)換過(guò)程,如果這些轉(zhuǎn)換過(guò)程中容易產(chǎn)生亂碼。解決這些亂碼問(wèn)題的關(guān)鍵在于確保轉(zhuǎn)換時(shí)使用的編碼方式與字節(jié)原有的編碼方式保持一致,下面分別論述(Java或JSP自身產(chǎn)生的亂碼請(qǐng)參看第一部分)。
    1、JSP與頁(yè)面參數(shù)之間的亂碼
    JSP獲取頁(yè)面參數(shù)時(shí)一般采用系統(tǒng)默認(rèn)的編碼方式,如果頁(yè)面參數(shù)的編碼類型和系統(tǒng)默認(rèn)的編碼類型不一致,很可能就會(huì)出現(xiàn)亂碼。解決這類亂碼問(wèn)題的基本方法是在頁(yè)面獲取參數(shù)之前,強(qiáng)制指定request獲取參數(shù)的編碼方式:request.setCharacterEncoding(”GBK”)或request.setCharacterEncoding(”gb2312″)。
    如果在JSP將變量輸出到頁(yè)面時(shí)出現(xiàn)了亂碼,可以通過(guò)設(shè)置response.setContentType(”text/html;charset=GBK”)或response.setContentType(”text/html;charset=gb2312″)解決。
    如果不想在每個(gè)文件里都寫(xiě)這樣兩句話,更簡(jiǎn)潔的辦法是使用Servlet規(guī)范中的過(guò)慮器指定編碼,過(guò)濾器的在web.xml中的典型配置和主要代碼如下:
    web.xml:
    <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>net.vschool.web.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>GBK</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    CharacterEncodingFilter.java:
    public class CharacterEncodingFilter implements Filter
    {
    protected String encoding = null;
    public void init(FilterConfig filterConfig) throws ServletException
    {
    this.encoding = filterConfig.getInitParameter(”encoding”);
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
    {
    request.setCharacterEncoding(encoding);
    response.setContentType(”text/html;charset=”+encoding);
    chain.doFilter(request, response);
    }
    }

    2、Java與數(shù)據(jù)庫(kù)之間的亂碼
    大部分?jǐn)?shù)據(jù)庫(kù)都支持以u(píng)nicode編碼方式,所以解決Java與數(shù)據(jù)庫(kù)之間的亂碼問(wèn)題比較明智的方式是直接使用unicode編碼與數(shù)據(jù)庫(kù)交互。很多數(shù)據(jù)庫(kù)驅(qū)動(dòng)自動(dòng)支持unicode,如Microsoft的SQLServer驅(qū)動(dòng)。其他大部分?jǐn)?shù)據(jù)庫(kù)驅(qū)動(dòng),可以在驅(qū)動(dòng)的url參數(shù)中指定,如如mm的mysql驅(qū)動(dòng):jdbc:mysql://localhost/WEBCLDB?useUnicode=true&characterEncoding=GBK。
    3、Java與文件/流之間的亂碼
    Java讀寫(xiě)文件最常用的類是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字節(jié)流的,常用于讀寫(xiě)二進(jìn)制文件。讀寫(xiě)字符文件建議使用基于字符的FileReader和FileWriter,省去了字節(jié)與字符之間的轉(zhuǎn)換。但這兩個(gè)類的構(gòu)造函數(shù)默認(rèn)使用系統(tǒng)的編碼方式,如果文件內(nèi)容與系統(tǒng)編碼方式不一致,可能會(huì)出現(xiàn)亂碼。在這種情況下,建議使用FileReader和FileWriter的父類:InputStreamReader/OutputStreamWriter,它們也是基于字符的,但在構(gòu)造函數(shù)中可以指定編碼類型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。
    4、其他
    上面提到的方法應(yīng)該能解決大部分亂碼問(wèn)題,如果在其他地方還出現(xiàn)亂碼,可能需要手動(dòng)修改代碼。解決Java亂碼問(wèn)題的關(guān)鍵在于在字節(jié)與字符的轉(zhuǎn)換過(guò)程中,你必須知道原來(lái)字節(jié)或轉(zhuǎn)換后的字節(jié)的編碼方式,轉(zhuǎn)換時(shí)采用的編碼必須與這個(gè)編碼方式保持一致。我們以前使用Resin服務(wù)器,使用smartUpload組件上傳文件,上傳文件同時(shí)傳遞的中文參數(shù)獲取沒(méi)有亂碼問(wèn)題。當(dāng)在Linux中把Resin設(shè)置成服務(wù)后,上傳文件同時(shí)的中文參數(shù)獲取出現(xiàn)了亂碼。這個(gè)問(wèn)題困擾了我們很久,后來(lái)我們分析smartUpload組件的源文件,因?yàn)槲募蟼鞑捎玫氖亲止?jié)流的方式,里面包含的參數(shù)名稱和值也是字節(jié)流的方式傳遞的。smartUpload組件讀取字節(jié)流后再將參數(shù)名稱和值從字節(jié)流中解析出來(lái),問(wèn)題就出現(xiàn)在smartUpload將字節(jié)流轉(zhuǎn)換成字符串時(shí)采用了系統(tǒng)默認(rèn)的編碼,而將Resin設(shè)置成服務(wù)后,系統(tǒng)默認(rèn)的編碼可能發(fā)生了改變,因此出現(xiàn)了亂碼。后來(lái),我們更改了smartUpload的源文件,增加了一個(gè)屬性charset和setCharset(String)方法,將upload()方法中提取參數(shù)語(yǔ)句:
    String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );
    改成了
    String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );
    終于解決了這個(gè)亂碼問(wèn)題。
    三、后記
    接觸Java和JSP已經(jīng)有一年多了,這一年來(lái)最大的收獲是越來(lái)越喜歡上了Java,開(kāi)始把問(wèn)題當(dāng)作樂(lè)事去研究,沒(méi)有了以前的恐懼心理,我相信我會(huì)繼續(xù)堅(jiān)持下去。這一年來(lái),從網(wǎng)上學(xué)習(xí)了很多同行的寶貴經(jīng)驗(yàn),在此表示感謝。這是我第一篇自己總結(jié)的Java學(xué)習(xí)心得,由于水平有限,本文中偏頗和錯(cuò)誤之處,歡迎指正。如果對(duì)你有些價(jià)值,在保留作者信息和文章原始出處的前提下可以隨處轉(zhuǎn)載。
    撰寫(xiě)該文之前已參考了很多關(guān)于Java中文問(wèn)題的文章,其中影響比較大的有owen1944在“Java研究組織”中發(fā)表的《這是我們公司總結(jié)的一些關(guān)于中文亂碼問(wèn)題的一些解決方案和經(jīng)驗(yàn)和大家分享!》等。本文談到的解決方法已應(yīng)用到“基于網(wǎng)絡(luò)的協(xié)作學(xué)習(xí)系統(tǒng)-WebCL”等項(xiàng)目中,并通過(guò)資源綁定的方式實(shí)現(xiàn)了該平臺(tái)中文文兩個(gè)版本的即時(shí)切換。Google根據(jù)瀏覽器自動(dòng)選擇語(yǔ)言,一個(gè)頁(yè)面同時(shí)顯示多種語(yǔ)言的國(guó)際化應(yīng)用和車東的《Java中文處理學(xué)習(xí)筆記——Hello Unicode》一文引起了我極大的興趣,日后想將繼續(xù)探討Java的國(guó)際化問(wèn)題,歡迎大家一起討論。

     

    為什么我還要寫(xiě)自己的類庫(kù)

    歸類于: JAVA — maxazure @ 4:12 pm

     

    有很多人在問(wèn)我,既然SUN或第三方已經(jīng)為我們提供足夠多的API,我們?yōu)槭裁催€要自己寫(xiě)底層類庫(kù)?
    其實(shí)這個(gè)問(wèn)題對(duì)于初學(xué)者和普通的程序員是不會(huì)理解的,但當(dāng)你對(duì)一門(mén)語(yǔ)言,不然不僅是說(shuō)JAVA,精通到一定的程序時(shí),你就自然地理解了—–你不再想用別人為你設(shè)計(jì)的類庫(kù),因?yàn)槟阆嘈拍阕约簩?xiě)的類庫(kù)的實(shí)現(xiàn)過(guò)程比別人提供給你的更strong.
    這個(gè)strong的標(biāo)準(zhǔn)應(yīng)該上效率更高,功能更好(不是更多).
    我們先把SUN和第三方軟件商提供的API叫標(biāo)準(zhǔn)API,我們自己的就叫快捷API,
    標(biāo)準(zhǔn)API的特點(diǎn)是通用,為了這個(gè)通用,就要付出一定的資源,就象JAVA本身為了通用就要先實(shí)現(xiàn)JVM,一個(gè)普通的BEAN,它的業(yè)務(wù)邏輯可能只有一行代碼,但為了照顧那些菜鳥(niǎo)級(jí)的客戶程序員,BEAN的設(shè)計(jì)者們(服務(wù)程序員)不得不花更多的時(shí)候來(lái)寫(xiě)B(tài)EAN的接口.就是所謂的規(guī)范:以80%的資源來(lái)完成業(yè)務(wù)邏輯以外的功能.
    就比如JAVAMAIL,在一個(gè)MAIL系統(tǒng)中,真正實(shí)現(xiàn)非常完整的MAIL功能的API大約有30個(gè)左右,但JAVAMAIL為了基于”消息機(jī)制”這一規(guī)范,無(wú)論從效率還是從易用性方面都成了郵件系統(tǒng)中的垃圾,我自己雖然學(xué)過(guò)好多種語(yǔ)言,但我對(duì)JAVA語(yǔ)言有一種狂熱.我這樣評(píng)價(jià)JAVAMAIL并不影響我對(duì)JAVA語(yǔ)言和JAVA技術(shù)的熱愛(ài).
    可以說(shuō),JAVA開(kāi)發(fā)小組的人員已經(jīng)不是原來(lái)的那些精英了,他們最初的思想并沒(méi)有被一直發(fā)揚(yáng),就JAVAMAIL本身來(lái)說(shuō),他們已經(jīng)從思想退化到程式的水平——為了通用而故意通用,結(jié)果陷入了難用的泥坑.
    對(duì)于我們來(lái)說(shuō),如果你對(duì)JAVA技術(shù)的實(shí)現(xiàn)非常了解,自己寫(xiě)類庫(kù)解決問(wèn)題是一個(gè)最有效的手段.比如我們明知道String的+操作在底層是StringBuffer的append()操作,為什么不在程式中直接這樣做呢?如果你這樣你會(huì)獲得驚人的效率:
    String s = “”;
    for(int =0;i<1024*1024*4;i++)
    s += 1;
    這樣得到4M的字符串在我的P2上要30分鐘以上,

    StringBuffer sb = new StringBuffer();
    for(int =0;i<1024*1024*4;i++)
    sb.append(”1″);
    String s = new String(sb);
    不到一秒.為什么不這么做呢?當(dāng)然String和StringBuffer是普通程序員都知道的,但是對(duì)于更多的數(shù)據(jù)結(jié)構(gòu)的效率,有幾個(gè)程序員都明明白白清清楚楚?
    我多次說(shuō)過(guò),所有的語(yǔ)言,哪怕是匯編,所有日期類庫(kù)都是從UNIX時(shí)間戳轉(zhuǎn)換來(lái)的,
    那么從這個(gè)值轉(zhuǎn)換過(guò)去是最快的方法,你別看SUN為你提供了DateFormat,Calendar等類以及一些什么after(),before()方法,它們也都是從UNIX時(shí)間戳來(lái)比較再轉(zhuǎn)換的,為了實(shí)現(xiàn)通用,它們還要考慮不同國(guó)家的格式規(guī)范,
    (local),所以根本不如你自己寫(xiě)來(lái)得更有效.
    另外一方面,你要相信,標(biāo)準(zhǔn)API的開(kāi)發(fā)人員并不是每個(gè)人都比你更聰明,同樣的功能他們也許實(shí)現(xiàn)得比你更差勁,或者說(shuō)你能做得比他們更好.當(dāng)然絕大多數(shù)的功能他們實(shí)現(xiàn)得很好,這就是我,我們都還在用JAVA語(yǔ)言而沒(méi)有去自己重寫(xiě)JAVA語(yǔ)言的原因,但在實(shí)際應(yīng)用中,很多很多的時(shí)候,應(yīng)該自己動(dòng)手動(dòng)手去寫(xiě)出更有效率,更加實(shí)用的快捷API來(lái).
    最后說(shuō)說(shuō),如何能寫(xiě)出更好的API.
    首先你要對(duì)現(xiàn)有的API非常熟悉,那些連什么隨機(jī)數(shù)API都不知道還要問(wèn)人的人不要再看了,你們應(yīng)該好好地下一些真功夫在JAVA語(yǔ)言本身上,而不要急于做一些項(xiàng)目,你們現(xiàn)在要做的不是項(xiàng)目,而是作業(yè).
    對(duì)JAVA語(yǔ)言有了相當(dāng)?shù)牧私夂?提高一個(gè)檔次,深入地理解一個(gè)JAVA技術(shù).
    然后回過(guò)頭來(lái),再深入JAVA語(yǔ)言,就是說(shuō)在功夫到了七層左右,先要對(duì)十層的境界有一個(gè)概覽再回頭練八層.這時(shí)你把JDK的幾個(gè)jar文件都展開(kāi)了,然后把目錄結(jié)構(gòu)打印出來(lái),對(duì)每個(gè)包下的每個(gè)類這樣的整體結(jié)構(gòu)的目錄樹(shù)先熟悉,然后每天對(duì)其中的幾個(gè)jad出來(lái),看看SUN的實(shí)現(xiàn)過(guò)程,吹毛求疵!!!不是為了和他們過(guò)不去,是為了加深記憶和理解.
    如果沒(méi)有足夠的時(shí)候,至少對(duì)常用的類要做到以上的要求.
    接下來(lái),你要學(xué)習(xí)的是JAVA語(yǔ)言的調(diào)試技術(shù),不要用任何工具,就用命令行.
    熟悉以后學(xué)習(xí)JAVA虛擬機(jī)規(guī)范,這是你成為高手的關(guān)鍵.
    經(jīng)過(guò)以上學(xué)習(xí),當(dāng)然在學(xué)習(xí)中為了解決一些問(wèn)題你已經(jīng)無(wú)意地學(xué)了更多地東西.
    你自己試試看,自己寫(xiě)一個(gè)String類,把jdk中的那個(gè)給replace了看看,如果一切沒(méi)問(wèn)題你應(yīng)該可以是真正的高手了.這時(shí)你一定會(huì)感覺(jué)到自己寫(xiě)API的效率和樂(lè)趣了.

     

    Response.ContentType

    歸類于: JAVA — maxazure @ 3:34 pm

    Response.ContentType 是用來(lái)控制輸出的文件類型的。

    服務(wù)器送給客戶端的數(shù)據(jù)包類型可以是text/html文本,也可以是gif/jpeg圖形文件,所以每次傳輸前,我們都必須告知客戶端將要傳輸?shù)奈募愋停话隳J(rèn)情況下為“Text/Html”類型。
    <% Response.ContentType = ”text/HTML” %>
    <% Response.ContentType = ”image/GIF” %>
    <% Response.ContentType = ”image/JPEG” %>

    用于作為文本內(nèi)容返回而不是已解釋的 HTML 語(yǔ)句
    Response.ContentType = ”text/plain”


    程序代碼:

    <% 
    Response.ContentType =
     “text/plain” 
    Response.write(now()&“會(huì)被執(zhí)行么?”)
    %>

    你可以注意到:頁(yè)面提供下載,頁(yè)面中的ASP內(nèi)容被解釋執(zhí)行了的

    程序文件以XLS文件被提供下載
    Response.ContentType = ”application/vnd.ms-excel”


    程序代碼:

    <%
    Response.ContentType =
     “application/vnd.ms-excel”
    Response.write(“本頁(yè)面調(diào)試會(huì)出現(xiàn)下載對(duì)話框提供下載,保存類型為XLS”)
    %>

    實(shí)現(xiàn)歌曲連續(xù)播放
    response.ContentType=”audio/x-pn-realaudio” 


    程序代碼:

    <%
    dim ramstr 
    ramstr=“” 
    set rs=server.createobject(“adodb.recordset”
    sql=“XXXXXXXXXXX” 
    rs.open sql,conn,1,3 ’conn已定義 
    do while not rs.eof 
    ramstr=ramstr&rs(“url”)&vbCrLf 
    rs.movenext 
    loop 
    rs.close 
    response.ContentType=“audio/x-pn-realaudio” 
    ‘response.ContentType=
    “audio/x-mpegurl” 
    response.write ramstr 
    %>

    response.write 輸出的時(shí)候,由于定義了response.ContentType 所以輸出歌曲地址的時(shí)候會(huì)自動(dòng)調(diào)用符合相應(yīng)格式的軟件來(lái)播放歌曲,不過(guò)前提是播放歌曲的軟件必須先安裝的。 

    下一頁(yè) »

    基于WordPress

    posted on 2007-07-16 23:06 張金鵬 閱讀(836) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 黑人大战亚洲人精品一区| 好猛好深好爽好硬免费视频| 亚洲AV无码一区二区二三区入口 | 午夜dj免费在线观看| 国产婷婷成人久久Av免费高清| 婷婷亚洲综合一区二区| 亚洲电影免费观看| 亚洲成亚洲乱码一二三四区软件| 免费又黄又爽的视频| 妞干网在线免费观看| 波多野结衣免费在线观看| 久久午夜夜伦鲁鲁片免费无码 | 亚洲高清无码综合性爱视频| 一个人免费观看www视频在线| 日韩精品久久久久久免费| 中国一级毛片视频免费看| 免费手机在线看片| 亚洲a∨无码精品色午夜| 中文字幕无码精品亚洲资源网久久| 亚洲天堂男人天堂| 亚洲成AV人在线观看天堂无码| 夜夜春亚洲嫩草影院| 亚洲综合AV在线在线播放| 亚洲国产精品毛片av不卡在线| 国产成人免费福利网站| 日本免费v片一二三区| 国产美女a做受大片免费| 日本一区免费电影| 免费a级毛片永久免费| 国产国产成年年人免费看片| 日韩一级在线播放免费观看| 日韩免费a级在线观看| 又粗又大又猛又爽免费视频| 可以免费观看一级毛片黄a| 免费人成激情视频| 国产亚洲老熟女视频| 自拍偷自拍亚洲精品情侣| 亚洲国产成人高清在线观看 | 国产一二三四区乱码免费| 97在线免费观看视频| 国产精品网站在线观看免费传媒|