2006年8月10日
#
--sunfruit
在Linux Enterprise 5安裝Oracle的時候有時候會報錯例如“makefile '/oracle/product/10.2.0/db_1/rdbms/lib/ins_rdbms.mk' 的目標(biāo) 'all_no_orcl' 時出錯”
經(jīng)過多次測試是缺少相關(guān)的系統(tǒng)包文件,至少我的環(huán)境中確實是這樣,只要是安裝了下面的包文件,這個錯誤可以避免(版本號在不同環(huán)境中略有不同)
compat-libstdc++-33-3.2.3-61
compat-libstdc++-296-2.96-138
gcc-4.1.1-52.el5
gcc-c++-4.1.1-52.el5
glibc-2.5-12
glibc-common-2.5-12
glibc-devel-2.5-12
glibc-headers-2.5-12
libgcc-4.1.1-52.el5
make-3.81-1.1
binutils-2.17.50.0.6-2.el5
openmotif-2.3.0-0.3.el5
以上的安裝包由于在安裝Linux的選擇的包以及具體的環(huán)境不同可能,可能有些不需要,不過如果出現(xiàn)了ins_rdbms.mk的錯誤,可以按照這個方法嘗試一下
注:以上的安裝在Linux Enterprise 5的安裝盤中都包含,不需要額外在網(wǎng)上下載
-sunfruit
如果在安裝Oracle10g的時候沒有選擇字符集,則按照下面的3部進行字符集的修改就可以完全正常的使用Oracle10g(注:關(guān)于下面的1、2、3均是轉(zhuǎn)貼,后面添加了個人在使用的時候一些心得)
1、檢查服務(wù)器上Oracle數(shù)據(jù)庫的字符集
sqlplus /nolog
SQL> connect / as sysdba
連接成功.
SQL> desc props$
列名 可空值否 類型
------------------------------- -------- ----
NAME NOT NULL VARCHAR2(30)
VALUE$ VARCHAR2(2000)
COMMENT$ VARCHAR2(2000)
SQL> col value$ format a40
SQL> select name,value$ from props$;
NAME VALUE$
------------------------------ -------------------------
DICT.BASE 2
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_DATE_FORMAT DD-MON-YY
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_CALENDAR GREGORIAN
NLS_RDBMS_VERSION 7.3.4.0.0
GLOBAL_DB_NAME ORACLE.WORLD
EXPORT_VIEWS_VERSION 3
NLS_CHARACTERSET和NLS_CHAR_CTERSET這個參數(shù)應(yīng)該是ZHS16GBK,如不是,改為它。
SQL*Plus中修改方法:
SQL> update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';
2、確認(rèn)字符集是否修改的不徹底。
SELECT DISTINCT (NLS_CHARSET_NAME(CHARSETID)) CHARACTERSET,
DECODE(TYPE#, 1,
DECODE(CHARSETFORM, 1, 'VARCHAR2', 2, 'NVARCHAR2', 'UNKOWN'),
9,
DECODE(CHARSETFORM, 1, 'VARCHAR', 2, 'NCHAR VARYING', 'UNKOWN'),
96,
DECODE(CHARSETFORM, 1, 'CHAR', 2, 'NCHAR', 'UNKOWN'),
112,
DECODE(CHARSETFORM, 1, 'CLOB', 2, 'NCLOB', 'UNKOWN')) TYPES_USED_IN
FROM SYS.COL$
WHERE CHARSETFORM IN (1, 2)
AND TYPE# IN (1, 9, 96, 112);
3、如果上面的查詢的確顯示有多個字符集的設(shè)定,則進行如下處理:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';
COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';
--INTERNAL_USE是沒有寫在文檔中的參數(shù),用以強制完成字符集一致化
ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;
SHUTDOWN IMMEDIATE;
STARTUP;
-- 再次啟動數(shù)據(jù)庫一遍
SHUTDOWN IMMEDIATE;
STARTUP;
**************注意****************
本人在使用上面的方法設(shè)置以后Oracle10g可以正常使用,在導(dǎo)入dmp,sql文件的時候則需要在Linux中做如下設(shè)置
sql文件,dmp文件在導(dǎo)入oracle的時候需要設(shè)置字符集
export LANG=zh_CN.GBK //這個是linux的字符集設(shè)置
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK //這個是oracle的字符集設(shè)置
--sunfruit
在applet上疊加層有2種方式
第一:使用iframe的方式
第二:使用window.createPopup();方式
<div></div>的方式我是沒有試成功,無論如何設(shè)置,div都在applet的下面,要是哪位實驗成功了,經(jīng)驗也共享一下
由于window.createPopup()主要用于創(chuàng)建右鍵菜單,由于其的一些特性,例如在其他地方點擊,該window.createPopup()對象消失,所以疊加層方式使用window.createPopup()并不合適,使用iframe制作疊加層的效果更好更好
效果圖如下
演示:
http://www.fruitres.cn/applet.jsp,可以從該演示頁直接下載js代碼,或者到代碼下載頁下載
代碼下載:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1084563770&number=0
更多下載:
http://www.fruitres.cn/
--sunfruit
在GIS網(wǎng)站上一般都會看到下面的滾動條,俗稱骨頭棒或是排骨架,當(dāng)然這個是WEB方式
如果是應(yīng)用程序或是Applet該如何制作呢,其實也不復(fù)雜,只是需要靈活運用Swing的特性,下面是一個Application的demo
看似復(fù)雜,其實如果理解了也沒有什么神秘
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1342916853&number=0
JAVA WEB START演示地址:
http://www.fruitres.cn/useruploadfile/3/1342916853_jnlp.jnlp
更多下載:
http://www.fruitres.cn/
--sunfruit
代碼演示了基于ArcIMS開發(fā)包進行地圖開發(fā)的基礎(chǔ)方法
代碼不是單獨的可執(zhí)行類,所以只看private void initMap()方法和public BufferedImage render()方法即可。MapBoundModel不用深究可以理解為等同Envelope類即可
在確定以下三個值
private String host = "172.17.8.99";
private int port = 5300;
private String servicename = "sde";
設(shè)置正確并且調(diào)用refresh();方法也沒有異常拋出,但是getStream();返回null值得時候,則需要調(diào)整AXL文件添加<OUTPUT method="stream"/>
重新發(fā)布,具體AXL內(nèi)容請注冊后下載加密附件查看
查看代碼直接下載demo文件即可
地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1257242391&number=0
更多下載:
http://www.fruitres.cn
--sunfruit
Geotools是一個開源的Java GIS工具包,可利用它來開發(fā)符合標(biāo)準(zhǔn)的地理信息系統(tǒng)。Geotools提供了OGC(Open Geospatial Consortium)規(guī)范的一個實現(xiàn)來作為他們的開發(fā)
代碼演示了基于GeoTools開源包進行地圖開發(fā)的基礎(chǔ)方法
代碼不是單獨的可執(zhí)行類,所以只看private void init()方法和public BufferedImage render()方法即可。MapBoundModel不用深究可以理解為等同Envelope類即可
直接下載demo文件即可
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=627152979&number=0
更多下載:
http://www.fruitres.cn
--sunfruit
3sNews最新消息,微軟現(xiàn)在也已經(jīng)成為OGC主要成員之一,OGC組織也對微軟的加入感到高興,他們最需要做的事情當(dāng)然是把Virtual Earth 和 SQL Server 2008納入OpenGIS兼容標(biāo)準(zhǔn).微軟是隨Google之后加入OGC協(xié)會的。而2大巨頭的加入也標(biāo)志著空間信息產(chǎn)業(yè)已進入發(fā)展的快車道,逐漸成為IT主流。
Google Earth的KML文件格式是開放地理協(xié)會的最佳應(yīng)用之一,這一協(xié)會包含345個成員,涵蓋公司、政府機構(gòu)和大學(xué)等角色,他們的目標(biāo)是建立一個OpenGIS標(biāo)準(zhǔn).2007年春季,Google遞交了Keyhole Markup Language (KML 2.1)--Google Earth的最新格式,通過了OGC的驗證,很快,它在世界范圍內(nèi)引起了廣泛的興趣,OGC也將他們加入了 -- 地理標(biāo)示語言(GML)中.
原貼:http://www.3snews.net/index.php/action_viewnews_itemid_16707.html
--sunfruit
這是一個自定義圖層的演示程序,演示向自定義圖層添加POI、修改自定義圖層中的POI、隱藏/顯示自定義圖層,關(guān)于圖層和POI的定義參考原來發(fā)布的例子
通過這個demo可以了解數(shù)據(jù)部署方式,需要的lib文件,至于其它的就是Swing+Graphics的基本應(yīng)用,所以不提供源代碼
Swing+Graphics的用法請參考原來發(fā)布的作品
《基本繪圖演示源代碼,繪制矩形》
《JAVA開發(fā)的俄羅斯方塊源代碼》
JDK 1.5.0
功能:放大、縮小、平移
地圖底圖圖層控制
自定義圖層控制
參考MapXtremeJava48_DG_CHS.pdf,在MapInfo網(wǎng)站下載,或是安裝開發(fā)包以后在文檔目錄中提供
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=2087703113&number=0
更多下載:
http://www.fruitres.cn/
--sunfruit
使用MapInfo地圖引擎的自定義圖層的代碼
主要思路是自己建立系統(tǒng)圖層,該圖層和MapInfo引擎圖層無關(guān)(關(guān)于MapInfo引擎圖層控制請參考原來發(fā)布的例子),例如建立自己的ATM機圖層,要求可以控制顯示、隱藏ATM機圖層。那么需要建立一個圖層類和一個ATM機類,當(dāng)然最好是接口的設(shè)計,這樣在2D繪制的時候可以很容易的進行擴展添加其他的圖層
注:不包含地圖數(shù)據(jù)和Lib包
參考MapXtremeJava48_DG_CHS.pdf,在MapInfo網(wǎng)站下載,或是安裝開發(fā)包以后在文檔目錄中提供
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1367471068&number=0
更多下載:
http://www.fruitres.cn/
--sunfruit
上次發(fā)布了一個使用MapInfo地圖引擎進行圖層控制源代碼,這次照例寫了一個java程序來演示圖層控制
通過這個demo可以了解數(shù)據(jù)部署方式,需要的lib文件,至于其它的就是Swing+Graphics的基本應(yīng)用,所以不提供源代碼
Swing+Graphics的用法請參考原來發(fā)布的作品
《基本繪圖演示源代碼,繪制矩形》
《JAVA開發(fā)的俄羅斯方塊源代碼》
JDK 1.5.0
功能:放大、縮小、平移
地圖底圖圖層控制
參考MapXtremeJava48_DG_CHS.pdf,在MapInfo網(wǎng)站下載,或是安裝開發(fā)包以后在文檔目錄中提供
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=842314737&number=0
更多下載:
http://www.fruitres.cn
--sunfruit
使用MapInfo地圖引擎控制地圖圖層的代碼
該代碼只是對地圖引擎底圖數(shù)據(jù)圖層的控制,對于自定義圖層和添加新的圖層,以后會出相關(guān)的代碼
注:不包含地圖數(shù)據(jù)和Lib包
參考MapXtremeJava48_DG_CHS.pdf,在MapInfo網(wǎng)站下載,或是安裝開發(fā)包以后在文檔目錄中提供
直接下載demo文件即可
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=196483354&number=0
更多下載:
http://www.fruitres.cn/
--sunfruit
Oracle® Spatial
User’s Guide and Reference
10g Release 2 (10.2)
非常好的Oracle10g Spatial(10.2)的指南和參考文檔
英文的
目錄有3部分20多個章節(jié),這里只節(jié)選了第二章節(jié)的目錄
2 Spatial Data Types and Metadata
2.1 Simple Example: Inserting, Indexing, and Querying Spatial Data..... 2-1
2.2 SDO_GEOMETRY Object Type ...... 2-5
2.2.1 SDO_GTYPE.......... 2-5
2.2.2 SDO_SRID.......... 2-7
2.2.3 SDO_POINT .......... 2-7
2.2.4 SDO_ELEM_INFO......... 2-7
2.2.5 SDO_ORDINATES ........ 2-10
2.2.6 Usage Considerations ......... 2-11
2.3 SDO_GEOMETRY Methods......... 2-11
2.4 SDO_GEOMETRY Constructors........ 2-13
2.5 Geometry Examples........ 2-14
2.5.1 Rectangle......... 2-14
2.5.2 Polygon with a Hole......... 2-15
2.5.3 Compound Line String ....... 2-17
2.5.4 Compound Polygon ......... 2-19
2.5.5 Point........... 2-20
2.5.6 Oriented Point .......... 2-21
2.5.7 Type 0 (Zero) Element......... 2-23
2.5.8 Several Geometry Types........ 2-25
2.6 Geometry Metadata Views ........ 2-29
2.6.1 TABLE_NAME......... 2-30
2.6.2 COLUMN_NAME......... 2-30
2.6.3 DIMINFO........ 2-30
2.6.4 SRID........... 2-31
2.7 Spatial Index-Related Structures ....... 2-31
2.7.1 Spatial Index Views ....... 2-31
2.7.1.1 xxx_SDO_INDEX_INFO Views....... 2-31
2.7.1.2 xxx_SDO_INDEX_METADATA Views..... 2-32
2.7.2 Spatial Index Table Definition ....... 2-34
2.7.3 R-Tree Index Sequence Object ....... 2-35
2.8 Unit of Measurement Support ........ 2-35
直接下載demo文件即可
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1500381985&number=0
更多下載:
http://www.fruitres.cn
--sunfruit
前一段時間寫了一個基于MapInfo地圖引擎生成地圖圖片的例子,這次寫了一個java程序來使用MapInfo地圖引擎瀏覽地圖,可以看到加載地圖數(shù)據(jù)以后,進行放大、縮小、平移的操作,拋去網(wǎng)絡(luò)因素,速度方面還是可以接受的
通過這個demo可以了解數(shù)據(jù)部署方式,需要的lib文件,至于其它的就是Swing+Graphics的基本應(yīng)用,所以不提供源代碼
Swing+Graphics的用法請參考原來發(fā)布的作品
《基本繪圖演示源代碼,繪制矩形》
《JAVA開發(fā)的俄羅斯方塊源代碼》
JDK 1.5.0
功能:放大、縮小、平移
參考MapXtremeJava48_DG_CHS.pdf,在MapInfo網(wǎng)站下載,或是安裝開發(fā)包以后在文檔目錄中提供
下載地址:http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=254133506&number=0
更多下載:http://www.fruitres.cn/
-sunfruit
使用MapInfo地圖引擎生成地圖圖片的代碼,不包含地圖數(shù)據(jù)和Lib包
直接下載demo文件即可
參考MapXtremeJava48_DG_CHS.pdf,在MapInfo網(wǎng)站下載,或是安裝開發(fā)包以后在文檔目錄中提供
JDK1.5
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=447120696&number=0
更多下載:
http://www.fruitres.cn/
--sunfruit
WINXP中選擇多個磁盤進行碎片整理雖然bux一個批命令文件,可以順序執(zhí)行多個磁盤的碎片整理工作,這樣雖然不能在WIN XP中選擇多個磁盤進行碎片整理,利用這個方法也可以一次執(zhí)行多個磁盤的碎片整理,比較實用
下載地址:
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1942443612&number=0
更多資料:
http://www.fruitres.cn/
--sunfruit
該文檔非常好的Oracle維護學(xué)習(xí)文檔
文檔目錄如下
監(jiān)控SQL
常用戶用SQL
查詢表結(jié)構(gòu)
表空間使用狀況
查詢某個模式下面數(shù)據(jù)不為空的表
客戶端主機信息
安裝Oracle以后,經(jīng)常使用的修改表空間的SQL代碼
查看回滾段名稱及大小
PL/SQL入門教程
在from后面使用變量
Oracle常用數(shù)據(jù)字典
在Oracle中實現(xiàn)數(shù)據(jù)庫的復(fù)制
SQL*PLUS環(huán)境輸入'&字符'的方法
簡說創(chuàng)建用戶
簡說Oracle啟動及關(guān)閉數(shù)據(jù)庫實例
簡說Oracle數(shù)據(jù)庫導(dǎo)出(exp)/導(dǎo)入(imp)
實例:Oracle導(dǎo)出Excel文件
實例:Oracle導(dǎo)出HTM文件
查看數(shù)據(jù)庫保留字
數(shù)據(jù)字典及某些字段意義
下載地址
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=244294537&number=0
更多資料
http://www.fruitres.cn/
--sunfruit
源代碼四個文件,在這個DEMO中可以看到
如何使用2D組件,如何把JPanel做為畫板使用,如何使用Canvas替代JPanel,如何設(shè)置2D組件的線寬
這個只是針對像入門的新手,高手就不需要看了,免得扔雞蛋
下載地址
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=1016162856&number=0
更多工具和文檔請到
http://www.fruitres.cn/
--sunfruit
將Oracle表結(jié)構(gòu)導(dǎo)出成Html頁面的工具
1.0.4
增加了導(dǎo)出觸發(fā)器、存儲過程、函數(shù)的功能,并且修改了不能導(dǎo)出KEYS全部類型的BUG
1.0.3
增加了導(dǎo)出Sequences、View的功能,并且導(dǎo)出界面默認(rèn)導(dǎo)出到安裝文件夾中的export目錄中
1.0.2
增加了導(dǎo)出KEYS、INDEX的功能
1.0.1
增加了導(dǎo)出完畢以后直接點擊打開文件夾、打開文件的查看方式,并且支持Linux/Win 平臺
1.0.0
導(dǎo)出為html文件,導(dǎo)出完畢后直接查看index.html文件即可。導(dǎo)出的內(nèi)容包括各個表的名稱索引和注釋以及表中各個字段的明細(xì)和注釋
下載地址
http://www.fruitres.cn/servlet/buyproductservlet?tag=single&tag1=info&PRODUCT_ID=942025602&number=0 下載版本1.0.4
更多工具和文檔請到
http://www.fruitres.cn/
--sunfruit
設(shè)置圖片的每個象素Alpha,使得圖片透明,核心代碼如下
private void setAlpha(ByteArrayOutputStream os) {
/**
* 增加測試項
* 讀取圖片,繪制成半透明
*/
try {
ImageIcon imageIcon = new ImageIcon(os.toByteArray());
BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(),imageIcon.getIconHeight()
, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
g2D.drawImage(imageIcon.getImage(), 0, 0,
imageIcon.getImageObserver());
//循環(huán)每一個像素點,改變像素點的Alpha值
int alpha = 100;
for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
int rgb = bufferedImage.getRGB(j2, j1);
rgb = ( (alpha + 1) << 24) | (rgb & 0x00ffffff);
bufferedImage.setRGB(j2, j1, rgb);
}
}
g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
//生成圖片為PNG
ImageIO.write(bufferedImage, "png", new File(圖片路徑));
}
catch (Exception e) {
e.printStackTrace();
}
}
--sunfruit
在openConnection之前加上
Properties prop = System.getProperties();
System.getProperties().put("proxySet","true");
// 設(shè)置http訪問要使用的代理服務(wù)器的地址
prop.setProperty("http.proxyHost","xxxxxxx");
// 設(shè)置http訪問要使用的代理服務(wù)器的端口
prop.setProperty("http.proxyPort","xxxxx");
然后并不像有的貼子說的那樣添加
prop.setProperty("http.proxyUser","xxxxxxxx");
prop.setProperty("http.proxyPassword","xxxxx");
添加這樣的內(nèi)容是不行的,而是將"username:password"進行base64編碼,具體代碼如下
String authentication = "username:password";
String encodedLogin = new BASE64Encoder().encode(authentication.getBytes());
httpurlconnection.setRequestProperty("Proxy-Authorization", " Basic " + encodedLogin);
注意BASE64Encoder().encode(authentication.getBytes());這里不能使用BASE64Encoder().encodeBuffer(authentication.getBytes())否則報錯
具體原因參考sun公布的JDK BUG , Bug ID: 4615330
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4615330
??? --sunfruit
??? 前一段時間發(fā)了一個“
[原創(chuàng)]JAVAMAIL發(fā)送郵件正文是html格式并且顯示圖片還帶有附件的郵件”的文章,后來經(jīng)過深入的使用該功能發(fā)現(xiàn)幾個要點說明如下:
????第一:正文必須第一個添加到Multipart對象中
??? 第二:IMGX? X是序號,該序號必須從1開始,并且只能為數(shù)字
??? 以上兩點缺少一點都不會成功
??? 另:ByteArrayDataSource? 這個類在舊的javamail開發(fā)包中沒有,需要新的javamail開發(fā)包
??? --sunfruit
??? 有三個壓縮包需要下載,下載以后放在同一個目錄中解壓即可
????
下載包1????
下載包2????
下載包3
??? --sunfruit
???沒有什么說的,源代碼如下
public void sendMail(int id) {
??????? //數(shù)據(jù)初始化
??????? Transport transport; //發(fā)郵件時使用
??????? String part = GetResource.getXMLValue("mail_port"); //端口
??????? String mailhost = GetResource.getXMLValue("mail_server"); //服務(wù)器
??????? String user = GetResource.getXMLValue("mail_user"); //用戶名
??????? String password = GetResource.getXMLValue("mail_password"); //密碼
??????? String from = GetResource.getXMLValue("mail_from"); //發(fā)件mail
??????? String strname = GetResource.getXMLValue("mail_strname"); //在地址欄上顯示的名字
??????? String to = GetResource.getXMLValue("mail_to"); //收件人
??????? String cc = ""; //抄送人
??????? String bcc = ""; //密送人
??????? String title = GetResource.getXMLValue("mail_title"); //標(biāo)題
??????? byte[] bytes = null;
??????? try {
??????????? bytes = FileIO.readFile(GetResource.getXMLValue("mail_contentpath")); //正文
??????? } catch (IOException ex) {
??????????? log.error("",ex);
??????? }
??????? String fromat = GetResource.getXMLValue("mail_fromat");
??????? //獲得下載需要的key
??????? byte[] bkeydes=null;
??????? try {
??????????? bkeydes=FileIO.readFile(GetResource.getXMLValue("附件地址"));
??????? } catch (IOException ex) {
??????????? log.error("",ex);
??????? }
??????? try {
??????????? Properties props = System.getProperties(); //獲得系統(tǒng)屬性
??????????? props.put("mail.smtp.host", mailhost); //設(shè)置SMTP主機
??????????? props.put("mail.smtp.auth", "true"); //設(shè)置身份驗證為真,若須身份驗證則必須設(shè)為真
??????????? //獲得郵件會話對象
??????????? Session session = null;
??????????? //需要驗證
??????????? session = Session.getDefaultInstance(props,
???????????????????????????????????????????????? new SmtpAuthenticator(user,
??????????????????? password));
??????????? //創(chuàng)建MIME郵件對象
??????????? MimeMessage mimeMsg = new MimeMessage(session);
??????????? //設(shè)置發(fā)信人
??????????? if (strname != null && !strname.equals("")) {
??????????????? mimeMsg.setFrom(new InternetAddress(from, strname));
??????????? } else {
??????????????? mimeMsg.setFrom(new InternetAddress(from));
??????????? }
??????????? //設(shè)置收信人
??????????? if (!to.equals("")) {
??????????????? mimeMsg.setRecipients(Message.RecipientType.TO,
????????????????????????????????????? InternetAddress.parse(to));
??????????? }
??????????? //設(shè)置抄送人
??????????? if (!cc.equals("")) {
??????????????? mimeMsg.setRecipients(Message.RecipientType.CC,
????????????????????????????????????? InternetAddress.parse(cc));
??????????? }
??????????? //設(shè)置暗送人
??????????? if (!bcc.equals("")) {
??????????????? mimeMsg.setRecipients(Message.RecipientType.BCC,
????????????????????????????????????? InternetAddress.parse(bcc));
??????????? }
??????????? //設(shè)置郵件主題
??????????? sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//??????????? mimeMsg.setSubject("=?GB2312?B?" + enc.encode(title.getBytes()) +
//?????????????????????????????? "?=");
??????????? mimeMsg.setSubject(title, "GBK");
??????????? //設(shè)置郵件內(nèi)容
??????????? //mimeMsg.setText(content, "gb2312");
??????????? //發(fā)送日期
??????????? mimeMsg.setSentDate(new Date());
??????????? /*******************附件 begin××××××××××××××××××××××××*/
??????????? BodyPart mbp = null; //正文
??????????? //MimeBodyPart mbp1 = null; //附件
??????????? mbp = new MimeBodyPart();
??????????? //設(shè)置郵件正文格式(html/text)
??????????? if (fromat.equals("0") || fromat.equals("")) {
??????????????? //普通格式
??????????????? mbp.setText(new String(bytes,"GBK"));
??????????? } else {
??????????????? //網(wǎng)頁格式
??????????????? mbp.setDataHandler(new DataHandler(new String(bytes,"GBK"),
??????????????????????? "text/html;charset=gb2312"));
??????????? }
??????????? //!!!!注意必須為new MimeMultipart("related"); 這樣的實例化才能發(fā)送html正文顯示圖片的郵件 "related"
??????????? //new MimeMultipart(); 這樣實例化則不能發(fā)送html正文顯示圖片的郵件 只可以發(fā)送其他的郵件
??????????? Multipart mp = new MimeMultipart("related");
??????????? if (mbp != null)
??????????????? mp.addBodyPart(mbp); //正文
??????????? //附件key.des
??????????? BodyPart messageBodyPart = new MimeBodyPart();
??????????? ByteArrayDataSource fileds = new ByteArrayDataSource(bkeydes,"application/octet-stream");
??????????? messageBodyPart.setDataHandler(new DataHandler(fileds));
??????????? //解決附件中文問題
??????????? //mbp1.setFileName(fileds.getName(),"gb2312");
??????????? messageBodyPart.setFileName(MimeUtility.encodeWord("key.des", "GB2312", null));
??????????? mp.addBodyPart(messageBodyPart);
??????????? //附件 圖標(biāo)
??????????? messageBodyPart = new MimeBodyPart();
??????????? bytes=FileIO.readFile(GetResource.getXMLValue("img_logo"));
??????????? fileds = new ByteArrayDataSource(bytes,"application/octet-stream");
??????????? messageBodyPart.setDataHandler(new DataHandler(fileds));
??????????? //解決附件中文問題
//??????????? messageBodyPart.setFileName("fruitrsource_touming.jpg");
//??????????? messageBodyPart.setHeader("Content-ID", "fruitrsource_touming");
??????????? messageBodyPart.setFileName("1.jpg");
??????????? //!!!!注意這里是"<IMG1>" 帶有尖括號 而在正文的html里面則是src="cid:IMG1"
??????????? messageBodyPart.setHeader("Content-ID", "<IMG1>");
??????????? mp.addBodyPart(messageBodyPart);
??????????? // 添加 Multipart到Message中
??????????? mimeMsg.setContent(mp);
??????????? mimeMsg.saveChanges();
??????????? transport = session.getTransport("smtp");
??????????? transport.connect(mailhost, Integer.parseInt(part), user, password);
??????????? //發(fā)送郵件
??????????? //transport.send(mimeMsg, mimeMsg.getAllRecipients());
??????????? //transport.send(mimeMsg);
??????????? transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients());
??????????? //System.out.println("mail send!");
??????????? transport.close();
??????? }
??????? catch (Exception e) {
??????????? e.printStackTrace();
??????? }
??? }
class SmtpAuthenticator extends Authenticator {
??????? //SMTP身份驗證
??????? public SmtpAuthenticator(String username, String password) {
??????????? this.username = username;
??????????? this.password = password;
??????? }
??????? public PasswordAuthentication getPasswordAuthentication() {
??????????? return new PasswordAuthentication(this.username, this.password);
??????? }
??????? String username = null;
??????? String password = null;
??? }
--sunfruit
JAVA編寫的使用像素RGB值還原圖像的方法,代碼如下
public class ImageData {
private int[][] idata=null;
public ImageData() {
readImageData();
writeImageData();
}
private int[][] readImageData()
{
try {
//imagedata的鍵值就是一個存儲了圖像像素RGB值得文本文件
RandomAccessFile randomAccessFile = new RandomAccessFile(new File(GetResource.getXMLValue("imagedata")),"r");
long filesize=randomAccessFile.length();
long filepointer=0;
DynArrayInt dynArrayInt=null;
ArrayList arrayList=new ArrayList();
int n1=0;
while(filesize>filepointer)
{
filepointer=randomAccessFile.getFilePointer();
String str1=randomAccessFile.readLine();
if(str1!=null)
{
String[] str2=str1.split(" ");
String[] str3=str2[1].split(",");
dynArrayInt=new DynArrayInt();
for(int i=0;i<str3.length;i++)
{
if(!str3[i].equals(""))
{
int pix = Integer.parseInt(str3[i], 16);
dynArrayInt.addInt(pix);
}
}
if(n1==0)
n1=dynArrayInt.getSize();
arrayList.add(dynArrayInt);
}
}
idata=new int[arrayList.size()][dynArrayInt.getSize()];
for(int i=0;i<idata.length;i++)
{
DynArrayInt dynArrayInt1=(DynArrayInt)arrayList.get(i);
for(int j=0;j<idata[i].length;j++)
{
idata[i][j]=dynArrayInt1.getInt(j);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return idata;
}
private void writeImageData()
{
BufferedImage bufferedImage=new BufferedImage(idata[0].length,idata.length,BufferedImage.TYPE_INT_RGB);
for(int i=0;i<idata.length;i++)
{
for(int j=0;j<idata[i].length;j++)
{
bufferedImage.setRGB(j,i,idata[i][j]);
}
}
Random random=new Random(System.currentTimeMillis());
String ext="jpg";
String filepath = System.getProperty("java.io.tmpdir") + random.nextInt(99999) + "." + ext;
try {
ImageIO.write(bufferedImage, ext, new File(filepath));
System.out.println("文件已經(jīng)生成,路經(jīng)為" + filepath);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
ImageData imagedata = new ImageData();
}
}
其中的“GetResource”,“DynArrayInt”為自定義類,GetResource得功能就是解析獲取properties文件的內(nèi)容,DynArrayInt是一個整形動態(tài)數(shù)組,可以在以前的文章里獲得“DynArrayInt”的源代碼,所謂的圖像的像素值就是如下數(shù)據(jù)
px1 44525b,44555d,475a61,47585d,44555a,46575c,44575d,43565c,42575e,43585f,445960,435962,435964,425861,425861,41585e,3f555e,3e545f,3d5261,3c5162,3d4f59,3d4f59,3f515b,40525c,40525c,40525c,40525c,3f515b,3f515b,3f4f5a,3f4f5c,40505d,3f515f,3f515f,3d5060,3c4f5f,3b505f,3a4e58,3e525e,3e525e,3d5060,415466,3f5264,405363,405460,41555f,42575d,42575e,43585f,445862,445862,445864,445864,445866,445866,415760,435962,445a63,455b66,455b66,445a67,455b68,485d6c,4c626f,4d636e,4e646f,4d636c,4b616a,51686e,536a70,566d73,5c7378,6f7c7a,7c8987,86908f,8d9796,8e9696,949a9a,969c9c,9ca2a2,a1a3a1,a8aaa8,aeb1ac,b2b5b0,b9bcb7,c5c8c2,cccfc9,ced1c9,d6d9d1,d5d8d3,d7dad5,dadbd5,dcddd7,dcdbd4,ddddd3,e0ddd4,e0ddd4,deddd6,deddd6,deddd6,dfded7,dfded7,e0dfd8,e0dfd8,e0dfd8,e0dfd8,e3dfd9,e3dfd9,e3dfd9,e3dfd9,e4e0da,e4e0da,e4e0da,e5e1db,e5e1db,e2e1da,e2e1da,e3e2db,e3e2db,e4e3dc,e4e3dc,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e6e5de,e6e5de,e6e5de,e6e5de,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e4e1d8,e5e2d9,e5e2d9,e4e1d8,e2dfd6,e3e0d7,e2dfd6,e1ded5,e1ded5,e2dfd6,e2dfd6,e2dfd6,e2dfd6,e1ded5,e1ded5,e1ded5,e1ded5,e1ded5,dedad4,dedad4,dcdbd4,dcdbd4,dbdcd4,dbdcd4,d9dcd4,d9dcd4,dedad4,dedad4,ddd9d3,ddd9d3,dbd7d1,dbd7d1,dcd8d2,dcd8d2,dbd7d1,d5d8d0,d5d8d0,d7d8d0,d7d8d0,d7d6cf,d9d5cf,d9d5cf,d9d5cf,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d5d4cd,d5d4cd,d5d7cc,d5d7cc,d5d7cc,d5d7cc,d4d6cb,d4d6cb,d5d7cc,d5d7cc,d5d7cc,d2d7d0,d2d7d0,d3d6d0,d3d6d0,d4d5cf,d4d5cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d0d3cb,d2d3cb,d3d2cb,d6d0cb,d6d0cb,d4d3cc,d3d4cc,d2d5cd,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d3d2ce,d0d3cb,d0d3cb,d2d3cb,d2d3cb,d3d2cb,d3d2cb,d5d1cb,d5d1cb,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d1d0c9,d1d0c9,d2d1ca,d2d1ca,d3d2cb,d3d2cb,d3d2cb,d3d2cb
px0 44525b,44575e,465b62,485a5a,455757,46585a,44575b,42555b,41565d,435761,445862,445a63,435966,435964,42595f,42595e,40575c,3f5560,3d5263,3c5066,3a4c58,3b4d59,3d4f5b,3e505a,40525c,40525c,40535a,3f5259,3f5259,3f5057,3f5057,405158,3f5259,3f5259,3d515b,3c505a,3b515c,3a4e5a,3e5260,3e5260,3d5060,415468,3f5266,3f5262,405462,405460,42575d,42575e,43585f,435761,41555f,425662,445864,465a68,465a68,415760,425861,445a63,445a65,445a65,465c69,475d6a,475c6b,44596a,485d6e,4c6373,4d6474,4a616f,4b6472,4b6472,496270,4c6573,5f6c6e,677476,6f7c7e,798587,818a8d,899295,8f969a,91989c,949895,9a9e9b,9ea39d,a1a6a0,a9aea8,aeb3ac,babfb8,c0c5bc,ccd1c8,cfd2cd,d2d5d0,d5d6d0,d7d8d2,dcdbd4,ddddd3,e0ddd4,e0ddd4,deddd6,deddd6,deddd6,dfded7,dfded7,e0dfd8,e0dfd8,e0dfd8,e0dfd8,e3dfd9,e3dfd9,e3dfd9,e3dfd9,e4e0da,e4e0da,e4e0da,e5e1db,e5e1db,e2e1da,e2e1da,e3e2db,e3e2db,e4e3dc,e4e3dc,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e6e5de,e6e5de,e6e5de,e6e5de,e5e4dd,e5e4dd,e5e4dd,e5e4dd,e4e1d8,e4e1d8,e4e1d8,e3e0d7,e2dfd6,e2dfd6,e2dfd6,e1ded5,e1ded5,e2dfd6,e2dfd6,e2dfd6,e2dfd6,e1ded5,e1ded5,e1ded5,e1ded5,e1ded5,ddd9d3,ddd9d3,dbdad3,dbdad3,dadbd3,dadbd3,d8dbd3,d8dbd3,dedad4,dedad4,ddd9d3,ddd9d3,dad6d0,dbd7d1,dcd8d2,dcd8d2,dbd7d1,d5d8d0,d5d8d0,d5d8d0,d7d8d0,d6d7cf,d7d6cf,d7d6cf,d9d5cf,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d6d5ce,d5d4cd,d5d4cd,d6d8cd,d6d8cd,d6d8cd,d6d8cd,d4d6cb,d4d6cb,d5d7cc,d5d7cc,d5d7cc,d3d8d1,d3d8d1,d4d7d1,d4d7d1,d4d5cf,d4d5cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d5d4cf,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d4d3ce,d0d3cb,d2d3cb,d3d2cb,d6d0cb,d7d1cc,d4d3cc,d4d5cd,d2d5cd,d4d2d1,d4d2d1,d4d2d1,d4d2d1,d4d2d1,d3d1d0,d3d1d0,d3d1d0,d3d1d0,d0d3cb,d0d3cb,d2d3cb,d2d3cb,d3d2cb,d3d2cb,d5d1cb,d5d1cb,d3d2cd,d3d2cd,d3d2cd,d3d2cd,d3d2cd,d2d1cc,d2d1cc,d2d1cc,d2d1cc,d1d0c9,d1d0c9,d2d1ca,d2d1ca,d4d3cc,d4d3cc,d4d3cc,d4d3cc
以上數(shù)據(jù)表示圖像有兩行像素,每一行有260個像素組成,每個像素的RGB值就是44525b
--sunfruit

求上圖1點到其他各點的最短路徑,依據(jù)圖論知識建立矩陣模型,進一步得到代碼如下
public class ShortPathA {
private static int[][]
a = {
{0, 50, 10, 100000, 45, 100000}, {100000, 0, 15, 100000, 10, 100000}, {20, 100000, 0, 15, 100000, 100000}, {
100000, 20, 100000, 0, 35, 100000}, {100000, 100000, 1000000, 30, 0, 100000}, {100000, 100000, 100000, 3, 100000, 0}
};
private static boolean[] mark = new boolean[a.length];
public ShortPathA() {
int Vo = 0; //源點
//源點到其他各點的距離
int[] b = new int[a.length];
DynArrayInt S = new DynArrayInt();
for (int i = 0; i < a.length; i++) {
mark[i] = false;
//b[i] = a[Vo][i];
}
int best = -1;
mark[0] = true;
b[0] = 0; //{0為源點}
while (best != 0) {
best = 0;
int best_j = 0;
for (int i = 0; i < b.length; i++)
{
if (mark[i]) //{對每一個已計算出最短路徑的點}
{
for (int j = 0; j < b.length; j++) {
if ( (!mark[j]) && (a[i][j] > 0)) {
if ( (best == 0) || (b[i] + a[i][j] < best)) {
best = b[i] + a[i][j];
best_j = j;
}
}
}
}
}
if (best > 0) {
b[best_j] = best;
mark[best_j] = true;
}
}
System.out.println(java.util.Arrays.toString(b));
}
public static void main(String[] args) {
ShortPathA shortpath = new ShortPathA();
}
}
--sunfruit
當(dāng)通過URLConnection第一次和服務(wù)器發(fā)起POST或是GET請求以后,通過getHeaderField方法獲得SessionID,具體方法為:
String session_value=getHeaderField("Set-Cookie");
第二次發(fā)起POST或是GET請求的時候需要把剛才獲得的SessionID放置在請求的頭部然后再提交,這樣就能服務(wù)器就會認(rèn)為是同一個Session請求了,具體方法為:
setRequestProperty("Cookie", session_value);
如果取得Set-Cookie的值比較長,取值到分號前即可 如 JSESSIONID=575F7196EDB52825D288F4061C66BC29;
這樣就實現(xiàn)了保存session向服務(wù)器提交請求
??? --sunfruit

上圖求一筆畫的路徑,利用圖論的相關(guān)知識可以得到程序如下:
public class OnePath {
??? private static int[][]
??????????? links = { {0,1,1,0,0,0,1,0}, {1,0,0,1,0,0,0,1}, {1,0,0,1,1,1,0,0},
??????????? {0,1,1,0,1,1,0,0}, {0,0,1,1,0,1,1,0}, {0,0,1,1,1,0,0,1}, {1,0,0,0,1,0,0,0}, {0,1,0,0,0,1,0,0}
??? };
??? public OnePath() {
??????? int sum = 0;
??????? //存放每個點的度
??????? int[] point = new int[links[0].length];
??????? for (int i = 0; i < links[0].length; i++) {
??????????? int[] templink = links[i];
??????????? for (int j = 0; j < links[0].length; j++) {
??????????????? point[i] += templink[j];
??????????? }
??????????? sum += point[i];
??????? }
??????? //計算度數(shù)是奇數(shù)點的個數(shù),如果大于2則不能一筆畫
??????? int odt = 0;
??????? int start = -1;
??????? for (int i = 0; i < point.length; i++) {
??????????? int mod = point[i] % 2;
??????????? if (mod > 0) {
??????????????? //if(start==-1)
??????????????????? start = i;
??????????????? odt++;
??????????? }
??????? }
??????? if(odt>2)
??????? {
????????? System.out.println("該圖不能一筆畫");
????????? return;
??????? }
??????? int r = 0;
??????? //從一個奇數(shù)點開始計算
??????? int nowd=start;
??????? System.out.print(nowd+1);
??????? while (sum > 0) {
??????????? r=0;
??????????? //對于起點nowd 檢查當(dāng)前的點r 是否合適
??????????? //links[nowd][r]==0 判斷是否有可以走的沒有用過的線路
??????????? //(point[r]<=1 && sum!=2) 判斷是否是最后一次,如果不是最后一次,那么避開度數(shù)是1的點
??????????? while (links[nowd][r]==0 || (point[r]<=1 && sum!=2)) {
??????????????? r++;
??????????? }
??????????? links[nowd][r]=0; //已經(jīng)用過的線路
??????????? links[r][nowd]=0; //已經(jīng)用過的線路 links[nowd][r] links[r][nowd]互為往返路線,用過1->2那么2->1也作廢了
??????????? sum=sum-2; //總度數(shù)減2 因為從1->2 消耗了1的度和2的度
??????????? point[nowd]--; //起點和終點的度都減1 1->2 那么1的度和2的度都減1
??????????? point[r]--; //起點和終點的度都減1 1->2 那么1的度和2的度都減1
??????????? nowd =r; //設(shè)置新的起點
??????????? System.out.print("->"+(r+1));
??????? }
??? }
??? public static void main(String[] args) {
??????? new OnePath();
??? }
}
如果你使用JavaScript編程,你或許會懷疑它是否包含了面向?qū)ο螅∣O)的結(jié)構(gòu)。實際上,JavaScript的確支持面向?qū)ο蟮募軜?gòu)――在某種程度上。本文將通過一個可擴展向量圖形(SVG)的實例來說明JavaScript的OO結(jié)構(gòu)。
我如何在類中定義方法和屬性?
OO開發(fā)的一個基本方面是類及其相應(yīng)的方法和/或?qū)傩缘氖褂谩avaScript通過function關(guān)鍵字支持類(及其屬性)的使用。下面的代碼定義了一個叫做Figure的JavaScript類:
function Figure() {
this.centerX=0;
this.centerY=0;
this.area=0;
this.transform = transform; // methods are defined like this
function transform(moveX,moveY,angle) {
this.centerX += moveX;
this.centerY += moveY;
} }
這個Figure類有三個屬性:centerX,centerY,和area。另外,它還有一個方法叫做transform()。前三行是這個類的構(gòu)造器。
但是它看起來不像一個類
你會想Figure()看起來不像一個類,而更像一個JavaScript的函數(shù)。那么為什么Figure()定義的是個類?
嚴(yán)格的說,F(xiàn)igure()函數(shù)沒有定義一個類,但是它仿造了一個。它實際上創(chuàng)建了一個對象,在括號里的代碼使這個對象的構(gòu)造器。JavaScript的對象支持是很基礎(chǔ)的,它并不區(qū)分類和對象。
這就引到了問題為什么Figure()函數(shù)創(chuàng)建的是一個對象。對象是可以有屬性和方法的。基本上,因為Figure()函數(shù)同時包含了屬性和方法,它就是個對象。在JavaScript里,所有的函數(shù)即是對象又是可調(diào)用的代碼塊。這不像它聽起來的那樣容易被誤解。要創(chuàng)建一個Figure()類/對象,你只用使用以下句法:
MyFigure = new Figure();
你也可以把Figure()函數(shù)當(dāng)作代碼塊調(diào)用,就像這樣:
figValue = Figure();
變量figValue沒有被定義是因為代碼塊Figure()沒有返回任何值。如果你把return(this.area)加到函數(shù)的最后一行,figValue就會有個值0。所以figValue是個類型數(shù)字,MyFigure是對象 Rectangle的實例。
為什么所有的變量前面都一個“this”?
這個關(guān)鍵字this表示這是對象的實例變量,可以使用MyFigure.centerX從對象外部訪問。要讓變量成為私有變量,去掉前綴this就行了。this.transform = transform這一行讓方法成為公用方法。這個方法通過MyFigure.transform(100,100,0)調(diào)用。
這些類有層次之分嗎?
另一個好問題的是JavaScript的類是否有層次之分。回答是肯定有。我們來仔細(xì)看看是怎么做到分層的。我們可以定義一個Rectangle子類,并把Figure作為父類:
function Rectangle(startX, startY, endX, endY) {
this.width = endX - startX;
this.height = endY - startY;
this.centerX = (endX + startX)/2;
this.centerY = (endY + startY)/2;
this.computeArea = computeArea;
function computeArea() {
this.area = this.width*this.height;
} }
Rectangle.prototype = new Figure();
Rectangle對象是用4個自變量創(chuàng)建的,前四行是構(gòu)造器。 Rectangle類包含了一個方法: computeArea()。最后一行Rectangle.prototype = new Figure();,把Rectangle類定義為從Figure類繼承來的子類。
然我來解釋一下prototype(原型)。每個對象構(gòu)造器都有prototype屬性;這是用來給所有的對象增加新屬性和方法的。這就是為什么原型被用來實現(xiàn)繼承:child.prototype = new parent();。通過原型,父對象的所有屬性和方法都被添加到子對象上。
要注意this.centerX,this.centerY,和area是Rectangle類中所使用的屬性,但是它們是 Figure父類的屬性。和Rectangle類相似,Circle類可以被定義成Figure類的原型。這種父子關(guān)系可以按你需要來定義深度;你可以創(chuàng)建另一個Rectangle的子類。
我如何創(chuàng)建一個類的實例?
在JavaScript里創(chuàng)建一個類的實例很容易:
rect = new Rectangle(100,100,900,800);
這就創(chuàng)建了Rectangle類型的一個對象。Rectangle的構(gòu)造器在屬性width, height, centerX, 和centerY中填入了值。rect.area屬性的值是零(0)。使用這個命令就能調(diào)用area方法:
rect.computeArea();
rect.area的值現(xiàn)在是560,000。要調(diào)用transform方法使用:
rect.transform(100,200,0);
父和子對象的屬性可以像這樣訪問到:
var ar = rect.area;
var wi = rect.width;
我能超越屬性和方法嗎?
就像你在Java中的一樣,你可以超越屬性和方法。在子類中定義的屬性或者方法可以超越同名的父類的屬性和方法。
和全局變量互動
JavaScript也支持全局變量的使用。在以下代碼段中測試一下g_area變量的范圍:
<HTML>
<SCRIPT>
var g_area = 20;
function Figure() {
…
this.area=g_area;
…
}
function Rectangle(){ … }
Rectangle.prototype = new Figure();
function test(){
g_area = 40;
rect = new Rectangle();
alert(rect.area);
}
</SCRIPT>
<BODY onLoad = 'test()'/>
</BODY>
</HTML>
rect.area的值是20(不是你預(yù)計的40),這是因為Rectangle對象是Figure對象的原型,這種關(guān)系在test()被調(diào)用以前就被定義了。要使用g_area的新值,你需要用以下的方法:
function test() {
g_area = 40;
Rectangle.prototype = new Figure();
rect = new Rectangle();
alert(rect.area);
}
對于所有的Rectangle的新實例,這將改變area屬性的值。或者,你可以使用這種方法:function test() {
g_area = 40;
rect = new Rectangle();
Rectangle.prototype.area = g_area;
alert(rect.area);
}
這將改變Rectangle所有現(xiàn)存的以及新實例的area屬性的值。
結(jié)論
為了效仿OO開發(fā),JavaScript提供了必需的繼承、封裝和超越屬性,盡管它不支持接口和方法的過載。如果你是剛接觸到OO開發(fā),用它試試。OO概念允許開發(fā)者將一組數(shù)據(jù)和相關(guān)操作集中入一個對象。這在管理瀏覽器事件和管理瀏覽器內(nèi)SVG圖時很有用。
摘要: --sunfruit如何讓你的網(wǎng)站排名靠前??????? 網(wǎng)站做好了,怎樣才能讓你的網(wǎng)站在各大搜索引擎中排名靠前呢?網(wǎng)上的帖子很多,通過搜索和總結(jié),整理出了一套自己行之有效的方法,寫出來供大家參考?????? 成功案例推薦:http://sooboo.com.cn/?????? 還在繼續(xù)整理中,而且我們的網(wǎng)站也在不斷優(yōu)化中.........1、?網(wǎng)站建好后首先到各大搜索引擎免費登錄你的網(wǎng)站http...
閱讀全文
??? --sunfruit
???很多時候需要上傳附件到服務(wù)器,一般采用在頁面放置<input type="file" name="upload" value=""> 的方式讓用戶選擇要上傳的文件進行上傳,使用的是HTTP協(xié)議,這樣的方式很方便開發(fā)也簡單,不過如果上傳的附件比較大的時候,會出現(xiàn)IE響應(yīng)很慢的情況,如果用戶急性子,多點幾下上傳的按鈕,那么就會導(dǎo)致IE不響應(yīng)的情況,這個時候如果在文件上傳得過程中,給用戶一個動態(tài)的提示甚至是一個上傳的進度條,效果就會好多了,這樣就會用到Ajax技術(shù)了,讓Ajax以一個固定的間隔時間檢查上傳情況然后在頁面以文字或是圖片的方式體現(xiàn)出來就行了。
???在使用Ajax進行附件上傳進度查詢的時候也想過,直接使用Ajax進行附件上傳,在實現(xiàn)過程中發(fā)現(xiàn)問題比較多,所以就使用了變通的方式:使用標(biāo)準(zhǔn)的附件上傳方式,結(jié)合Ajax進行上傳的進度檢查
???主要的代碼如下:
???Ajax的封裝
???/**
? * 創(chuàng)建 XMLHttpRequest 對象
? */
? function getXMLHttpRequest()
? {
??? var http_request;
??? if (window.XMLHttpRequest) {
????? //非IE瀏覽器框架創(chuàng)建 XMLHttpRequest 對象
????? http_request = new XMLHttpRequest();
????? if(http_request.overrideMimeType)
????? {
??????? http_request.overrideMimeType('text/xml');
????? }
??? }else if (window.ActiveXObject){
????? // 創(chuàng)建 XMLHttpRequest 對象
????? try {
??????? http_request = new ActiveXObject("Msxml2.XMLHTTP");
????? } catch (e1) {
??????? try {
????????? http_request = new ActiveXObject("Microsoft.XMLHTTP");
??????? } catch (e2) {
????????? // 不能創(chuàng)建 XMLHttpRequest 對象
??????? }
????? }
??? }
??? return http_request;
? }
/**
?? * Get請求
?? */
? function sendGetDictate(http_request,url)
? {
??? req.open("GET", url, true);
??? http_request.send(null);
? }
以上是Ajax的的基礎(chǔ)部分,下面說文件上傳部分的檢查部分,文件上傳本身的流程不變,只是在提交上傳以后,需要執(zhí)行setTimeout(checkupload,500); 這樣的方法 checkupload 方法要自己編寫,例如
function checkupload()
? {
??? req=getXMLHttpRequest();
??? req.onreadystatechange = setActiveContent;
??? sendGetDictate(req,"/manager/servlet/imageservlet?tag=ajaxuploadfilecheck&WARE_ID=609187669&nocache="+Math.random(),"name=111");
? }
然后需要編寫setActiveContent方法,例如
var count=0; //防止無限循環(huán),并且在頁面提交上傳得時候設(shè)置為0
function setActiveContent()
? {
??? if (req.readyState == 4) {
????? if (req.status == 200) {
??????? var rettext=req.responseText; //這里是servlet返回的內(nèi)容,檢查上傳得狀態(tài),可以在javabean或是servlet里面設(shè)置全局的靜態(tài)變量來表明上傳狀態(tài)
??????? if(rettext=="-1")
??????? {
????????? //停止循環(huán)
????????? alert("服務(wù)器更新錯誤");
??????? }
??????? else if(rettext=="0")
??????? {
????????? //繼續(xù)循環(huán)檢查
????????? if(count<6)
????????? {
??????????? setTimeout("checkupload()",500);
??????????? count++;
????????? }
????????? else
????????? {
??????????? alert("上傳失敗");
????????? }
??????? }
????????else if(rettext=="1")
??????? {
????????? alert("文件上傳成功");
??????? }
????? }
??? }
? }
?
基本流程就是這樣了,至于文字表現(xiàn)上傳過程還是進度條表現(xiàn),就看自己了