劉杰劉杰隨時都在家,因為劉杰不酷。但是現在不會了,因為劉杰在游走……
2006-08-31
2006-08-30
關于頁面優化和偽靜態
內容提要:
1)版面優化
2)偽靜態(重點涉及apache,smarty,正則)
詳細內容:
一、版面優化:
版面優化其實主要涉及HTML,JS,CSS,XML之間的關系(XML相關在此不作描述).
1)一般來說,在資源共享的前提下,我們最基本的目的是讓搜索引擎所收錄(很多人被AJAX所迷惑,到處使用AJAX,但我的觀點是,只有在后臺或用戶操作部分才使用).
因此,首先我們應該按搜索引擎的收錄準則來設計(其實下面說的“偽靜態”還不是為了搜索引擎,由于相關文檔有好幾個PAGE,請自行搜索),主要是html的使用問題,如<h1> <meta> <title>以及標簽屬性的使用問題.
2)然后解決加載速度和內容純度問題:
主要是以下幾個原則:
1>不要為了版面美觀,把無謂的HTML加上去,建議把版面美觀的任務交給CSS,并認真考慮CSS的可重用性,HTML只作為對信息內容的描述(好像是XML的重點吧)。我在網上抽查了好一部分的站點,好的網站,html占總內容的50%以下,但有的站點,文字內容占總內容不到20%,
2>把JS,CSS寫成文件.只要是利用了瀏覽器的CAHCHE,減少內容下載
3>HTML標簽應該盡量減少嵌套,我見過夸張的一個站點,TABLE嵌套居然是11層..狂汗….
3)解決數據合理處理時間
這個涉及內容比較多,主要是
二、偽靜態
這里主要描述apache,smarty的應用,當然,其實使用什么模板甚至不使用模板都沒什么關系的,只是筆者長年使用smarty,深濃感受到它的強大
該部分主要針對的是對系統有控制權和對apache、正則較為熟悉的用戶。
在這里,核心是強調正則的應用,如果你不會正則表達式,那么你就只能停留一成不變的抄襲階段,甚至無法使用.而且正則在應用上普遍(基本上什么語言都有)、頻繁和強大,筆者還是建議花點時間,學精一點,受用終生
對于搜索引擎,據我所知,關鍵是處理GET中的”?”、”&”.”php”,還有就是URL長度的問題就OK了,形式就看個人愛好了。
先說APACHE,關鍵是使用mod_rewrite,打開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里,按你個人要求放得合適就行。
第一行,表示該vhost將要使用rewrite(URL重寫)
第二行,RewriteCond是用于如果后面條件符合(第一個參數滿足第二個參數,其中第二個參數為正則表達式),則執行下面的RewriteRule指令,其中%{xxxx}表示是apache的變量,%{HTTP_HOST}表示URL的主機(域名),其它變量請查看apache2手冊
第三行,實現url重寫(重頭戲),第一個參數為在瀏覽器中輸入的url,滿足該正則的uri才執行重寫,第二個參數是重寫規則,即把滿足第一個參數的url按照該規則轉換成你須要的url在這里筆者必須指出,重寫后的url如果包含”http://”,跳轉后的地址會顯示在瀏覽器的地址欄中。第三個參數是一些控制,如以上[L]表示該重寫是最后一條,后面的重寫規則不再被執行。
smarty部分:
主要是處理輸出的頁面內容,你使用apache的rewrite后,你頁面中的鏈接當然使用了它的規則了,如:原來是abc.php?action=doit就要改用類似abc/action-doit.html這樣的方式表示,當然,你可以在做頁面時自己手動去改,但我覺得這是比較笨的方法.為什么不去使用ob_xxxxx()去控制呢?(ob_xxxx()系的函數使用請參考php手冊).在這里的介紹使用smarty去代替,因為這樣會更加靈活
在smarty中,使用register_outputfilter()注冊一個處理方法即可,具體方法類似為:
//先定義好一個處理函數
function change_url($tpl_output, &$smarty)
{
$tpl_output=preg_replace(”/\/index.php?\?action=([^&]+)/i”,”/\\1.html”,$tpl_output);
return $tpl_output;
}
//該函數第一個參數是smarty的頁面內容,第二個是smarty指針
//然后使用
$tpl->register_outputfilter(”change_url”);
register_outputfilter()方法是輸出過濾函數,即交給 change_url($tpl_output, &$smarty)第一個參數是smarty處理后的頁面內容
同類型的還有前過濾方法register_prefilter(),即把smarty模板交給第一個參數,詳細使用方法請參考smarty手冊
如果上述內容有錯漏,請原諒并指正
看了下表,一點了..已經寫了一個小時,累.要想午覺了…
FedoraCore5下PHP服務器配置
系統已經安裝的軟件:
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:
進入目錄/root/software/
# cd /root/software/
解壓httpd-2.0.59.tar.gz
# tar -zvxf httpd-2.0.59.tar.gz
進入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
安裝完畢
啟動apahce
# /usr/local/apache2/bin/apachectl -k start
用瀏覽器查看http://localhost,如果可以正常顯示,說明apache已經配置成功了
停止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 -
復制
# cp -r mysql-max-5.0.24-linux-i686-glibc23 /usr/local/mysql
生成mysql系統數據庫
# cd /usr/local/mysql
# scripts/mysql_install_db –user=mysql
更改權限
chown -R root .
chown -R mysql data
chgrp -R mysql .
啟動mysql服務
# /usr/local/mysql/bin/mysqld_safe –user=mysql &
用root帳號訪問mysql數據庫
# /usr/local/mysql/bin/mysql -u root
關閉mysql服務
# /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
復制GD庫文件:
復制文件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
復制配置文件
# 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
是必要的選項
配置php:
# vi /usr/local/php/php.ini
找到register_globals = off,把off修改為on
找到;extension=php_mbstring.dll,把前面的;號刪掉
找到;extension=php_mysql.dll,把前面的;號刪掉
配置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在其下添加以下內容:
PHPIniDir “/usr/local/php”
找到 AddType application/x-gzip .gz .tgz 在其下添加如下內容:
AddType application/x-httpd-php .php
重啟apache
# /usr/local/apache2/bin/apachectl restart
在/usr/local/apache2/htdocs目錄里新建index.php文件,文件內容為:
<?php
phpinfo();
?>
在瀏覽器中輸入URL為http://localhost/index.php進行測試
新概念不可不知
RSS RSS的全稱是Really Simple Syndication,是一種描述和同步網站內容的格式,是目前使用最廣泛的XML應用。RSS搭建了信息迅速傳播的一個技術平臺,使得每個人都成為潛在的信息提供者。發布一個RSS文件后,這個RSS中包含的信息就能直接被其他站點調用,而且由于這些數據都是標準的XML格式,所以也能在其他的終端和服務中使用。
Feed Feed比起RSS更為廣義。是RSS,Atom的綜合稱謂,并且包容各個版本。比如RSS2.0,RSS0.91,Atom0.3。 Atom 簡單的講ATOM是一種訂閱Blog的格式。它與RSS相比來講,有更大的彈性。深入的講是與XML的格式定義的問題。但與RSS一樣,可以用于訂閱閱讀。
網摘 網摘是一個在線的網頁收藏夾,它可以讓您收藏每一個您感興趣的網頁、網址,將它們保存下來,以便日后查閱。通過網摘收藏夾,還可以把您收藏的網頁共享給大家。網摘不同于blog,網摘所關注的不是書寫,而是閱讀,是如何消化數字媒體(包括blog)。
Podcast Podcast這個單詞源于Broadcast和iPod組合。是一種在互聯網上發布文件并允許用戶訂閱feed以自動接收新文件的方法,或用此方法來制作的電臺節目。
2006-08-29
JSP中 contentType 和 pageEncoding 的差異
contentType — 指定的是JSP頁最終 Browser(客戶端)所見到的網頁內容的編碼.
就是 Mozilla的 Character encoding, 或者是 IE6的 encoding. 例如 JSPtw Forum 用的contentType就是 Big5.
pageEncoding — 指定JSP編寫時所用的編碼
如果你的是 WIN98, 或 ME 的NOTEPAD記事本編寫JSP, 就一定是常用的是Big5 或 gb2312, 如果是用 WIN2k winXP的
NOTEPAD時, SAVE時就可以選擇不同的編,碼, 包括 ANSI(BIG5/GB2312)或 UTF-8 或 UNIONCODE(估是 UCS 16).
因為 JSP要經過 兩次的”編碼”,
第一階段會用 pageEncoding, 第二階段會用 utf-8 至utf-8, 第三階段就是由TOMCAT出來的網頁, 用的是contentType.
階段一是 JSPC的 JSP至JAVA(.java)原碼的”翻譯”, 它會跟據 pageEncoding 的設定讀取JSP. 結果是 由指定的
pageEncoding(utf-8,Big5,gb2312)的JSP 翻譯成統一的utf-8 JAVA原碼(.java). 如果pageEncoding設定錯了, 或沒設定
(預設 ISO8859-1), 出來的 在這個階段 就已是中文亂碼.
階段二是由 JAVAC的JAVA原碼至JAVA BYTECODE的編譯. 不論JSP的編寫時是用(utf-8,Big5,gb2312),經過階段一的結果全
都是utf-8的ENCODING的JAVA原碼.
JAVAC用 utf-8的ENCODING讀取AVA原碼, 編譯成字符串是 utf-8 ENCODING的二進制碼(.class). 這是 JAVA VIRTUAL MACNHINE
對常數字符串在 二進制碼(JAVA BYTECODE)內表逹的規范.
階段三是TOMCAT(或其的application container)加載和執行階段二得來的JAVA二進制碼, 輸出的結果( 也就是BROWSER(客戶端))
見到的. 這時一早隱藏在階段一和二的參數contentType, 就發揮了功效. (見 階段一的 ).
response.setContentType(”text/html; charset=utf-8″);
出來的可以是 utf-8, Big5, gb2312, 看的就是JSP ? contentType的設定.
<%@ page session=”false” pageEncoding=”big5″ contentType=”text/html; charset=utf-8″ %>
還有, pageEncoding 和contentType的預設都是 ISO8859-1. 而隨便設定了其中一個, 另一個就跟著一樣了(TOMCAT4.1.27是如此).
但這不是絕對, 看的各自JSPC的處理方式. 而pageEncoding不等于contentType, 更有利亞洲區的文字 CJKV系JSP網頁的開發和展示,
(例pageEncoding=Big5 不等于 contentType=utf-8).
一個簡單的解決方法是在包含和被包含文件的開始部分都加上:
<%@ page contentType=”text/html;charset=GB2312″ language=”java” %>
JSP中文解決之道
自從接觸Java和JSP以來,就不斷與Java的中文亂碼問題打交道,現在終于得到了徹底的解決,現將我們的解決心得與大家共享。
一、Java中文問題的由來
Java的內核和class文件是基于unicode的,這使Java程序具有良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。原因主要有兩方面,Java和JSP文件本身編譯時產生的亂碼問題和Java程序于其他媒介交互產生的亂碼問題。
首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字節流的,如果Java和JSP編譯成class文件過程中,使用的編碼方式與源文件的編碼不一致,就會出現亂碼。基于這種亂碼,建議在Java文件中盡量不要寫中文(注釋部分不參與編譯,寫中文沒關系),如果必須寫的話,盡量手動帶參數-ecoding GBK或-ecoding gb2312編譯;對于JSP,在文件頭加上<%@ page contentType=”text/html;charset=GBK”%>或<%@ page contentType=”text/html;charset=gb2312″%>基本上就能解決這類亂碼問題。
本文要重點討論的是第二類亂碼,即Java程序與其他存儲媒介交互時產生的亂碼。很多存儲媒介,如數據庫,文件,流等的存儲方式都是基于字節流的,Java程序與這些媒介交互時就會發生字符(char)與字節(byte)之間的轉換,具體情況如下:
從頁面form提交數據到java程序 byte->char
從java程序到頁面顯示 char—>byte
從數據庫到java程序 byte—>char
從java程序到數據庫 char—>byte
從文件到java程序 byte->char
從java程序到文件 char->byte
從流到java程序 byte->char
從java程序到流 char->byte
如果在以上轉換過程中使用的編碼方式與字節原有的編碼不一致,很可能就會出現亂碼。
二、解決方法
前面已經提到了Java程序與其他媒介交互時字符和字節的轉換過程,如果這些轉換過程中容易產生亂碼。解決這些亂碼問題的關鍵在于確保轉換時使用的編碼方式與字節原有的編碼方式保持一致,下面分別論述(Java或JSP自身產生的亂碼請參看第一部分)。
1、JSP與頁面參數之間的亂碼
JSP獲取頁面參數時一般采用系統默認的編碼方式,如果頁面參數的編碼類型和系統默認的編碼類型不一致,很可能就會出現亂碼。解決這類亂碼問題的基本方法是在頁面獲取參數之前,強制指定request獲取參數的編碼方式:request.setCharacterEncoding(”GBK”)或request.setCharacterEncoding(”gb2312″)。
如果在JSP將變量輸出到頁面時出現了亂碼,可以通過設置response.setContentType(”text/html;charset=GBK”)或response.setContentType(”text/html;charset=gb2312″)解決。
如果不想在每個文件里都寫這樣兩句話,更簡潔的辦法是使用Servlet規范中的過慮器指定編碼,過濾器的在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與數據庫之間的亂碼
大部分數據庫都支持以unicode編碼方式,所以解決Java與數據庫之間的亂碼問題比較明智的方式是直接使用unicode編碼與數據庫交互。很多數據庫驅動自動支持unicode,如Microsoft的SQLServer驅動。其他大部分數據庫驅動,可以在驅動的url參數中指定,如如mm的mysql驅動:jdbc:mysql://localhost/WEBCLDB?useUnicode=true&characterEncoding=GBK。
3、Java與文件/流之間的亂碼
Java讀寫文件最常用的類是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字節流的,常用于讀寫二進制文件。讀寫字符文件建議使用基于字符的FileReader和FileWriter,省去了字節與字符之間的轉換。但這兩個類的構造函數默認使用系統的編碼方式,如果文件內容與系統編碼方式不一致,可能會出現亂碼。在這種情況下,建議使用FileReader和FileWriter的父類:InputStreamReader/OutputStreamWriter,它們也是基于字符的,但在構造函數中可以指定編碼類型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。
4、其他
上面提到的方法應該能解決大部分亂碼問題,如果在其他地方還出現亂碼,可能需要手動修改代碼。解決Java亂碼問題的關鍵在于在字節與字符的轉換過程中,你必須知道原來字節或轉換后的字節的編碼方式,轉換時采用的編碼必須與這個編碼方式保持一致。我們以前使用Resin服務器,使用smartUpload組件上傳文件,上傳文件同時傳遞的中文參數獲取沒有亂碼問題。當在Linux中把Resin設置成服務后,上傳文件同時的中文參數獲取出現了亂碼。這個問題困擾了我們很久,后來我們分析smartUpload組件的源文件,因為文件上傳采用的是字節流的方式,里面包含的參數名稱和值也是字節流的方式傳遞的。smartUpload組件讀取字節流后再將參數名稱和值從字節流中解析出來,問題就出現在smartUpload將字節流轉換成字符串時采用了系統默認的編碼,而將Resin設置成服務后,系統默認的編碼可能發生了改變,因此出現了亂碼。后來,我們更改了smartUpload的源文件,增加了一個屬性charset和setCharset(String)方法,將upload()方法中提取參數語句:
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 );
終于解決了這個亂碼問題。
三、后記
接觸Java和JSP已經有一年多了,這一年來最大的收獲是越來越喜歡上了Java,開始把問題當作樂事去研究,沒有了以前的恐懼心理,我相信我會繼續堅持下去。這一年來,從網上學習了很多同行的寶貴經驗,在此表示感謝。這是我第一篇自己總結的Java學習心得,由于水平有限,本文中偏頗和錯誤之處,歡迎指正。如果對你有些價值,在保留作者信息和文章原始出處的前提下可以隨處轉載。
撰寫該文之前已參考了很多關于Java中文問題的文章,其中影響比較大的有owen1944在“Java研究組織”中發表的《這是我們公司總結的一些關于中文亂碼問題的一些解決方案和經驗和大家分享!》等。本文談到的解決方法已應用到“基于網絡的協作學習系統-WebCL”等項目中,并通過資源綁定的方式實現了該平臺中文文兩個版本的即時切換。Google根據瀏覽器自動選擇語言,一個頁面同時顯示多種語言的國際化應用和車東的《Java中文處理學習筆記——Hello Unicode》一文引起了我極大的興趣,日后想將繼續探討Java的國際化問題,歡迎大家一起討論。
為什么我還要寫自己的類庫
有很多人在問我,既然SUN或第三方已經為我們提供足夠多的API,我們為什么還要自己寫底層類庫?
其實這個問題對于初學者和普通的程序員是不會理解的,但當你對一門語言,不然不僅是說JAVA,精通到一定的程序時,你就自然地理解了—–你不再想用別人為你設計的類庫,因為你相信你自己寫的類庫的實現過程比別人提供給你的更strong.
這個strong的標準應該上效率更高,功能更好(不是更多).
我們先把SUN和第三方軟件商提供的API叫標準API,我們自己的就叫快捷API,
標準API的特點是通用,為了這個通用,就要付出一定的資源,就象JAVA本身為了通用就要先實現JVM,一個普通的BEAN,它的業務邏輯可能只有一行代碼,但為了照顧那些菜鳥級的客戶程序員,BEAN的設計者們(服務程序員)不得不花更多的時候來寫BEAN的接口.就是所謂的規范:以80%的資源來完成業務邏輯以外的功能.
就比如JAVAMAIL,在一個MAIL系統中,真正實現非常完整的MAIL功能的API大約有30個左右,但JAVAMAIL為了基于”消息機制”這一規范,無論從效率還是從易用性方面都成了郵件系統中的垃圾,我自己雖然學過好多種語言,但我對JAVA語言有一種狂熱.我這樣評價JAVAMAIL并不影響我對JAVA語言和JAVA技術的熱愛.
可以說,JAVA開發小組的人員已經不是原來的那些精英了,他們最初的思想并沒有被一直發揚,就JAVAMAIL本身來說,他們已經從思想退化到程式的水平——為了通用而故意通用,結果陷入了難用的泥坑.
對于我們來說,如果你對JAVA技術的實現非常了解,自己寫類庫解決問題是一個最有效的手段.比如我們明知道String的+操作在底層是StringBuffer的append()操作,為什么不在程式中直接這樣做呢?如果你這樣你會獲得驚人的效率:
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);
不到一秒.為什么不這么做呢?當然String和StringBuffer是普通程序員都知道的,但是對于更多的數據結構的效率,有幾個程序員都明明白白清清楚楚?
我多次說過,所有的語言,哪怕是匯編,所有日期類庫都是從UNIX時間戳轉換來的,
那么從這個值轉換過去是最快的方法,你別看SUN為你提供了DateFormat,Calendar等類以及一些什么after(),before()方法,它們也都是從UNIX時間戳來比較再轉換的,為了實現通用,它們還要考慮不同國家的格式規范,
(local),所以根本不如你自己寫來得更有效.
另外一方面,你要相信,標準API的開發人員并不是每個人都比你更聰明,同樣的功能他們也許實現得比你更差勁,或者說你能做得比他們更好.當然絕大多數的功能他們實現得很好,這就是我,我們都還在用JAVA語言而沒有去自己重寫JAVA語言的原因,但在實際應用中,很多很多的時候,應該自己動手動手去寫出更有效率,更加實用的快捷API來.
最后說說,如何能寫出更好的API.
首先你要對現有的API非常熟悉,那些連什么隨機數API都不知道還要問人的人不要再看了,你們應該好好地下一些真功夫在JAVA語言本身上,而不要急于做一些項目,你們現在要做的不是項目,而是作業.
對JAVA語言有了相當的了解后,提高一個檔次,深入地理解一個JAVA技術.
然后回過頭來,再深入JAVA語言,就是說在功夫到了七層左右,先要對十層的境界有一個概覽再回頭練八層.這時你把JDK的幾個jar文件都展開了,然后把目錄結構打印出來,對每個包下的每個類這樣的整體結構的目錄樹先熟悉,然后每天對其中的幾個jad出來,看看SUN的實現過程,吹毛求疵!!!不是為了和他們過不去,是為了加深記憶和理解.
如果沒有足夠的時候,至少對常用的類要做到以上的要求.
接下來,你要學習的是JAVA語言的調試技術,不要用任何工具,就用命令行.
熟悉以后學習JAVA虛擬機規范,這是你成為高手的關鍵.
經過以上學習,當然在學習中為了解決一些問題你已經無意地學了更多地東西.
你自己試試看,自己寫一個String類,把jdk中的那個給replace了看看,如果一切沒問題你應該可以是真正的高手了.這時你一定會感覺到自己寫API的效率和樂趣了.
Response.ContentType
Response.ContentType 是用來控制輸出的文件類型的。
服務器送給客戶端的數據包類型可以是text/html文本,也可以是gif/jpeg圖形文件,所以每次傳輸前,我們都必須告知客戶端將要傳輸的文件類型,一般默認情況下為“Text/Html”類型。
<% Response.ContentType = ”text/HTML” %>
<% Response.ContentType = ”image/GIF” %>
<% Response.ContentType = ”image/JPEG” %>
用于作為文本內容返回而不是已解釋的 HTML 語句
Response.ContentType = ”text/plain”
程序代碼:
Response.ContentType = “text/plain”
Response.write(now()&”會被執行么?”)
%>
Response.ContentType = “text/plain”
Response.write(now()&“會被執行么?”)
%>
你可以注意到:頁面提供下載,頁面中的ASP內容被解釋執行了的
程序文件以XLS文件被提供下載
Response.ContentType = ”application/vnd.ms-excel”
程序代碼:
Response.ContentType = “application/vnd.ms-excel”
Response.write(”本頁面調試會出現下載對話框提供下載,保存類型為XLS”)
%>
Response.ContentType = “application/vnd.ms-excel”
Response.write(“本頁面調試會出現下載對話框提供下載,保存類型為XLS”)
%>
實現歌曲連續播放
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
%>
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 輸出的時候,由于定義了response.ContentType 所以輸出歌曲地址的時候會自動調用符合相應格式的軟件來播放歌曲,不過前提是播放歌曲的軟件必須先安裝的。