2009年5月9日
#
今天在做手機(jī)終端開發(fā)時(shí),發(fā)現(xiàn)連上域名服務(wù)器老是連不上,而直接用IP連接是OK的,初步懷凝是DNS問(wèn)題引起來(lái),經(jīng)查相關(guān)的資料,現(xiàn)記錄如下:
Android模擬器默認(rèn)的地址是10.0.2.3,默認(rèn)的DNS也是10.0.2.3,而一般電腦的IP都是192.168.1.100之類的,不在同一個(gè)網(wǎng)段。所以就會(huì)出現(xiàn)電腦可以上網(wǎng)但是模擬器不能上網(wǎng)的情況。其實(shí)設(shè)置方法很簡(jiǎn)單,只要把模擬器的默認(rèn)DNS設(shè)置成電腦的DNS地址即可。
第一步:用系統(tǒng)的命令進(jìn)入Android開發(fā)包的tools目錄
cd X:\...\android-sdk-windows\tool
第二布:使用adb的shell,確認(rèn)系統(tǒng)的各項(xiàng)屬性
adb shell
getprop
getprop會(huì)列出系統(tǒng)當(dāng)前的各項(xiàng)屬性
第三步:得到模擬器的DNS地址
在結(jié)果里可以看到:
[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]
第四步:把dns改成我們自己的DNS
setprop net.dns1 192.168.1.1
連接的URL串
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=vip1)(PORT
=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=vip2)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=
on))(CONNECT_DATA=(SERVICE_NAME=gs)))
啟動(dòng) lsnrctl start
狀態(tài) lsnrctl status
關(guān)閉 lsnrctl stop
導(dǎo)出命令:exp 用戶名/密碼@數(shù)據(jù)庫(kù) owner=用戶名 file=文件存儲(chǔ)路徑(如:F:\abcd.dmp)
測(cè)試截圖:exp ZM/sql123@ORCL owner=ZM file=F\abcd.dmp
出.png)
導(dǎo)入命令:imp 用戶名/密碼@數(shù)據(jù)庫(kù) fromuser=用戶名 touser=用戶名 file=d:\cu.dmp ignore=y
imp:命令類型
cu/mycu@db:導(dǎo)入的數(shù)據(jù)庫(kù)登陸(用戶名/密碼@數(shù)據(jù)庫(kù))
fromuser:文件的指定用戶
touser:指定導(dǎo)入到當(dāng)前登錄的數(shù)據(jù)庫(kù)某個(gè)用戶
file:需要導(dǎo)入的數(shù)據(jù)文件
ignore:是否忽略創(chuàng)建錯(cuò)誤
測(cè)試截圖:
imp ZM/sql123@ORCL fromuser=ZM touser=SZZM file=F:\test.dmp ignore=y
入.png)
linux環(huán)境下的rmi常見問(wèn)題
問(wèn)題一:RMI服務(wù)提供程序運(yùn)行在Windows操作系統(tǒng)下,RMI服務(wù)可以正常訪問(wèn),但將RMI服務(wù)提供程序部署到Linux操作系統(tǒng)下后,RMI服務(wù)無(wú)法訪問(wèn),提示
org.springframework.remoting.RemoteConnectFailureException:
Cannot connect to remote service [rmi://192.168.0.106:1199/ItemRetag]; nested exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; ……
解決辦法:在加載RMI服務(wù)之前將當(dāng)前服務(wù)器的IP指定給hostName,如 System.setProperty("java.rmi.server.hostname", "192.168.100.7");或者修改/etc/hosts文件,在這個(gè)文件中加 192.168.100.54 testlinux1 localhost.localdomain localhost 就行,或者將/etc/hosts文件中默認(rèn)的127.0.0.1改成當(dāng)前機(jī)器的IP即可!
問(wèn)題二:java.rmi.server.ExportException: internal error: ObjID already in use Caused by: java.rmi.server.ExportException: internal error: ObjID already in use……
出現(xiàn)這種問(wèn)題及有可能是/etc/hosts文件中指定的IP并不是當(dāng)前服務(wù)器的真實(shí)IP,RMI在初始化時(shí)注冊(cè)服務(wù)失敗。
通過(guò)System.out.println(InetAddress.getLocalHost().toString());查看當(dāng)前主機(jī)的IP是否為真實(shí)IP,如顯示為SIMBANK/220.250.64.24,而真實(shí)IP為192.168.1.2
解決辦法:修改/etc/hosts文件中錯(cuò)誤的IP即可,將:
220.250.64.24 SIMBANK
修改為
192.168.1.2 SIMBANK
JAVA中,通過(guò)分析Heapdump文件可以檢查程序是否存在內(nèi)存泄露,但是這個(gè)文件一般是在程序遇到致命問(wèn)題時(shí)才會(huì)產(chǎn)生,而如何事前生成這個(gè)文件,從而在程序尚末崩潰前找出問(wèn)題的所在。
以下記述了各個(gè)版本的JDK產(chǎn)生DUMP文件的方法:
UN JDK生成Heapdump文件只需要在tomcat啟動(dòng)腳本中增加 HeapDumpOnOutOfMemoryError 參數(shù)
此參數(shù)需要Java SE release 5.0 update 14 或以上支持
設(shè)置示例:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms512m -Xmx800m -XX:PermSize=64M -XX:MaxPermSize=128m -Djava.awt.headless=true -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpOnCtrlBreak
IBM JDK生成Heapdump文件的開關(guān):
— export IBM_HEAPDUMP=true
— export IBM_HEAP_DUMP=true
— export IBM_HEAPDUMP_OUTOFMEMORY=true
— export IBM_JAVADUMP_OUTOFMEMORY=true
— export IBM_JAVACORE_OUTOFMEMORY=true
— export IBM_HEAPDUMPDIR=<directory_path>
HP JDK生成Heapdump文件需要在在環(huán)境變量上,加上export _JAVA_HEAPDUMP=1
今天在做某項(xiàng)目的POC測(cè)試,甲方提供了一個(gè)三十萬(wàn)記錄的TXT數(shù)據(jù)文件,需要把該文件的記錄插入到數(shù)據(jù)庫(kù)中,由于項(xiàng)目部的同事在搭建測(cè)試環(huán)境中用的是Mysql數(shù)據(jù)庫(kù),在把數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中用的是JDBC的批處理。代碼如下

private void batchParseGroup()
{
Connection con= null;
PreparedStatement ps =null;

try
{
con= DbConnectionManager.getConnection();
con.setAutoCommit(false);
String sql = " insert into jivegroup(uri,groupname,pgroupid,description,creationdate,modificationdate,priority,selfpriority) values(?,?,?,?,?,?,?,?)";
ps= con.prepareStatement(sql);

for(int i=0;i<groupList.size();i++)
{
Group group = groupList.get(i);
ps.setString(1, group.getUri());
ps.setString(2, group.getName());
ps.setString(3, group.getPgroupId());
ps.setString(4, group.getName());
ps.setString(5, ""+System.currentTimeMillis());
ps.setString(6, ""+System.currentTimeMillis());
ps.setInt(7, group.getPriority());
ps.setInt(8, group.getPriority());
ps.addBatch();

if(i%100==0)
{
ps.executeBatch();
}
}
con.commit();
ps.executeBatch();

} catch (SQLException e)
{
e.printStackTrace();

}finally
{
DbConnectionManager.closeConnection(ps, con);
}
}在測(cè)試時(shí),發(fā)現(xiàn)三十萬(wàn)的數(shù)據(jù)居然需要十分鐘左右的時(shí)間。首先想到的就是Mysql的相關(guān)配置是不是有問(wèn)題,反復(fù)修改了Mysql的相應(yīng)配置參數(shù),收效甚微。
在Mysql的官網(wǎng)上查到如下:
http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html
關(guān)于rewriteBatchedStatements參數(shù),Mysql官方的說(shuō)明:
Should the driver use multiqueries (irregardless of the setting of "allowMultiQueries") as well as rewriting of prepared statements for INSERT into multi-value inserts when executeBatch() is called? Notice that this has the potential for SQL injection if using plain java.sql.Statements and your code doesn't sanitize input correctly. Notice that for prepared statements, server-side prepared statements can not currently take advantage of this rewrite option, and that if you don't specify stream lengths when using PreparedStatement.set*Stream(), the driver won't be able to determine the optimum number of parameters per batch and you might receive an error from the driver that the resultant packet is too large. Statement.getGeneratedKeys() for these rewritten statements only works when the entire batch includes INSERT statements.
解決辦法:
下載最新的JDBC的驅(qū)動(dòng)程序。
MYSQL URL的配置參數(shù)如下:
jdbc:mysql://54.200.190.80:3306/ccb_ucstar?rewriteBatchedStatements=true
經(jīng)過(guò)測(cè)試。三十多萬(wàn)的數(shù)據(jù)。70秒內(nèi)搞定!
今天在做項(xiàng)目中,供應(yīng)源提供了一小段的源代碼,但文件編碼格式是GBK的,而我公司建工程時(shí)統(tǒng)一用的UTF-8編碼,導(dǎo)進(jìn)來(lái)后出現(xiàn)亂碼。為了解決這一問(wèn)題,在網(wǎng)上查找了相關(guān)的資料,發(fā)現(xiàn)可以用 enca工具來(lái)進(jìn)行批量轉(zhuǎn)換
1)下載enca工具
wget http://dl.cihar.com/enca/enca-1.13.tar.gz2)
tar -zxvf enca-1.13.tar.gz3)./configure
4) make
5) make install
轉(zhuǎn)換命令
enca -L zh_CN -x UTF-8 *.java
如果sh目錄存在且腳本無(wú)誤,最可能是原因是在windows下寫的腳本是dos格式的,放在Linux下編碼不識(shí)別,解決方法是使用dos2unix命令轉(zhuǎn)一下,即輸入: dos2unix 文件名
畢業(yè)后,有人工作,有人繼續(xù)上學(xué),大家千萬(wàn)不要錯(cuò)過(guò)這篇文章,能看到這篇文章也是一種幸運(yùn),真的受益匪淺,對(duì)我有很大啟迪,這篇文章將會(huì)改變我的一生,真的太好了,希望與有緣人分享,也希望對(duì)有緣人有所幫助!這篇文章有點(diǎn)長(zhǎng),但是希望你能夠耐心的看完,看完之后有種“相見恨晚”的感覺,特別激動(dòng),希望大家好好的珍藏這篇文章,相信多年以后,再來(lái)看這篇文章,一定有不同的感覺。
正如”打工皇帝”唐駿說(shuō):”我覺得有兩種人不要跟別人爭(zhēng)利益和價(jià)值回報(bào)。第一種人就是剛剛進(jìn)入企業(yè)的人,頭5年千萬(wàn)不要說(shuō)你能不能多給我一點(diǎn)兒工資,最重要的是能在企業(yè)里學(xué)到什么,對(duì)發(fā)展是不是有利……”
人總是從平坦中獲得的教益少,從磨難中獲得的教益多;從平坦中獲得的教益淺,從磨難中獲得的教益深。一個(gè)人在年輕時(shí)經(jīng)歷磨難,如能正確視之,沖出黑暗,那就是一個(gè)值得敬慕的人。最要緊的是先練好內(nèi)功,畢業(yè)后這5年就是練內(nèi)功的最佳時(shí)期,練好內(nèi)功,才有可能在未來(lái)攀得更高。
出路在哪里?出路在于思路!
其實(shí),沒(méi)有錢、沒(méi)有經(jīng)驗(yàn)、沒(méi)有閱歷、沒(méi)有社會(huì)關(guān)系,這些都不可怕。沒(méi)有錢,可以通過(guò)辛勤勞動(dòng)去賺;沒(méi)有經(jīng)驗(yàn),可以通過(guò)實(shí)踐操作去總結(jié);沒(méi)有閱歷,可以一步一步去積累;沒(méi)有社會(huì)關(guān)系,可以一點(diǎn)一點(diǎn)去編織。但是,沒(méi)有夢(mèng)想、沒(méi)有思路才是最可怕的,才讓人感到恐懼,很想逃避!
人必須有一個(gè)正確的方向。無(wú)論你多么意氣風(fēng)發(fā),無(wú)論你是多么足智多謀,無(wú)論你花費(fèi)了多大的心血,如果沒(méi)有一個(gè)明確的方向,就會(huì)過(guò)得很茫然,漸漸就喪失了斗志,忘卻了最初的夢(mèng)想,就會(huì)走上彎路甚至不歸路,枉費(fèi)了自己的聰明才智,誤了自己的青春年華。
荷馬史詩(shī)《奧德賽》中有一句至理名言:”沒(méi)有比漫無(wú)目的地徘徊更令人無(wú)法忍受的了。”畢業(yè)后這5年里的迷茫,會(huì)造成10年后的恐慌,20年后的掙扎,甚至一輩子的平庸。如果不能在畢業(yè)這5年盡快沖出困惑、走出迷霧,我們實(shí)在是無(wú)顏面對(duì)10年后、20年后的自己。畢業(yè)這5年里,我們既有很多的不確定,也有很多的可能性。
畢業(yè)這5年里,我們既有很多的待定,也有很多的決定。
迷茫與困惑誰(shuí)都會(huì)經(jīng)歷,恐懼與逃避誰(shuí)都曾經(jīng)有過(guò),但不要把迷茫與困惑當(dāng)作可以自我放棄、甘于平庸的借口,更不要成為自怨自艾、祭奠失意的苦酒。生命需要自己去承擔(dān),命運(yùn)更需要自己去把握。在畢業(yè)這5年里,越早找到方向,越早走出困惑,就越容易在人生道路上取得成就、創(chuàng)造精彩。無(wú)頭蒼蠅找不到方向,才會(huì)四處碰壁;一個(gè)人找不到出路,才會(huì)迷茫、恐懼。
生活中,面對(duì)困境,我們常常會(huì)有走投無(wú)路的感覺。不要?dú)怵H,堅(jiān)持下去,要相信年輕的人生沒(méi)有絕路,困境在前方,希望在拐角。只要我們有了正確的思路,就一定能少走彎路,找到出路!
成功的人不是贏在起點(diǎn),而是贏在轉(zhuǎn)折點(diǎn)。
不少剛剛畢業(yè)的年輕人,總是奢望馬上就能找到自己理想中的工作。然而,很多好工作是無(wú)法等來(lái)的,你必須選擇一份工作作為歷練。職業(yè)旅程中的第一份工作,無(wú)疑是踏入社會(huì)這所大學(xué)的起點(diǎn)。也許你找了一份差強(qiáng)人意的工作,那么從這里出發(fā),好好地沉淀自己,從這份工作中汲取到有價(jià)值的營(yíng)養(yǎng),厚積薄發(fā)。千里之行,始于足下,只要出發(fā),就有希望到達(dá)終點(diǎn)。
起點(diǎn)可以相同,但是選擇了不同的拐點(diǎn),終點(diǎn)就會(huì)大大不同!
畢業(yè)這幾年,我們的生活、感情、職業(yè)等都存在很多不確定的因素,未來(lái)也充滿了各種可能。這個(gè)時(shí)候,必須學(xué)會(huì)選擇,懂得放棄,給自己一個(gè)明確的定位,使自己穩(wěn)定下來(lái)。如果你不主動(dòng)定位,就會(huì)被別人和社會(huì)”定型”!
可以這么說(shuō):一個(gè)人在畢業(yè)這5年培養(yǎng)起來(lái)的行為習(xí)慣,將決定他一生的高度。我們能否成功,在某種程度上取決于自己對(duì)自己的評(píng)價(jià),這就是定位。你給自己定位是什么,你就是什么。定位能決定人生,定位能改變命運(yùn)。丑小鴨變成白天鵝,只要一雙翅膀;灰姑娘變成美公主,只要一雙水晶鞋。
人的命,三分天注定,七分靠打拼,有夢(mèng)就”會(huì)紅”,愛拼才會(huì)贏。只要不把自己束縛在心靈的牢籠里,誰(shuí)也束縛不了你去展翅高飛。
現(xiàn)實(shí)情況遠(yuǎn)非他們所想的那樣。于是,當(dāng)優(yōu)越感逐漸轉(zhuǎn)為失落感甚至挫敗感時(shí),當(dāng)由堅(jiān)信自己是一塊”金子”到懷疑自己是一粒”沙子”時(shí),憤怒、迷茫、自卑就開始與日俱增。
其實(shí),應(yīng)該仔細(xì)掂量一下自己,你是否真是金子?是真金,手中要有絕活,才能上要有過(guò)人之處才行。一句話:真金是要靠實(shí)力來(lái)證明的,只有先把自己的本領(lǐng)修煉好了,才有資格考慮伯樂(lè)的事情
每顆珍珠原本都是一粒沙子,但并不是每一粒沙子都能成為一顆珍珠。
想要卓爾不群,就要有鶴立雞群的資本。忍受不了打擊和挫折,承受不住忽視和平淡,就很難達(dá)到輝煌。年輕人要想讓自己得到重用,取得成功,就必須把自己從一粒沙子變成一顆價(jià)值連城的珍珠。
天有下雨與日出,人生高峰與低谷。
莫為浮云遮望眼,風(fēng)物長(zhǎng)宜放眼量。
只要拂去陰霾,就能亮出朗朗晴空。如果你在工作上有些不如意,要相信自己不會(huì)一直處于人生的低谷期,總有一天能沖破重重云層。告訴自己:我并沒(méi)有失敗,只是暫時(shí)沒(méi)有成功!只要在內(nèi)心點(diǎn)亮一盞希望之燈,一定能驅(qū)散黑暗中的陰霾,迎來(lái)光明。
的確,論資歷,他們是不折不扣的職場(chǎng)菜鳥,業(yè)務(wù)涉及不深,人脈一窮二白,在工作中經(jīng)常碰壁。他們的壓力并不一定都像千鈞大石,而是像大雨來(lái)臨前的天色,灰色低沉,明明有空間,卻被灰色填滿每個(gè)縫隙,只能等待大雨傾盆之后的晴空。
”起得比雞早,睡得比狗晚,干得比驢多,吃得比豬差。”這是很多剛剛畢業(yè)的人喜歡用來(lái)調(diào)侃自己生活狀態(tài)的話。雖然有點(diǎn)兒夸張,但是,他們中的很多人的確一直都被灰色心情所籠罩–心里永遠(yuǎn)是多云轉(zhuǎn)陰。記得有位哲人曾說(shuō):”我們的痛苦不是問(wèn)題本身帶來(lái)的,而是我們對(duì)這些問(wèn)題的看法產(chǎn)生的。”換個(gè)角度看人生,是一種突破、一種解脫、一種超越、一種高層次的淡泊與寧?kù)o,從而獲得自由自在的快樂(lè)。
一位哲人說(shuō):”人生就是一連串的抉擇,每個(gè)人的前途與命運(yùn),完全把握在自己手中,只要努力,終會(huì)有成。”就業(yè)也好,擇業(yè)也罷,創(chuàng)業(yè)亦如此,只要奮發(fā)努力,都會(huì)成功。你是不是準(zhǔn)備把生命的承諾全部都交給別人?
畢業(yè)后這5年,是改變自己命運(yùn)的黃金時(shí)期。在最能決定自己命運(yùn)時(shí),如果還不把握,那你還要等到什么時(shí)候呢?我的人生我做主,命運(yùn)由己不由人。
不要活在別人的嘴里,不要活在別人的眼里,而是把命運(yùn)握在自己手里。
別說(shuō)你沒(méi)有背景,自己就是最大的背景。美國(guó)作家杰克·凱魯亞克說(shuō)過(guò)一句話:”我還年輕,我渴望上路。”在人生的旅途中,我們永遠(yuǎn)都是年輕人,每天都應(yīng)該滿懷渴望。每個(gè)人的潛能都是無(wú)限的,關(guān)鍵是要發(fā)現(xiàn)自己的潛能和正確認(rèn)識(shí)自己的才能,并找到一個(gè)能充分發(fā)揮潛能的舞臺(tái),而不能只為舞臺(tái)的不合適感到不快。要客觀公正地看待自己的能力,結(jié)合自己的實(shí)際情況和愛好冷靜選擇,盡可能到最需要自己、最適合自己的地方。
在人力資源管理界,特別流行一個(gè)說(shuō)法,即”騎馬,牽牛,趕豬,打狗”理論:人品很好,能力又很強(qiáng)的,是千里馬,我們要騎著他;人品很好但能力普通的,是老黃牛,我們要牽著他;人品、能力皆普通的,就是”豬”,我們要趕走他;人品很差能力很強(qiáng)的,那是”狗”,我們要打擊他。
我想,剛剛畢業(yè)幾年的你,一樣胸懷大志,一樣想成為一匹被人賞識(shí)、馳騁沙場(chǎng)的千里馬吧?那么,就好好沉淀下來(lái)。低就一層不等于低人一等,今日的俯低是為了明天的高就。所謂生命的價(jià)值,就是我們的存在對(duì)別人有價(jià)值。能被人利用是一件好事,無(wú)人問(wèn)津才是真正的悲哀!
能干工作、干好工作是職場(chǎng)生存的基本保障。
任何人做工作的前提條件都是他的能力能夠勝任這項(xiàng)工作。能干是合格員工最基本的標(biāo)準(zhǔn),肯干則是一種態(tài)度。一個(gè)職位有很多人都能勝任,都有干好這份工作的基本能力,然而,能否把工作做得更好一些,就要看是否具有踏實(shí)肯干、苦于鉆研的工作態(tài)度了。
在能干的基礎(chǔ)上踏實(shí)肯干。
工作中,活干得比別人多,你覺得吃虧;錢拿得比別人少,你覺得吃虧;經(jīng)常加班加點(diǎn),你覺得吃虧……其實(shí),沒(méi)必要這樣計(jì)較,吃虧不是災(zāi)難,不是失敗,吃虧也是一種生活哲學(xué)?,F(xiàn)在吃點(diǎn)兒小虧,為成功鋪就道路,也許在未來(lái)的某個(gè)時(shí)刻,你的大福突然就來(lái)了。
能吃虧是做人的一種境界,是處世的一種睿智。
在工作中并不是多做事或多幫別人干點(diǎn)兒活就是吃虧。如果領(lǐng)導(dǎo)讓你加加班、趕趕任務(wù),別以為自己吃了大虧,反而應(yīng)該感到慶幸,因?yàn)轭I(lǐng)導(dǎo)只叫了你,而沒(méi)叫其他人,說(shuō)明他信任你、賞識(shí)你。吃虧是一種貢獻(xiàn),你貢獻(xiàn)得越多,得到的回報(bào)也就越多。樂(lè)于加班,就是這樣的一種吃虧。
舍得舍得,有舍才有得;學(xué)會(huì)在適當(dāng)時(shí)吃些虧的人絕對(duì)不是弱智,而是大智。
給別人留余地就是給自己留余地,予人方便就是予己方便,善待別人就是善待自己。
傻人有傻福,因?yàn)樯等藳](méi)有心計(jì)。和這樣的人在一起,身心放松,沒(méi)有太多警惕,就能相互靠近。傻在很多時(shí)候意味著執(zhí)著和忠貞,也意味著寬厚和誠(chéng)實(shí),讓人不知不覺站到他一邊。傻人無(wú)意中得到的,比聰明人費(fèi)盡心機(jī)得到的還多。畢業(yè)這幾年,你的天空中只飄著幾片雪花,這樣你就滿足了嗎?成功需要堅(jiān)持與積累,與其專注于搜集雪花,不如省下力氣去滾雪球。巴菲特說(shuō):”人生就像滾雪球,最重要的是發(fā)現(xiàn)很濕的雪和很長(zhǎng)的坡。”讓自己沉淀下來(lái),學(xué)著發(fā)現(xiàn)”很濕的雪”,努力尋找”很長(zhǎng)的坡”。記?。荷⒙涞难┗〞?huì)很快融化,化為烏有,只有雪球才更實(shí)在,才能長(zhǎng)久。
在畢業(yè)這幾年里,你要是能做到比別人多付出一分努力,就意味著比別人多積累一分資本,就比別人多一次成功的機(jī)會(huì)。
什么是職業(yè)化呢?職業(yè)化就是工作狀態(tài)的標(biāo)準(zhǔn)化、規(guī)范化、制度化,即在合適的時(shí)間、合適的地點(diǎn)用合適的方式說(shuō)合適的話、做合適的事,使知識(shí)、技能、觀念、思維、態(tài)度、心理等符合職業(yè)規(guī)范和標(biāo)準(zhǔn)。”在每個(gè)行業(yè)里,都有很多出色的人才,他們之所以能存在,是因?yàn)楸葎e人更努力、更智慧、更成熟。但是,最重要的是,他們比一般人更加職業(yè)化!這就是為什么我現(xiàn)在能當(dāng)你老板的原因。一個(gè)人僅僅專業(yè)化是不夠的,只有職業(yè)化的人才能飛在別人前面,讓人難以超越!”不要以為我們現(xiàn)在已經(jīng)生存得很安穩(wěn)了。對(duì)于畢業(yè)5年的人來(lái)講,一定要認(rèn)清即將面臨的五大挑戰(zhàn)。
一、贍養(yǎng)父母。
二、結(jié)婚生子。
三、升職加薪。
四、工作壓力。
五、生活質(zhì)量。
有的人為生存而雀躍,目光總是停在身后,三天打魚兩天曬網(wǎng),有始無(wú)終。
有的人為發(fā)展而奮斗,目光總是盯在正前方,每天進(jìn)步一點(diǎn)點(diǎn),堅(jiān)持不懈。
畢業(yè)這幾年,不能沒(méi)有追求和探索,不能沒(méi)有理想和目標(biāo)。人生如逆水行舟,不進(jìn)則退。甘于現(xiàn)狀的生活就是不再前行的船,再也無(wú)法追上時(shí)代前進(jìn)的步伐。一定要抓緊每一秒鐘的時(shí)間來(lái)學(xué)習(xí),要明白學(xué)習(xí)不是學(xué)生的專利。小聰明的人最得意的是:自己做過(guò)什么?大智慧的人最渴望的是:自己還要做什么?
小聰明是戰(zhàn)術(shù),大智慧是戰(zhàn)略;小聰明看到的是芝麻,大智慧看到的是西瓜。
在這個(gè)世界上,既有大人物,也有小角色,大人物有大人物的活法,小人物有小人物的瀟灑,每個(gè)人都有自己的生活方式,誰(shuí)也勉強(qiáng)不了誰(shuí)。但是,小聰明只能有小成績(jī)和小視野,大智慧才能有大成就和大境界。小企業(yè)看老板,中企業(yè)看制度,大企業(yè)看文化。
小公司與大企業(yè)都有生存之道,沒(méi)有好壞之分,但對(duì)一個(gè)人不同階段的影響會(huì)不同。
小公司肯定想要發(fā)展為大企業(yè),這是一種目標(biāo),年輕人也要給自己的職業(yè)生涯制定目標(biāo)。畢業(yè)幾年的你,是否經(jīng)常會(huì)怯場(chǎng)或者是感到?jīng)]有底氣?居安思危絕對(duì)不是危言聳聽!此刻打盹,你將做夢(mèng);此刻學(xué)習(xí),你將圓夢(mèng)。在競(jìng)爭(zhēng)激烈的人生戰(zhàn)場(chǎng)上,打盹的都是輸家!
每個(gè)人在年輕的時(shí)候似乎都豪情萬(wàn)丈,什么都不怕,可是隨著年齡的增長(zhǎng),每天想著房子、工作、養(yǎng)家糊口這些俗事兒,再也沒(méi)有年輕時(shí)那種敢于”上天探星、下海撈月”的勇氣了。是我們改變了生活,還是生活改變了我們?我們的思想越來(lái)越復(fù)雜,因?yàn)橛辛嗽絹?lái)越多的舍不得、越來(lái)越多的顧慮,我們總是在徘徊、總是在猶豫。畢業(yè)開始一兩年,生活的重?fù)?dān)會(huì)壓得我們喘不過(guò)氣來(lái),挫折和障礙堵住四面八方的通口,我們往往在壓迫得自己發(fā)揮出潛能后,才能殺出重圍,找到出路??墒莾扇旰?,身上的重?fù)?dān)開始減輕,工作開始一帆風(fēng)順,我們就松懈了下來(lái),漸漸忘記了潛在的危險(xiǎn)。直到有一天危機(jī)突然降臨,我們?cè)谑肿銦o(wú)措中被擊敗……畢業(yè)這幾年,仍然處于危險(xiǎn)期,一定要有居安思危的意識(shí),好好打拼,這樣才能有一個(gè)真正的安全人生!
生于憂患,死于安樂(lè)。如果你想跨越自己目前的成就,就不能畫地自限,而是要勇于接受挑戰(zhàn)。對(duì)畏畏縮縮的人來(lái)說(shuō),真正的危險(xiǎn)正在于不敢冒險(xiǎn)!
年輕人在社會(huì)的重壓下,適應(yīng)能力已變得越來(lái)越強(qiáng),只是他們不自覺地習(xí)慣被環(huán)境推著走。他們不敢冒險(xiǎn),怕給自己帶來(lái)終身的遺憾,于是告慰自己:”我對(duì)得起自己、對(duì)得起家人,因?yàn)槲乙呀弑M全力。”其實(shí),人只有不斷挑戰(zhàn)和突破才能逐漸成長(zhǎng)。長(zhǎng)期固守于已有的安全感中,就會(huì)像溫水里的青蛙一樣,最終失去跳躍的本能。
經(jīng)歷了這幾年社會(huì)生活,你應(yīng)該明白:這個(gè)世界上有富也有貧,有陰也有亮,有丑也有美,到底看到什么,取決于自己是積極還是消極。在年輕時(shí)學(xué)會(huì)勤勉地工作,用一種光明的思維對(duì)待生活,那么,只要張開手掌,你就會(huì)發(fā)現(xiàn),里面有一片燦爛的人生。
把感恩刻在石頭上,深深地感謝別人幫助過(guò)你,永遠(yuǎn)銘記,這是人生應(yīng)有的一種境界;把仇恨寫在沙灘上,淡淡忘掉別人傷害過(guò)你,學(xué)會(huì)寬容,讓所有的怨恨隨著潮水一去不復(fù)返,這也是一種人生境界。
學(xué)會(huì)倒出水,才能裝下更多的水。從畢業(yè)那天開始,學(xué)會(huì)把每天都當(dāng)成一個(gè)新的起點(diǎn),每一次工作都從零開始。如果你懂得把”歸零”當(dāng)成一種生活的常態(tài),當(dāng)成一種優(yōu)秀的延續(xù),當(dāng)成一種時(shí)刻要做的事情,那么,經(jīng)過(guò)短短幾年,你就可以完成自己職業(yè)生涯的正確規(guī)劃與全面超越。
在職業(yè)起步的短短道路上,想要得到更好、更快、更有益的成長(zhǎng),就必須以歸零思維來(lái)面對(duì)這個(gè)世界。不要以大學(xué)里的清高來(lái)標(biāo)榜自己,不要覺得自己特別優(yōu)秀,而是要把自己的姿態(tài)放下,把自己的身架放低,讓自己沉淀下來(lái),抱著學(xué)習(xí)的態(tài)度去適應(yīng)環(huán)境、接受挑戰(zhàn)。放下”身段”才能提高身價(jià),暫時(shí)的俯低終會(huì)促成未來(lái)的高就。
年輕人從校園或者從一個(gè)環(huán)境進(jìn)入一個(gè)新環(huán)境,就要勇于將原來(lái)環(huán)境里熟悉、習(xí)慣、喜歡的東西放下,然后從零開始。我們想在職場(chǎng)上獲得成功,首先就要培養(yǎng)適應(yīng)力。從自然人轉(zhuǎn)化為單位人是融入職場(chǎng)的基本條件。一個(gè)人起點(diǎn)低并不可怕,怕的是境界低。越計(jì)較自我,便越?jīng)]有發(fā)展前景;相反,越是主動(dòng)付出,那么他就越會(huì)快速發(fā)展。很多今天取得一定成就的人,在職業(yè)生涯的初期都是從零開始,把自己沉淀再沉淀、倒空再倒空、歸零再歸零,正因?yàn)檫@樣,他們的人生才一路高歌,一路飛揚(yáng)。
在畢業(yè)這幾年里,我們要讓過(guò)去歸零,才不會(huì)成為職場(chǎng)上那只背著重殼爬行的蝸牛,才能像天空中的鳥兒那樣輕盈地飛翔。請(qǐng)好好品味一下杰克·韋爾奇說(shuō)過(guò)的一句話:”糾正自己的行為,認(rèn)清自己,從零開始,你將重新走上職場(chǎng)坦途。” 吐故才能納新,心靜才能身涼,有舍才能有得,杯空才能水滿,放下才能超越。
歸零思維五大表現(xiàn):心中無(wú)我,眼中無(wú)錢,念中無(wú)他,朝中無(wú)人,學(xué)無(wú)止境。
年輕人難免帶著幾分傲氣,認(rèn)為自己無(wú)所不能、所向披靡,其實(shí)不然,初入職場(chǎng)的新人還是個(gè)”嬰兒”,正處在從爬到走的成長(zhǎng)階段。在畢業(yè)這幾年里,一定要讓自己逐步培養(yǎng)起學(xué)徒思維、海綿思維、空杯思維,具有這樣思維的人心靈總是敞開的,能隨時(shí)接受啟示和一切能激發(fā)靈感的東西,他們時(shí)刻都能感受到成功女神的召喚。
JavaScrip 中String 與XML 互相轉(zhuǎn)換的函數(shù)小記
function convert_string_to_xml(strXML)
{
if (window.ActiveXObject) {
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(strXML);
return xmlDoc;
} else {
parser=new DOMParser();
xmlDoc=parser.parseFromString(strXML,"text/xml");
return xmlDoc;
}
}
function convert_xml_to_string(xmlObject)
{
if (window.ActiveXObject) { // for IE
return xmlObject.xml;
} else {
return (new XMLSerializer()).serializeToString(xmlObject);
}
}
摘要: JBOSS 下如何配置C3P0的連接池(解決Mysql 8小時(shí)的問(wèn)題)
問(wèn)題引起:
在公司配置文檔管理系統(tǒng)(OPENKM)時(shí),把數(shù)據(jù)源切換到Mysql數(shù)據(jù)源下,經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)經(jīng)過(guò)8小時(shí)后,數(shù)據(jù)庫(kù)連接自動(dòng)斷開。
解決辦法:
把原來(lái)的openkm-ds.xml刪除掉。原openkm-ds.xml的內(nèi)容如下:
...
閱讀全文
一、系統(tǒng)環(huán)境
操作系統(tǒng): RedHat Enterprise Linux 5
二、安裝JDK
1. 從java.sun.com下載最新的J2SE 1.5:jdk-1_5_0_17-linux-i586-rpm.bin
下載地址:
http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-1_5_0_17-linux-i586-rpm.bin?BundledLineItemUUID=QZlIBe.mUMYAAAEevV9SRJFA&OrderID=V_dIBe.mwxAAAAEeoV9SRJFA&ProductID=UEdIBe.omzcAAAEdklhGb7Xo&FileName=/jdk-1_5_0_17-linux-i586-rpm.bin
2. 將JDK安裝文件jdk-1_5_0_17-linux-i586-rpm.bin拷貝到Redhat任意目錄下。例如:/opt/jdk(目錄jdk需要手動(dòng)新建)
3. 執(zhí)行 #chmod +x jdk-1_5_0_17-linux-i586-rpm.bin
4. 執(zhí)行 ./jdk-1_5_0_17-linux-i586-rpm.bin
此時(shí)會(huì)出現(xiàn)JDK安裝授權(quán)協(xié)議??梢砸宦钒碋nter瀏覽。如果等的不耐煩可以直接按Ctrl+C,直接會(huì)出現(xiàn)Do you agree to the above license terms? [yes or no]的字樣。
5. 鍵入yes,同意該授權(quán)協(xié)議。
此時(shí)系統(tǒng)會(huì)開始解壓jdk-1_5_0_17-linux-i586-rpm.bin
6. 解壓完畢后,回到/opt/jdk目錄,鍵入dir。會(huì)發(fā)現(xiàn)多出了一個(gè)解壓好的安裝文件:jdk-1_5_0_17-linux-i586.rpm
7. 執(zhí)行 rpm -ivh jdk-1_5_0_17-linux-i586.rpm
此時(shí),系統(tǒng)會(huì)開始安裝JDK。安裝結(jié)束后可以在/usr目錄下發(fā)現(xiàn)新增了一個(gè)名為java的文件夾。該文件夾就是安裝好的JDK目錄。
8. 設(shè)置環(huán)境變量
a. 進(jìn)入/etc文件夾(具體操作命令忽略),找到文件profile并打開。
[注意:profile是指文件不是指文件夾]
b. 找到export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC,在該語(yǔ)句的上面添加以下語(yǔ)句:
export JAVA_HOME="/usr/java/jdk1.5.0_17"
[注意:“=”兩側(cè)不能有空格]
export CLASSPATH="/usr/java/jdk1.5.0_17/lib:/usr/java/jdk1.5.0_17/jre/lib"
[注意:“=”兩側(cè)不能有空格;“:”是冒號(hào),同樣不要有空格出現(xiàn)]
pathmunge /usr/java/jdk1.5.0_17/bin:/usr/java/jdk1.5.0_17/jre/bin
[注意:無(wú)引號(hào)]
9. 設(shè)置完畢后,保存文件。重啟Redhat后登錄控制終端,鍵入:java -version;
如果出現(xiàn)java version “1.5.0.17”等字樣,說(shuō)明您的JDK已經(jīng)安裝成功了!祝賀你!
Jetty啟動(dòng)后,如果修改javascript文件,將不能保存,使調(diào)試很麻煩。這是因?yàn)槭褂昧薈ACHE,JETTY說(shuō)是WINDOWS下的一個(gè)限制??梢酝ㄟ^(guò)如下方法修正:
解壓出jetty.jar中的org/mortbay/jetty/webapp/webdefault.xml文件,將這一選項(xiàng)由true改為false,另存到src/main/resources目錄,或者其它自選目錄。
<init-param>
<param-name>useFileMappedBuffer</param-name>
<param-value>true</param-value> <!-- change to false -->
</init-param>
把修改后的webdefault.xml文件跟pom.xml放在一起
修改pom.xml里的Jetty Plugin的配置,加入webdefault.xml
...
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<contextPath>/</contextPath>
<webDefaultXml>webdefault.xml</webDefaultXml>
...
</configuration>
...
</plugin>
...
附。。。在項(xiàng)目中用到的Jetty用Java代碼Call Jetty啟動(dòng)的方法
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.webapp.WebAppContext;
public class JettyStarter {
public JettyStarter() {
}
public static void main(String[] args) {
try {
Server server = new Server();
Connector connector = new SelectChannelConnector();
connector.setPort(9999);
server.setConnectors(new Connector[] { connector });
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setResourceBase("./src/main/webapp");
webapp.setDefaultsDescriptor("./webdefault.xml");
server.setHandler(webapp);
server.start();
server.join();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Openfire 是由Jive Software 主導(dǎo)開發(fā)的一套功能非常強(qiáng)大的開源im 服務(wù)器(前身是
wildfire),它基于XMPP 協(xié)議,完全用java實(shí)現(xiàn),是一款非常優(yōu)秀的服務(wù)器端軟件。
一. 安裝JDK(我使用的是JDK1.6), 不再詳述
二. 安裝 Eclipse 5.5(不再詳述)
三. 安裝Subversive插件
Subversive是一款不錯(cuò)的svn插件,具體安裝方法請(qǐng)參看我的另一篇文章《Eclipse中
安裝svn插件Subversive 》,鏈接
http://blog.csdn.net/zhenyucheung/archive/2008/03/19/2195518.aspx
四. check out openfire 源碼
1. 在eclipse中點(diǎn)擊Windows->Open Perspective->Other
2. 在彈出窗口中點(diǎn)擊SVN Repository Exploring 然后點(diǎn)OK
3. 在SVN Repositories 點(diǎn)右鍵,選擇 New->Repository Location...
4. 在彈出的New Repository Location頁(yè)面,將
http://svn.igniterealtime.org/svn/repos輸入U(xiǎn)RL文本框,點(diǎn)Finish. 你將會(huì)看到頁(yè)面出
現(xiàn)URL地址.
5. 展開URL地址
6. 展開openfire樹形結(jié)構(gòu)
7. 在trunk上點(diǎn)擊右鍵,選擇Check Out
剩下的就是等待check out完成了 :)
五. 創(chuàng)建openfire工程
對(duì)使用過(guò)eclipse的人來(lái)說(shuō),這一步不用多說(shuō),這里僅列出幾個(gè)需要注意的地方.
1. check out完畢后,eclipse會(huì)自動(dòng)創(chuàng)建一個(gè)openfire工程,請(qǐng)把它刪除(注意刪除時(shí)
不要?jiǎng)h除content),否則你將不得不手動(dòng)配置一些開發(fā)環(huán)境。
2. 用Create project from existing source新建工程,注意工程名要用openfire。
-----------------
若自己創(chuàng)建工程:
五.創(chuàng)建Java項(xiàng)目,將源代碼導(dǎo)入此項(xiàng)目中。在Eclipse中將此Java文件夾當(dāng)成源代碼文件夾
新建工程。庫(kù)都在Build目錄的lib目錄下,將openfire用到的庫(kù)都添加到這個(gè)新建工程的
Referenced Libraries中。
六. Build openfire
openfire是用ant構(gòu)建的,所以要先設(shè)置使得eclipse中每次編譯都使用內(nèi)置的ant工具,
保證編譯的正確執(zhí)行。
1. eclipse中點(diǎn)擊Window->Show View->Ant
2. 在Ant 頁(yè)面點(diǎn)右鍵,選擇 Add Buildfiles...
3. 展開openfire/build文件夾,選擇build.xml, 點(diǎn) OK.
4. 在Ant頁(yè)面, 展開Openfire XMPP Server,雙擊 openfire ant 任務(wù)
七. 創(chuàng)建項(xiàng)目Builder
1. 點(diǎn)擊Run->Open Run Dialog...
2. 選擇Java Application,點(diǎn)擊 New 按鈕
3. 在Run窗口的Main選項(xiàng)卡中, 修改Name文本框中的值,改成Openfire,其他名字亦可
4. 點(diǎn)Browse按鈕,選擇openfire, 點(diǎn)ok
5. 點(diǎn)Search按鈕,選擇Main class為
org.jivesoftware.openfire.starter.ServerStarter,點(diǎn)OK。(這是openfire的啟動(dòng)類)
6. 點(diǎn)擊進(jìn)入Arguments選項(xiàng)卡
7. 在VM arguments文本框中輸入 -
DopenfireHome="${workspace_loc:openfire}/target/openfire",這個(gè)是用于eclipse執(zhí)行
java命令時(shí)傳遞的參數(shù),這樣openfire程序可以通過(guò)System.getProperty(“openfireHome”)得到
openfire的本地位置。
8. 點(diǎn)擊進(jìn)入Classpath選項(xiàng)卡
9. 點(diǎn)選User Entries,這樣Advanced...就處于可用狀態(tài)
10. 點(diǎn)擊Advanced...按鈕
11. 在Advanced Options頁(yè)面,選擇Add Folders, 點(diǎn)ok.
12. 選擇openfire\src\i18n, 點(diǎn)ok將這個(gè)文件夾加入到class path,同樣的方式把
openfire\src\resources\jar也加到class path中。
13. 在Common選項(xiàng)卡中,點(diǎn)選Run復(fù)選框。
設(shè)置完畢,這樣以后在run這個(gè)工程的時(shí)候就會(huì)按照正確的配置進(jìn)行了。
當(dāng)Maven項(xiàng)目很大,或者你運(yùn)行諸如 mvn site 這樣的命令的時(shí)候,maven運(yùn)行需要很大的內(nèi)存,在默認(rèn)配置下,就可能遇到j(luò)ava的堆溢出。如:
[INFO] Building jar: /home/dl9pf/svn/mindquarry/mindquarry-jcr/mindquarry-jcr-changes/target/mindquarry-migration-with-dependencies.jar
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Java heap space
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:99)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:518)
...
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7 minutes 14 seconds
[INFO] Finished at: Wed Sep 05 07:44:55 CEST 2007
[INFO] Final Memory: 37M/63M
[INFO] ------------------------------------------------------------------------
解決的方法是調(diào)整java的堆大小的值。
Windows環(huán)境中
找到文件%M2_HOME%\bin\mvn.bat ,這就是啟動(dòng)Maven的腳本文件,在該文件中你能看到有一行注釋為:
@REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE...
它的意思是你可以設(shè)置一些Maven參數(shù),我們就在注釋下面加入一行:
set MAVEN_OPTS= -Xms128m -Xmx512m
之后,當(dāng)你運(yùn)行Maven命令如 mvn -version 的時(shí)候,你會(huì)看到如下的輸出:
E:\test>mvn -version
E:\test>set MAVEN_OPTS= -Xms128m -Xmx512m
Maven version: 2.0.9
Java version: 1.6.0_07
OS name: "windows 2003" version: "5.2" arch: "x86" Family: "windows"
我們看到,配置的Maven選項(xiàng)生效了,OutOfMemoryError也能得以相應(yīng)的解決。
Linux環(huán)境中
也可以通過(guò)設(shè)置環(huán)境變量解決該問(wèn)題, 如,編輯文件 /etc/profile 如下
MAVEN_OPTS=-Xmx512m
export JAVA_HOME MAVEN_HOME MAVEN_OPTS JAVA_BIN PATH CLASSPATH
如果你使用Hudson
用 Hudson + Maven做持續(xù)集成,并不幸也遇到了類似的錯(cuò)誤,那么上述兩種方式都將不再起作用了,因?yàn)镠udson使用自己的maven-agent來(lái)啟動(dòng)Maven,不會(huì)去調(diào)用Maven的腳本,自然相應(yīng)的配置也就無(wú)效了。
好在Hudson也給為我們提供了配置點(diǎn),在Hudson的項(xiàng)目配置頁(yè)面中,有一塊Build區(qū)域,這里我們已經(jīng)設(shè)置了Root Pom和Goals。注意該區(qū)域的右下角有一個(gè)"Advanced..."按鈕,點(diǎn)擊會(huì)看到MAVEN_OPTS輸入框,這里輸入"-Xmx512m"就OK了。
m2eclipse中
類似以上的方法都會(huì)失效,所幸m2eclipse提供了配置點(diǎn)。步驟如下:
項(xiàng)目上右擊 -> Run As -> Run Configurations -> Maven Build 上右擊 -> New
這時(shí)會(huì)看到一個(gè)maven運(yùn)行配置對(duì)話框,這里面其它的配置我不多解釋了,為了解決內(nèi)存溢出的問(wèn)題,我們可以選擇第二個(gè)TAB: JRE,然后在VM arguments中輸入配置如:-Xms128m -Xmx512m。
在<Script>標(biāo)簽里設(shè)置一個(gè) charset
例如:
<link type="text/css" rel="stylesheet" href="http://020sun.3322.org/hxair/style.css" charset="gb2312" />
<script type="text/javascript" src="http://020sun.3322.org/hxair/js/command.js" charset="gb2312"></script>
為一個(gè)接口提供缺省實(shí)現(xiàn),這樣子類可以從這個(gè)缺省實(shí)現(xiàn)進(jìn)行擴(kuò)展.而不必從原有接口進(jìn)行擴(kuò)展.作為適配器模式的一個(gè)特例,缺省適配模式在java語(yǔ)言中有著特殊的應(yīng)用.(引用java模式書)
adapter是一個(gè)非常常用的設(shè)計(jì)模式.
像windows的每個(gè)窗口,事件很多個(gè).關(guān)閉,移動(dòng),最大化,最小化,
java代碼設(shè)計(jì)如下:
interface 窗口{
public void 關(guān)閉();
public void 移動(dòng)();
public ovid 最大化();
...
...
}
如果客戶點(diǎn)擊了關(guān)閉按鈕,java類實(shí)現(xiàn)如下:
Frame implements 窗口{
public void 關(guān)閉(){
System.out.println("關(guān)閉窗口");
}
public void 移動(dòng)()[
}
public ovid 最大化(){
}
...
...
}
這里面我們可以看出,我們關(guān)注的只有關(guān)閉按鈕觸發(fā)的事件,其它的我們不用管.但是在java類中,我們必須把接口的所有方法都給實(shí)現(xiàn).這樣我們連一些沒(méi)有用的方法也得給實(shí)現(xiàn).那怕是空實(shí)現(xiàn).
下面我們來(lái)建一個(gè)抽象類來(lái)實(shí)現(xiàn)這個(gè)接口.
public abstract Frame implements 窗口{
public void 關(guān)閉(){
}
public void 移動(dòng)(){
}
public ovid 最大化(){
}
...
...
}
這里我們可以看出,抽象類給每個(gè)接口一個(gè)空的實(shí)現(xiàn),那我們都可以在抽象類的基礎(chǔ)上進(jìn)行擴(kuò)展。關(guān)閉功能實(shí)現(xiàn)如下:
public CloseFrame extends Frame{
public void 關(guān)閉(){
System.out.println("關(guān)閉窗口");
}
}
像在java中的事件處理都是用適配器模式來(lái)實(shí)現(xiàn)的。接口,抽象類都是已經(jīng)寫好的。我們只需要實(shí)現(xiàn)具體功能的類就可以了。
再舉個(gè)簡(jiǎn)單的例子:
假如存在如下接口:
interface TestInterface{
void test1();
void test2();
void test3();
}
如果我們只關(guān)注test1接口應(yīng)該怎樣寫呢。
abstract class TestAbstract implements Test{
public void test1(){
}
public void test2(){
}
public void test3(){
}
}
class TestTest1 extends TestAbstract{
public void test1(){
System.out.println("方法1實(shí)現(xiàn)");
}
}
那么在什么情況下用相信大家已經(jīng)能看得出來(lái)了吧。假如你不準(zhǔn)備實(shí)現(xiàn)接口的所有方法。就可以建一個(gè)抽象類來(lái)實(shí)現(xiàn)這個(gè)接口的所有方法,當(dāng)然這里全都是空的實(shí)現(xiàn).然后再寫一個(gè)類繼承這個(gè)抽象類就可以得到你想要的結(jié)果了.
JAVA 把字符串間的若干空格保留一個(gè)
String str="你 好, Fuck You";
System.out.println(str.replaceAll("\\s+"," "));
javascript和java里的回車換行符的處理
request.getParameter("modelTail").replaceAll("<br>",String.valueOf((char)13)).replaceAll("<bt>",String.valueOf((char)10))
content.replaceAll(String.valueOf((char)13),"<br>").replaceAll(String.valueOf((char)10),"<bt>")
document.all.txtContent.value = (varGet2.Content).replace("<br>",String.fromCharCode(13)).replace("<bt>",String.fromCharCode(10));
javascript里的String.fromCharCode 和 strObj.charCodeAt(index)
Tomcat默認(rèn)可以使用的內(nèi)存為128MB,在較大型的應(yīng)用項(xiàng)目中,這點(diǎn)內(nèi)存是不夠的,輕微時(shí),會(huì)使系統(tǒng)性能急劇下降,嚴(yán)重時(shí),將導(dǎo)致系統(tǒng)無(wú)法運(yùn)行,影響系統(tǒng)的穩(wěn)定性。當(dāng)內(nèi)存不夠用時(shí),常見的問(wèn)題就是報(bào)tomcat內(nèi)存益處錯(cuò)誤,從兒導(dǎo)致客戶端包500錯(cuò)誤的,如下:解決方法主要是加大TOMCAT可利用內(nèi)存,并在程序當(dāng)中加大內(nèi)存使用。因此根據(jù)應(yīng)用的需求,有必要調(diào)整JVM使用內(nèi)存的大小?,F(xiàn)在將手工修改tomcat內(nèi)存的方法及注意事項(xiàng)列出,希望能對(duì)新人有所幫助。
tomcat提供了兩種安裝模式,即免安裝(*.zip)和安裝(*.exe)方式。針對(duì)不同的安裝方式下修改tomcat內(nèi)存大小的方法幾注意問(wèn)題(windows環(huán)境):
方式1:當(dāng)選擇安裝方式時(shí),可以在安裝tomcat的過(guò)程進(jìn)行設(shè)置tomcat初始化內(nèi)存的大小。但是假如說(shuō)在安裝時(shí)沒(méi)有選擇,或者應(yīng)用改變了,需要增加tomcat內(nèi)存時(shí)怎么半呢?此時(shí),我們就要手工修改tomcat的一些文件了:
看了很多網(wǎng)上的資料,都是說(shuō)修改<CATALINA_HOME>\bin\catalina.bat文件的內(nèi)容,即在里面增加一行代碼:
set JAVA_OPTS=-Xms512m -Xmx512m //表示初始化最小可用內(nèi)存和最大可用內(nèi)存都是512MB(修改相應(yīng)值即可)
如在catalina.bat的
rem ----- Execute The Requested Command
echo Using CATALINA_BASE: %CATALINA_BASE%
echo Using CATALINA_HOME: %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
echo Using JAVA_HOME: %JAVA_HOME%
這一欄改為
rem ----- Execute The Requested Command
set JAVA_OPTS=-Xms512m -Xmx512m
echo Using CATALINA_BASE: %CATALINA_BASE%
echo Using CATALINA_HOME: %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
echo Using JAVA_HOME: %JAVA_HOME%
就可以將JAVA虛擬機(jī)分配內(nèi)存 508.0625MB的!
但是很多人修改后,發(fā)現(xiàn)修改并沒(méi)有起作用,即通過(guò)windows的服務(wù)啟動(dòng)tomcat時(shí),實(shí)際的內(nèi)存還是默認(rèn)的,修改的設(shè)置并沒(méi)有起作用;而通過(guò)<CATALINA_HOME>\bin\startup.bat 啟動(dòng)卻是生效的。這是為什么呢?因?yàn)樵诎惭b過(guò)程中,JVM的初始化參數(shù)已經(jīng)寫在注冊(cè)表中了,由于沒(méi)有修改注冊(cè)表中相關(guān)參數(shù),所以以windows服務(wù)方式啟動(dòng)時(shí),修改的并沒(méi)有生效。而通過(guò)<CATALINA_HOME>\bin\startup.bat 啟動(dòng)直接是通過(guò)<CATALINA_HOME>\bin\catalina.bat文件中的配置的。你需要重新加載到系統(tǒng)服務(wù)中才生效,或者你手工在注冊(cè)表中查找修改啟動(dòng)值,加載到服務(wù)中的時(shí)候參數(shù)已經(jīng)配置好了,自己修改artup.bat不會(huì)改變注冊(cè)表中的參數(shù)設(shè)置。
解決方法:修改注冊(cè)表中的參數(shù),加入JVM初始化內(nèi)存的參數(shù):
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions
值為
-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"
-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"
-Xrs
如加入 -Xms512m -Xmx800m
方式2:針對(duì)免安裝的用戶,也可以通過(guò)將tomcat注冊(cè)為windows的一個(gè)服務(wù)的方式來(lái)實(shí)現(xiàn):‘
我們可以對(duì)service.bat文件做一些其他修改,使tomcat更加能滿足我們各種不同需求時(shí)的要求
1. 如果讓tomcat編譯jsp文件,就在PR_CLASSPATH中加入J2SDK的tools.jar
修改前:
set PR_CLASSPATH=%CATALINA_HOME%\bin\bootstrap.jar
修改后:
set PR_CLASSPATH=%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\bin\bootstrap.jar
2.要使用一個(gè)特定的JVM,就要修改jvm的參數(shù);要使注冊(cè)的windows服務(wù)的啟動(dòng)方式為自動(dòng),增加--Startup Automatic,這個(gè)是比較常用的;要用定制的server.xml配置文件并且傳遞多個(gè)參數(shù)給StartClass,要修改StartParams的值,各個(gè)值之間用分號(hào)分隔:
修改前:
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm auto
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap
--StartParams start --StopParams stop
修改后:
"%EXECUTABLE%" //IS//%SERVICE_NAME% --Jvm "%JAVA_HOME%\jre\bin\server\jvm.dll"
--StartClass org.apache.catalina.startup.Bootstrap --StopClass org.apache.catalina.startup.Bootstrap
--StartParams "-config;%CUSTOM_SERVERXML_FILE%;-nonaming;start" --StopParams stop
--Startup Automatic
3. 指定最大和最小的內(nèi)存限制,要增加jvm的初始參數(shù)
修改前:
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions
"-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\common\endorsed"
--StartMode jvm --StopMode jvm
修改后:
"%EXECUTABLE%" //US//%SERVICE_NAME% --JvmOptions
"-Xms128M;-Xmx256M;-Dcatalina.base=%CATALINA_BASE%;-Dcatalina.home=%CATALINA_HOME%;-Djava.endorsed.dirs=%CATALINA_HOME%\common\endorsed"
--StartMode jvm --StopMode jvm
4.有時(shí)注冊(cè)windows服務(wù)成功后,但是啟動(dòng)服務(wù)時(shí)顯示“發(fā)生服務(wù)特定錯(cuò)誤: 0.”
就是因?yàn)閖vm沒(méi)有指定,修改Jvm auto為Jvm "%JAVA_HOME%\jre\bin\server\jvm.dll"后重新注冊(cè)windows服務(wù)就可以啟動(dòng)了。
具體記錄如下:
<s:set name="fieldType" value="'condition'"></s:set>
<s:set name="countryID" value="'CHN'"></s:set>
<s:set name="corpCenter" value="#session.opType.corpCenter"></s:set>
<s:set name="corpID" value="#session.opType.corpID"></s:set>
<s:set name="corpType" value="#session.opType.corpType"></s:set>
<s:set name="agentID" value=""></s:set>
<s:set name="city" value=""></s:set>
<s:set name="agentType" value='"A"'></s:set>
注意上面紅色部分的標(biāo)識(shí)。當(dāng)定義的變量為單個(gè)字符是,必須外面是單引號(hào),字符用雙引號(hào)引起。
<s:action name="ReportBeanListAction" id="reportBeanSkyechoAgentListAction">
<s:param name="agentID"><s:property value="agentID" /></s:param>
<s:param name="city"><s:property value="city" /></s:param>
<s:param name="corpID"><s:property value="corpID" /></s:param>
<s:param name="corpCenter"><s:property value="corpCenter" /></s:param>
<s:param name="agentType"><s:property value="agentType" /></s:param>
</s:action>
附:轉(zhuǎn)載OGNL表達(dá)式相關(guān)的知識(shí)點(diǎn):
OGNL的全稱是Object Graph Navigation Language(對(duì)象圖導(dǎo)航語(yǔ)言),它是一種強(qiáng)大的表達(dá)式語(yǔ)言,讓你通過(guò)簡(jiǎn)單一致的表達(dá)式語(yǔ)法來(lái)讀取和設(shè)置Java對(duì)象的屬性值,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)換等功能。
為什么使用OGNL
相對(duì)于其它的表達(dá)式語(yǔ)言,OGNL的功能更為強(qiáng)大,它提供了很多高級(jí)而必需的特性,例如強(qiáng)大的類型轉(zhuǎn)換功能、靜態(tài)或?qū)嵗椒ǖ膱?zhí)行、跨集合投影,以及動(dòng)態(tài)lambda表達(dá)式定義等。
OGNL基礎(chǔ)
OGNL表達(dá)式的計(jì)算都是圍繞OGNL上下文來(lái)進(jìn)行的,OGNL上下文實(shí)際上就是一個(gè)Map對(duì)象,由ognl.OgnlContext類(實(shí)現(xiàn)了 java.util.Map接口)來(lái)表示。OGNL上下文可以包含一個(gè)或多個(gè)JavaBean對(duì)象,在這些對(duì)象中有一個(gè)是特殊的,這個(gè)對(duì)象就是上下文的根 (root)對(duì)象。如果在寫表達(dá)式的時(shí)候,沒(méi)有指定使用上下文中的哪一個(gè)對(duì)象,那么根對(duì)象將被假定為表達(dá)式所依據(jù)的對(duì)象。
在OGNL上下文中,只能有一個(gè)根對(duì)象,如果你訪問(wèn)根對(duì)象,那么在寫表達(dá)式的時(shí)候,直接寫對(duì)象的屬性就可以了;否則,你需要使用“#key”前綴,例如表達(dá)式#namager.name。
OGNL表達(dá)式
OGNL表達(dá)式的基礎(chǔ)單元就是導(dǎo)航鏈,通常簡(jiǎn)稱為鏈(chain)。最簡(jiǎn)單的鏈由下列部分組成:
1、屬性名:如name和manager.name;
2、方法調(diào)用:如manager.hashCode(),返回manager對(duì)象的散列碼;
3、數(shù)組索引:如emals[0],返回當(dāng)前對(duì)象的郵件列表中的第一個(gè)郵件地址。
所有OGNL表達(dá)式的計(jì)算都是在當(dāng)前對(duì)象的上下文中,一個(gè)鏈簡(jiǎn)單地使用鏈中先前鏈接的結(jié)果作為下一步計(jì)算的當(dāng)前對(duì)象。我們看如下所示的鏈:
name.toCharArray()[0].numericValue.toString()
這個(gè)表達(dá)式按照下列的步驟進(jìn)行計(jì)算:
1、獲取根對(duì)象的name屬性;
2、在String結(jié)果上調(diào)用toCharArray()方法;
3、從char數(shù)組中提取第一個(gè)字符;
4、從提取的字符對(duì)象上行到numericValue屬性(這個(gè)字符被表示為Character對(duì)象,Character類有一個(gè)getNumericValue()方法);
5、在Integer對(duì)象結(jié)果上調(diào)用toString()方法。
這個(gè)表達(dá)式最終結(jié)果是最后返回的toString()方法調(diào)用返回的字符串。
常量
OGNL支持的所有常量類型:
1、字符串常量:
以單引號(hào)或雙引號(hào)括起來(lái)的字符串。如”hello”,’hello’。
不過(guò)要注意的是,如果是單個(gè)字符的字符串常量,必須使用雙引號(hào)。
2、字符常量:
以單引號(hào)括起來(lái)的字符。如’a'。
3、數(shù)值常量:
除了Java中的int、long、float和double外,OGNL還讓你使用“b”或“B”后綴指定BigDecimal常量,用“h”“H”后綴指定BigInteger常量。
4、布爾常量:
true和false。
5、null常量。
操作符
OGNL除了支持所有的Java操作符外,還支持以下幾種:
1、逗號(hào),
與C語(yǔ)言中的逗號(hào)操作符類似。
2、花括號(hào){}
用于創(chuàng)建列表,元素之間用逗號(hào)分隔。
3、in和not in
用于判斷一個(gè)值是否在集合中。
訪問(wèn)JavaBean的屬性
假如有一個(gè)employee對(duì)象作為OGNL上下文的根對(duì)象,那對(duì)于下面的表達(dá)式:
1、name
對(duì)應(yīng)的java代碼是employee.getName();
2、address.country
對(duì)應(yīng)的java代碼是employee.getAddress().getCountry();
訪問(wèn)靜態(tài)方法和靜態(tài)字段
@class@method(args) //調(diào)用靜態(tài)方法
@class@field //調(diào)用靜態(tài)字段
其中class必須給出完整的類名(包括包名),如果省略class,那么默認(rèn)使用的類是java.util.Math,如:
@@min(5,3)
@@max(5,3)
@@PI
索引訪問(wèn)
OGNL支持多種索引方式的訪問(wèn)。
1、數(shù)組和列表索引
在OGNL中,數(shù)組和列表可以大致看成是一樣的。
如:array[0]、list[0]。表達(dá)式:{’zhangsan’,'lisi’,'wangwu’}[1]等。
2、JavaBean的索引屬性
要使用索引屬性,需要提供兩對(duì)setter和getter方法,一對(duì)用于數(shù)組,一對(duì)用于數(shù)組中的元素。
如:有一個(gè)索引屬性interest,它的getter和setter如下
public String[] interest;
public String[] getInterest(){ return interest;}
public void setInterest(String[] interest){ this.interest=interest;}
public String getInterest(int i){ return interest[i]}
public void setInterest(int i, String newInterest){ interest[i]=newInterest;}
對(duì)于表達(dá)式interest[2],OGNL可以正確解釋這個(gè)表達(dá)式,調(diào)用getInterest(2)方法。如果是設(shè)置的情況下,會(huì)調(diào)用setInterest(2,value)方法。
3、OGNL對(duì)象的索引屬性
JavaBean的索引屬性只能使用整型作為索引,OGNL擴(kuò)展了索引屬性的概念,可以使用任意的對(duì)象來(lái)作為索引。
對(duì)集合進(jìn)行操作
1、創(chuàng)建集合:
創(chuàng)建列表
使用花括號(hào)將元素包含起來(lái),元素之間使用逗號(hào)分隔。如{’zhangsan’,'lisi’,'wangwu’}
創(chuàng)建數(shù)組
OGNL中創(chuàng)建數(shù)組與Java語(yǔ)言中創(chuàng)建數(shù)組類似。
創(chuàng)建Map
Map使用特殊的語(yǔ)法來(lái)創(chuàng)建 #{”key”:value, ……}
如果想指定創(chuàng)建的Map類型,可以在左花括號(hào)前指定Map實(shí)現(xiàn)類的類名。如:
#@java.util.LinkedHashMap@{”key”:”value”,….}
Map通過(guò)key來(lái)訪問(wèn),如map["key"]或map.key。
2、投影
OGNL提供了一種簡(jiǎn)單的方式在一個(gè)集合中對(duì)每一個(gè)元素聞?wù){(diào)用相同的方法,或者抽取相同的屬性,并將結(jié)果保存為一個(gè)新的集合,稱之為投影。
假如employees是一個(gè)包含了employee對(duì)象的列表,那么
#employees.{name}將返回所有雇員的名字的列表。
在投影期間,使用#this變量來(lái)引用迭代中的當(dāng)前元素。
如:objects.{#this instanceof String? #this: #this.toString()}
3、選擇
OGNL提供了一種簡(jiǎn)單的方式來(lái)使用表達(dá)式從集合中選擇某些元素,并將結(jié)果保存到新的集合中,稱為選擇。
如#employees.{?#this.salary>3000}
將返回薪水大于3000的所有雇員的列表。
#employees.{^#this.salary>3000}
將返回第一個(gè)薪水大于3000的雇員的列表。
#employees.{$#this.salary>3000}
將返回最后一個(gè)薪水大于3000的雇員的列表。
lambda表達(dá)式
lambda表達(dá)式的語(yǔ)法是: :[...]。OGNL中的lambda表達(dá)式只能使用一個(gè)參數(shù),這個(gè)參數(shù)通過(guò)#this引用。
如:
#fact= :[ #this<=1 ? 1 : #this* #fact ( #this-1) ], #fact(30)
#fib= :[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)
OGNL的全稱是Object Graph Navigation Language(對(duì)象圖導(dǎo)航語(yǔ)言),它是一種強(qiáng)大的表達(dá)式語(yǔ)言,讓你通過(guò)簡(jiǎn)單一致的表達(dá)式語(yǔ)法來(lái)讀取和設(shè)置Java對(duì)象的屬性值,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)換等功能。
為什么使用OGNL
相對(duì)于其它的表達(dá)式語(yǔ)言,OGNL的功能更為強(qiáng)大,它提供了很多高級(jí)而必需的特性,例如強(qiáng)大的類型轉(zhuǎn)換功能、靜態(tài)或?qū)嵗椒ǖ膱?zhí)行、跨集合投影,以及動(dòng)態(tài)lambda表達(dá)式定義等。
OGNL基礎(chǔ)
OGNL表達(dá)式的計(jì)算都是圍繞OGNL上下文來(lái)進(jìn)行的,OGNL上下文實(shí)際上就是一個(gè)Map對(duì)象,由ognl.OgnlContext類(實(shí)現(xiàn)了 java.util.Map接口)來(lái)表示。OGNL上下文可以包含一個(gè)或多個(gè)JavaBean對(duì)象,在這些對(duì)象中有一個(gè)是特殊的,這個(gè)對(duì)象就是上下文的根 (root)對(duì)象。如果在寫表達(dá)式的時(shí)候,沒(méi)有指定使用上下文中的哪一個(gè)對(duì)象,那么根對(duì)象將被假定為表達(dá)式所依據(jù)的對(duì)象。
在OGNL上下文中,只能有一個(gè)根對(duì)象,如果你訪問(wèn)根對(duì)象,那么在寫表達(dá)式的時(shí)候,直接寫對(duì)象的屬性就可以了;否則,你需要使用“#key”前綴,例如表達(dá)式#namager.name。
OGNL表達(dá)式
OGNL表達(dá)式的基礎(chǔ)單元就是導(dǎo)航鏈,通常簡(jiǎn)稱為鏈(chain)。最簡(jiǎn)單的鏈由下列部分組成:
1、屬性名:如name和manager.name;
2、方法調(diào)用:如manager.hashCode(),返回manager對(duì)象的散列碼;
3、數(shù)組索引:如emals[0],返回當(dāng)前對(duì)象的郵件列表中的第一個(gè)郵件地址。
所有OGNL表達(dá)式的計(jì)算都是在當(dāng)前對(duì)象的上下文中,一個(gè)鏈簡(jiǎn)單地使用鏈中先前鏈接的結(jié)果作為下一步計(jì)算的當(dāng)前對(duì)象。我們看如下所示的鏈:
name.toCharArray()[0].numericValue.toString()
這個(gè)表達(dá)式按照下列的步驟進(jìn)行計(jì)算:
1、獲取根對(duì)象的name屬性;
2、在String結(jié)果上調(diào)用toCharArray()方法;
3、從char數(shù)組中提取第一個(gè)字符;
4、從提取的字符對(duì)象上行到numericValue屬性(這個(gè)字符被表示為Character對(duì)象,Character類有一個(gè)getNumericValue()方法);
5、在Integer對(duì)象結(jié)果上調(diào)用toString()方法。
這個(gè)表達(dá)式最終結(jié)果是最后返回的toString()方法調(diào)用返回的字符串。
常量
OGNL支持的所有常量類型:
1、字符串常量:
以單引號(hào)或雙引號(hào)括起來(lái)的字符串。如”hello”,’hello’。
不過(guò)要注意的是,如果是單個(gè)字符的字符串常量,必須使用雙引號(hào)。
2、字符常量:
以單引號(hào)括起來(lái)的字符。如’a'。
3、數(shù)值常量:
除了Java中的int、long、float和double外,OGNL還讓你使用“b”或“B”后綴指定BigDecimal常量,用“h”“H”后綴指定BigInteger常量。
4、布爾常量:
true和false。
5、null常量。
操作符
OGNL除了支持所有的Java操作符外,還支持以下幾種:
1、逗號(hào),
與C語(yǔ)言中的逗號(hào)操作符類似。
2、花括號(hào){}
用于創(chuàng)建列表,元素之間用逗號(hào)分隔。
3、in和not in
用于判斷一個(gè)值是否在集合中。
訪問(wèn)JavaBean的屬性
假如有一個(gè)employee對(duì)象作為OGNL上下文的根對(duì)象,那對(duì)于下面的表達(dá)式:
1、name
對(duì)應(yīng)的java代碼是employee.getName();
2、address.country
對(duì)應(yīng)的java代碼是employee.getAddress().getCountry();
訪問(wèn)靜態(tài)方法和靜態(tài)字段
@class@method(args) //調(diào)用靜態(tài)方法
@class@field //調(diào)用靜態(tài)字段
其中class必須給出完整的類名(包括包名),如果省略class,那么默認(rèn)使用的類是java.util.Math,如:
@@min(5,3)
@@max(5,3)
@@PI
索引訪問(wèn)
OGNL支持多種索引方式的訪問(wèn)。
1、數(shù)組和列表索引
在OGNL中,數(shù)組和列表可以大致看成是一樣的。
如:array[0]、list[0]。表達(dá)式:{’zhangsan’,'lisi’,'wangwu’}[1]等。
2、JavaBean的索引屬性
要使用索引屬性,需要提供兩對(duì)setter和getter方法,一對(duì)用于數(shù)組,一對(duì)用于數(shù)組中的元素。
如:有一個(gè)索引屬性interest,它的getter和setter如下
public String[] interest;
public String[] getInterest(){ return interest;}
public void setInterest(String[] interest){ this.interest=interest;}
public String getInterest(int i){ return interest[i]}
public void setInterest(int i, String newInterest){ interest[i]=newInterest;}
對(duì)于表達(dá)式interest[2],OGNL可以正確解釋這個(gè)表達(dá)式,調(diào)用getInterest(2)方法。如果是設(shè)置的情況下,會(huì)調(diào)用setInterest(2,value)方法。
3、OGNL對(duì)象的索引屬性
JavaBean的索引屬性只能使用整型作為索引,OGNL擴(kuò)展了索引屬性的概念,可以使用任意的對(duì)象來(lái)作為索引。
對(duì)集合進(jìn)行操作
1、創(chuàng)建集合:
創(chuàng)建列表
使用花括號(hào)將元素包含起來(lái),元素之間使用逗號(hào)分隔。如{’zhangsan’,'lisi’,'wangwu’}
創(chuàng)建數(shù)組
OGNL中創(chuàng)建數(shù)組與Java語(yǔ)言中創(chuàng)建數(shù)組類似。
創(chuàng)建Map
Map使用特殊的語(yǔ)法來(lái)創(chuàng)建 #{”key”:value, ……}
如果想指定創(chuàng)建的Map類型,可以在左花括號(hào)前指定Map實(shí)現(xiàn)類的類名。如:
#@java.util.LinkedHashMap@{”key”:”value”,….}
Map通過(guò)key來(lái)訪問(wèn),如map["key"]或map.key。
2、投影
OGNL提供了一種簡(jiǎn)單的方式在一個(gè)集合中對(duì)每一個(gè)元素聞?wù){(diào)用相同的方法,或者抽取相同的屬性,并將結(jié)果保存為一個(gè)新的集合,稱之為投影。
假如employees是一個(gè)包含了employee對(duì)象的列表,那么
#employees.{name}將返回所有雇員的名字的列表。
在投影期間,使用#this變量來(lái)引用迭代中的當(dāng)前元素。
如:objects.{#this instanceof String? #this: #this.toString()}
3、選擇
OGNL提供了一種簡(jiǎn)單的方式來(lái)使用表達(dá)式從集合中選擇某些元素,并將結(jié)果保存到新的集合中,稱為選擇。
如#employees.{?#this.salary>3000}
將返回薪水大于3000的所有雇員的列表。
#employees.{^#this.salary>3000}
將返回第一個(gè)薪水大于3000的雇員的列表。
#employees.{$#this.salary>3000}
將返回最后一個(gè)薪水大于3000的雇員的列表。
lambda表達(dá)式
lambda表達(dá)式的語(yǔ)法是: :[...]。OGNL中的lambda表達(dá)式只能使用一個(gè)參數(shù),這個(gè)參數(shù)通過(guò)#this引用。
如:
#fact= :[ #this<=1 ? 1 : #this* #fact ( #this-1) ], #fact(30)
#fib= :[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)