2009年5月5日
#
今天在做手機終端開發時,發現連上域名服務器老是連不上,而直接用IP連接是OK的,初步懷凝是DNS問題引起來,經查相關的資料,現記錄如下:
Android模擬器默認的地址是10.0.2.3,默認的DNS也是10.0.2.3,而一般電腦的IP都是192.168.1.100之類的,不在同一個網段。所以就會出現電腦可以上網但是模擬器不能上網的情況。其實設置方法很簡單,只要把模擬器的默認DNS設置成電腦的DNS地址即可。
第一步:用系統的命令進入Android開發包的tools目錄
cd X:\...\android-sdk-windows\tool
第二布:使用adb的shell,確認系統的各項屬性
adb shell
getprop
getprop會列出系統當前的各項屬性
第三步:得到模擬器的DNS地址
在結果里可以看到:
[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)))
啟動 lsnrctl start
狀態 lsnrctl status
關閉 lsnrctl stop
導出命令:exp 用戶名/密碼@數據庫 owner=用戶名 file=文件存儲路徑(如:F:\abcd.dmp)
測試截圖:exp ZM/sql123@ORCL owner=ZM file=F\abcd.dmp

導入命令:imp 用戶名/密碼@數據庫 fromuser=用戶名 touser=用戶名 file=d:\cu.dmp ignore=y
imp:命令類型
cu/mycu@db:導入的數據庫登陸(用戶名/密碼@數據庫)
fromuser:文件的指定用戶
touser:指定導入到當前登錄的數據庫某個用戶
file:需要導入的數據文件
ignore:是否忽略創建錯誤
測試截圖:
imp ZM/sql123@ORCL fromuser=ZM touser=SZZM file=F:\test.dmp ignore=y

linux環境下的rmi常見問題
問題一:RMI服務提供程序運行在Windows操作系統下,RMI服務可以正常訪問,但將RMI服務提供程序部署到Linux操作系統下后,RMI服務無法訪問,提示
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服務之前將當前服務器的IP指定給hostName,如 System.setProperty("java.rmi.server.hostname", "192.168.100.7");或者修改/etc/hosts文件,在這個文件中加 192.168.100.54 testlinux1 localhost.localdomain localhost 就行,或者將/etc/hosts文件中默認的127.0.0.1改成當前機器的IP即可!
問題二:java.rmi.server.ExportException: internal error: ObjID already in use Caused by: java.rmi.server.ExportException: internal error: ObjID already in use……
出現這種問題及有可能是/etc/hosts文件中指定的IP并不是當前服務器的真實IP,RMI在初始化時注冊服務失敗。
通過System.out.println(InetAddress.getLocalHost().toString());查看當前主機的IP是否為真實IP,如顯示為SIMBANK/220.250.64.24,而真實IP為192.168.1.2
解決辦法:修改/etc/hosts文件中錯誤的IP即可,將:
220.250.64.24 SIMBANK
修改為
192.168.1.2 SIMBANK
JAVA中,通過分析Heapdump文件可以檢查程序是否存在內存泄露,但是這個文件一般是在程序遇到致命問題時才會產生,而如何事前生成這個文件,從而在程序尚末崩潰前找出問題的所在。
以下記述了各個版本的JDK產生DUMP文件的方法:
UN JDK生成Heapdump文件只需要在tomcat啟動腳本中增加 HeapDumpOnOutOfMemoryError 參數
此參數需要Java SE release 5.0 update 14 或以上支持
設置示例:
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文件的開關:
— 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文件需要在在環境變量上,加上export _JAVA_HEAPDUMP=1
今天在做某項目的POC測試,甲方提供了一個三十萬記錄的TXT數據文件,需要把該文件的記錄插入到數據庫中,由于項目部的同事在搭建測試環境中用的是Mysql數據庫,在把數據導入到數據庫中用的是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);
}
}在測試時,發現三十萬的數據居然需要十分鐘左右的時間。首先想到的就是Mysql的相關配置是不是有問題,反復修改了Mysql的相應配置參數,收效甚微。
在Mysql的官網上查到如下:
http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html
關于rewriteBatchedStatements參數,Mysql官方的說明:
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的驅動程序。
MYSQL URL的配置參數如下:
jdbc:mysql://54.200.190.80:3306/ccb_ucstar?rewriteBatchedStatements=true
經過測試。三十多萬的數據。70秒內搞定!
今天在做項目中,供應源提供了一小段的源代碼,但文件編碼格式是GBK的,而我公司建工程時統一用的UTF-8編碼,導進來后出現亂碼。為了解決這一問題,在網上查找了相關的資料,發現可以用 enca工具來進行批量轉換
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
轉換命令
enca -L zh_CN -x UTF-8 *.java
如果sh目錄存在且腳本無誤,最可能是原因是在windows下寫的腳本是dos格式的,放在Linux下編碼不識別,解決方法是使用dos2unix命令轉一下,即輸入: dos2unix 文件名
畢業后,有人工作,有人繼續上學,大家千萬不要錯過這篇文章,能看到這篇文章也是一種幸運,真的受益匪淺,對我有很大啟迪,這篇文章將會改變我的一生,真的太好了,希望與有緣人分享,也希望對有緣人有所幫助!這篇文章有點長,但是希望你能夠耐心的看完,看完之后有種“相見恨晚”的感覺,特別激動,希望大家好好的珍藏這篇文章,相信多年以后,再來看這篇文章,一定有不同的感覺。
正如”打工皇帝”唐駿說:”我覺得有兩種人不要跟別人爭利益和價值回報。第一種人就是剛剛進入企業的人,頭5年千萬不要說你能不能多給我一點兒工資,最重要的是能在企業里學到什么,對發展是不是有利……”
人總是從平坦中獲得的教益少,從磨難中獲得的教益多;從平坦中獲得的教益淺,從磨難中獲得的教益深。一個人在年輕時經歷磨難,如能正確視之,沖出黑暗,那就是一個值得敬慕的人。最要緊的是先練好內功,畢業后這5年就是練內功的最佳時期,練好內功,才有可能在未來攀得更高。
出路在哪里?出路在于思路!
其實,沒有錢、沒有經驗、沒有閱歷、沒有社會關系,這些都不可怕。沒有錢,可以通過辛勤勞動去賺;沒有經驗,可以通過實踐操作去總結;沒有閱歷,可以一步一步去積累;沒有社會關系,可以一點一點去編織。但是,沒有夢想、沒有思路才是最可怕的,才讓人感到恐懼,很想逃避!
人必須有一個正確的方向。無論你多么意氣風發,無論你是多么足智多謀,無論你花費了多大的心血,如果沒有一個明確的方向,就會過得很茫然,漸漸就喪失了斗志,忘卻了最初的夢想,就會走上彎路甚至不歸路,枉費了自己的聰明才智,誤了自己的青春年華。
荷馬史詩《奧德賽》中有一句至理名言:”沒有比漫無目的地徘徊更令人無法忍受的了。”畢業后這5年里的迷茫,會造成10年后的恐慌,20年后的掙扎,甚至一輩子的平庸。如果不能在畢業這5年盡快沖出困惑、走出迷霧,我們實在是無顏面對10年后、20年后的自己。畢業這5年里,我們既有很多的不確定,也有很多的可能性。
畢業這5年里,我們既有很多的待定,也有很多的決定。
迷茫與困惑誰都會經歷,恐懼與逃避誰都曾經有過,但不要把迷茫與困惑當作可以自我放棄、甘于平庸的借口,更不要成為自怨自艾、祭奠失意的苦酒。生命需要自己去承擔,命運更需要自己去把握。在畢業這5年里,越早找到方向,越早走出困惑,就越容易在人生道路上取得成就、創造精彩。無頭蒼蠅找不到方向,才會四處碰壁;一個人找不到出路,才會迷茫、恐懼。
生活中,面對困境,我們常常會有走投無路的感覺。不要氣餒,堅持下去,要相信年輕的人生沒有絕路,困境在前方,希望在拐角。只要我們有了正確的思路,就一定能少走彎路,找到出路!
成功的人不是贏在起點,而是贏在轉折點。
不少剛剛畢業的年輕人,總是奢望馬上就能找到自己理想中的工作。然而,很多好工作是無法等來的,你必須選擇一份工作作為歷練。職業旅程中的第一份工作,無疑是踏入社會這所大學的起點。也許你找了一份差強人意的工作,那么從這里出發,好好地沉淀自己,從這份工作中汲取到有價值的營養,厚積薄發。千里之行,始于足下,只要出發,就有希望到達終點。
起點可以相同,但是選擇了不同的拐點,終點就會大大不同!
畢業這幾年,我們的生活、感情、職業等都存在很多不確定的因素,未來也充滿了各種可能。這個時候,必須學會選擇,懂得放棄,給自己一個明確的定位,使自己穩定下來。如果你不主動定位,就會被別人和社會”定型”!
可以這么說:一個人在畢業這5年培養起來的行為習慣,將決定他一生的高度。我們能否成功,在某種程度上取決于自己對自己的評價,這就是定位。你給自己定位是什么,你就是什么。定位能決定人生,定位能改變命運。丑小鴨變成白天鵝,只要一雙翅膀;灰姑娘變成美公主,只要一雙水晶鞋。
人的命,三分天注定,七分靠打拼,有夢就”會紅”,愛拼才會贏。只要不把自己束縛在心靈的牢籠里,誰也束縛不了你去展翅高飛。
現實情況遠非他們所想的那樣。于是,當優越感逐漸轉為失落感甚至挫敗感時,當由堅信自己是一塊”金子”到懷疑自己是一粒”沙子”時,憤怒、迷茫、自卑就開始與日俱增。
其實,應該仔細掂量一下自己,你是否真是金子?是真金,手中要有絕活,才能上要有過人之處才行。一句話:真金是要靠實力來證明的,只有先把自己的本領修煉好了,才有資格考慮伯樂的事情
每顆珍珠原本都是一粒沙子,但并不是每一粒沙子都能成為一顆珍珠。
想要卓爾不群,就要有鶴立雞群的資本。忍受不了打擊和挫折,承受不住忽視和平淡,就很難達到輝煌。年輕人要想讓自己得到重用,取得成功,就必須把自己從一粒沙子變成一顆價值連城的珍珠。
天有下雨與日出,人生高峰與低谷。
莫為浮云遮望眼,風物長宜放眼量。
只要拂去陰霾,就能亮出朗朗晴空。如果你在工作上有些不如意,要相信自己不會一直處于人生的低谷期,總有一天能沖破重重云層。告訴自己:我并沒有失敗,只是暫時沒有成功!只要在內心點亮一盞希望之燈,一定能驅散黑暗中的陰霾,迎來光明。
的確,論資歷,他們是不折不扣的職場菜鳥,業務涉及不深,人脈一窮二白,在工作中經常碰壁。他們的壓力并不一定都像千鈞大石,而是像大雨來臨前的天色,灰色低沉,明明有空間,卻被灰色填滿每個縫隙,只能等待大雨傾盆之后的晴空。
”起得比雞早,睡得比狗晚,干得比驢多,吃得比豬差。”這是很多剛剛畢業的人喜歡用來調侃自己生活狀態的話。雖然有點兒夸張,但是,他們中的很多人的確一直都被灰色心情所籠罩–心里永遠是多云轉陰。記得有位哲人曾說:”我們的痛苦不是問題本身帶來的,而是我們對這些問題的看法產生的。”換個角度看人生,是一種突破、一種解脫、一種超越、一種高層次的淡泊與寧靜,從而獲得自由自在的快樂。
一位哲人說:”人生就是一連串的抉擇,每個人的前途與命運,完全把握在自己手中,只要努力,終會有成。”就業也好,擇業也罷,創業亦如此,只要奮發努力,都會成功。你是不是準備把生命的承諾全部都交給別人?
畢業后這5年,是改變自己命運的黃金時期。在最能決定自己命運時,如果還不把握,那你還要等到什么時候呢?我的人生我做主,命運由己不由人。
不要活在別人的嘴里,不要活在別人的眼里,而是把命運握在自己手里。
別說你沒有背景,自己就是最大的背景。美國作家杰克·凱魯亞克說過一句話:”我還年輕,我渴望上路。”在人生的旅途中,我們永遠都是年輕人,每天都應該滿懷渴望。每個人的潛能都是無限的,關鍵是要發現自己的潛能和正確認識自己的才能,并找到一個能充分發揮潛能的舞臺,而不能只為舞臺的不合適感到不快。要客觀公正地看待自己的能力,結合自己的實際情況和愛好冷靜選擇,盡可能到最需要自己、最適合自己的地方。
在人力資源管理界,特別流行一個說法,即”騎馬,牽牛,趕豬,打狗”理論:人品很好,能力又很強的,是千里馬,我們要騎著他;人品很好但能力普通的,是老黃牛,我們要牽著他;人品、能力皆普通的,就是”豬”,我們要趕走他;人品很差能力很強的,那是”狗”,我們要打擊他。
我想,剛剛畢業幾年的你,一樣胸懷大志,一樣想成為一匹被人賞識、馳騁沙場的千里馬吧?那么,就好好沉淀下來。低就一層不等于低人一等,今日的俯低是為了明天的高就。所謂生命的價值,就是我們的存在對別人有價值。能被人利用是一件好事,無人問津才是真正的悲哀!
能干工作、干好工作是職場生存的基本保障。
任何人做工作的前提條件都是他的能力能夠勝任這項工作。能干是合格員工最基本的標準,肯干則是一種態度。一個職位有很多人都能勝任,都有干好這份工作的基本能力,然而,能否把工作做得更好一些,就要看是否具有踏實肯干、苦于鉆研的工作態度了。
在能干的基礎上踏實肯干。
工作中,活干得比別人多,你覺得吃虧;錢拿得比別人少,你覺得吃虧;經常加班加點,你覺得吃虧……其實,沒必要這樣計較,吃虧不是災難,不是失敗,吃虧也是一種生活哲學?,F在吃點兒小虧,為成功鋪就道路,也許在未來的某個時刻,你的大福突然就來了。
能吃虧是做人的一種境界,是處世的一種睿智。
在工作中并不是多做事或多幫別人干點兒活就是吃虧。如果領導讓你加加班、趕趕任務,別以為自己吃了大虧,反而應該感到慶幸,因為領導只叫了你,而沒叫其他人,說明他信任你、賞識你。吃虧是一種貢獻,你貢獻得越多,得到的回報也就越多。樂于加班,就是這樣的一種吃虧。
舍得舍得,有舍才有得;學會在適當時吃些虧的人絕對不是弱智,而是大智。
給別人留余地就是給自己留余地,予人方便就是予己方便,善待別人就是善待自己。
傻人有傻福,因為傻人沒有心計。和這樣的人在一起,身心放松,沒有太多警惕,就能相互靠近。傻在很多時候意味著執著和忠貞,也意味著寬厚和誠實,讓人不知不覺站到他一邊。傻人無意中得到的,比聰明人費盡心機得到的還多。畢業這幾年,你的天空中只飄著幾片雪花,這樣你就滿足了嗎?成功需要堅持與積累,與其專注于搜集雪花,不如省下力氣去滾雪球。巴菲特說:”人生就像滾雪球,最重要的是發現很濕的雪和很長的坡。”讓自己沉淀下來,學著發現”很濕的雪”,努力尋找”很長的坡”。記?。荷⒙涞难┗〞芸烊诨?,化為烏有,只有雪球才更實在,才能長久。
在畢業這幾年里,你要是能做到比別人多付出一分努力,就意味著比別人多積累一分資本,就比別人多一次成功的機會。
什么是職業化呢?職業化就是工作狀態的標準化、規范化、制度化,即在合適的時間、合適的地點用合適的方式說合適的話、做合適的事,使知識、技能、觀念、思維、態度、心理等符合職業規范和標準。”在每個行業里,都有很多出色的人才,他們之所以能存在,是因為比別人更努力、更智慧、更成熟。但是,最重要的是,他們比一般人更加職業化!這就是為什么我現在能當你老板的原因。一個人僅僅專業化是不夠的,只有職業化的人才能飛在別人前面,讓人難以超越!”不要以為我們現在已經生存得很安穩了。對于畢業5年的人來講,一定要認清即將面臨的五大挑戰。
一、贍養父母。
二、結婚生子。
三、升職加薪。
四、工作壓力。
五、生活質量。
有的人為生存而雀躍,目光總是停在身后,三天打魚兩天曬網,有始無終。
有的人為發展而奮斗,目光總是盯在正前方,每天進步一點點,堅持不懈。
畢業這幾年,不能沒有追求和探索,不能沒有理想和目標。人生如逆水行舟,不進則退。甘于現狀的生活就是不再前行的船,再也無法追上時代前進的步伐。一定要抓緊每一秒鐘的時間來學習,要明白學習不是學生的專利。小聰明的人最得意的是:自己做過什么?大智慧的人最渴望的是:自己還要做什么?
小聰明是戰術,大智慧是戰略;小聰明看到的是芝麻,大智慧看到的是西瓜。
在這個世界上,既有大人物,也有小角色,大人物有大人物的活法,小人物有小人物的瀟灑,每個人都有自己的生活方式,誰也勉強不了誰。但是,小聰明只能有小成績和小視野,大智慧才能有大成就和大境界。小企業看老板,中企業看制度,大企業看文化。
小公司與大企業都有生存之道,沒有好壞之分,但對一個人不同階段的影響會不同。
小公司肯定想要發展為大企業,這是一種目標,年輕人也要給自己的職業生涯制定目標。畢業幾年的你,是否經常會怯場或者是感到沒有底氣?居安思危絕對不是危言聳聽!此刻打盹,你將做夢;此刻學習,你將圓夢。在競爭激烈的人生戰場上,打盹的都是輸家!
每個人在年輕的時候似乎都豪情萬丈,什么都不怕,可是隨著年齡的增長,每天想著房子、工作、養家糊口這些俗事兒,再也沒有年輕時那種敢于”上天探星、下海撈月”的勇氣了。是我們改變了生活,還是生活改變了我們?我們的思想越來越復雜,因為有了越來越多的舍不得、越來越多的顧慮,我們總是在徘徊、總是在猶豫。畢業開始一兩年,生活的重擔會壓得我們喘不過氣來,挫折和障礙堵住四面八方的通口,我們往往在壓迫得自己發揮出潛能后,才能殺出重圍,找到出路??墒莾扇旰?,身上的重擔開始減輕,工作開始一帆風順,我們就松懈了下來,漸漸忘記了潛在的危險。直到有一天危機突然降臨,我們在手足無措中被擊敗……畢業這幾年,仍然處于危險期,一定要有居安思危的意識,好好打拼,這樣才能有一個真正的安全人生!
生于憂患,死于安樂。如果你想跨越自己目前的成就,就不能畫地自限,而是要勇于接受挑戰。對畏畏縮縮的人來說,真正的危險正在于不敢冒險!
年輕人在社會的重壓下,適應能力已變得越來越強,只是他們不自覺地習慣被環境推著走。他們不敢冒險,怕給自己帶來終身的遺憾,于是告慰自己:”我對得起自己、對得起家人,因為我已竭盡全力。”其實,人只有不斷挑戰和突破才能逐漸成長。長期固守于已有的安全感中,就會像溫水里的青蛙一樣,最終失去跳躍的本能。
經歷了這幾年社會生活,你應該明白:這個世界上有富也有貧,有陰也有亮,有丑也有美,到底看到什么,取決于自己是積極還是消極。在年輕時學會勤勉地工作,用一種光明的思維對待生活,那么,只要張開手掌,你就會發現,里面有一片燦爛的人生。
把感恩刻在石頭上,深深地感謝別人幫助過你,永遠銘記,這是人生應有的一種境界;把仇恨寫在沙灘上,淡淡忘掉別人傷害過你,學會寬容,讓所有的怨恨隨著潮水一去不復返,這也是一種人生境界。
學會倒出水,才能裝下更多的水。從畢業那天開始,學會把每天都當成一個新的起點,每一次工作都從零開始。如果你懂得把”歸零”當成一種生活的常態,當成一種優秀的延續,當成一種時刻要做的事情,那么,經過短短幾年,你就可以完成自己職業生涯的正確規劃與全面超越。
在職業起步的短短道路上,想要得到更好、更快、更有益的成長,就必須以歸零思維來面對這個世界。不要以大學里的清高來標榜自己,不要覺得自己特別優秀,而是要把自己的姿態放下,把自己的身架放低,讓自己沉淀下來,抱著學習的態度去適應環境、接受挑戰。放下”身段”才能提高身價,暫時的俯低終會促成未來的高就。
年輕人從校園或者從一個環境進入一個新環境,就要勇于將原來環境里熟悉、習慣、喜歡的東西放下,然后從零開始。我們想在職場上獲得成功,首先就要培養適應力。從自然人轉化為單位人是融入職場的基本條件。一個人起點低并不可怕,怕的是境界低。越計較自我,便越沒有發展前景;相反,越是主動付出,那么他就越會快速發展。很多今天取得一定成就的人,在職業生涯的初期都是從零開始,把自己沉淀再沉淀、倒空再倒空、歸零再歸零,正因為這樣,他們的人生才一路高歌,一路飛揚。
在畢業這幾年里,我們要讓過去歸零,才不會成為職場上那只背著重殼爬行的蝸牛,才能像天空中的鳥兒那樣輕盈地飛翔。請好好品味一下杰克·韋爾奇說過的一句話:”糾正自己的行為,認清自己,從零開始,你將重新走上職場坦途。” 吐故才能納新,心靜才能身涼,有舍才能有得,杯空才能水滿,放下才能超越。
歸零思維五大表現:心中無我,眼中無錢,念中無他,朝中無人,學無止境。
年輕人難免帶著幾分傲氣,認為自己無所不能、所向披靡,其實不然,初入職場的新人還是個”嬰兒”,正處在從爬到走的成長階段。在畢業這幾年里,一定要讓自己逐步培養起學徒思維、海綿思維、空杯思維,具有這樣思維的人心靈總是敞開的,能隨時接受啟示和一切能激發靈感的東西,他們時刻都能感受到成功女神的召喚。
JavaScrip 中String 與XML 互相轉換的函數小記
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小時的問題)
問題引起:
在公司配置文檔管理系統(OPENKM)時,把數據源切換到Mysql數據源下,經過測試,發現經過8小時后,數據庫連接自動斷開。
解決辦法:
把原來的openkm-ds.xml刪除掉。原openkm-ds.xml的內容如下:
...
閱讀全文
一、系統環境
操作系統: 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需要手動新建)
3. 執行 #chmod +x jdk-1_5_0_17-linux-i586-rpm.bin
4. 執行 ./jdk-1_5_0_17-linux-i586-rpm.bin
此時會出現JDK安裝授權協議??梢砸宦钒碋nter瀏覽。如果等的不耐煩可以直接按Ctrl+C,直接會出現Do you agree to the above license terms? [yes or no]的字樣。
5. 鍵入yes,同意該授權協議。
此時系統會開始解壓jdk-1_5_0_17-linux-i586-rpm.bin
6. 解壓完畢后,回到/opt/jdk目錄,鍵入dir。會發現多出了一個解壓好的安裝文件:jdk-1_5_0_17-linux-i586.rpm
7. 執行 rpm -ivh jdk-1_5_0_17-linux-i586.rpm
此時,系統會開始安裝JDK。安裝結束后可以在/usr目錄下發現新增了一個名為java的文件夾。該文件夾就是安裝好的JDK目錄。
8. 設置環境變量
a. 進入/etc文件夾(具體操作命令忽略),找到文件profile并打開。
[注意:profile是指文件不是指文件夾]
b. 找到export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC,在該語句的上面添加以下語句:
export JAVA_HOME="/usr/java/jdk1.5.0_17"
[注意:“=”兩側不能有空格]
export CLASSPATH="/usr/java/jdk1.5.0_17/lib:/usr/java/jdk1.5.0_17/jre/lib"
[注意:“=”兩側不能有空格;“:”是冒號,同樣不要有空格出現]
pathmunge /usr/java/jdk1.5.0_17/bin:/usr/java/jdk1.5.0_17/jre/bin
[注意:無引號]
9. 設置完畢后,保存文件。重啟Redhat后登錄控制終端,鍵入:java -version;
如果出現java version “1.5.0.17”等字樣,說明您的JDK已經安裝成功了!祝賀你!
Jetty啟動后,如果修改javascript文件,將不能保存,使調試很麻煩。這是因為使用了CACHE,JETTY說是WINDOWS下的一個限制。可以通過如下方法修正:
解壓出jetty.jar中的org/mortbay/jetty/webapp/webdefault.xml文件,將這一選項由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>
...
附。。。在項目中用到的Jetty用Java代碼Call Jetty啟動的方法
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 主導開發的一套功能非常強大的開源im 服務器(前身是
wildfire),它基于XMPP 協議,完全用java實現,是一款非常優秀的服務器端軟件。
一. 安裝JDK(我使用的是JDK1.6), 不再詳述
二. 安裝 Eclipse 5.5(不再詳述)
三. 安裝Subversive插件
Subversive是一款不錯的svn插件,具體安裝方法請參看我的另一篇文章《Eclipse中
安裝svn插件Subversive 》,鏈接
http://blog.csdn.net/zhenyucheung/archive/2008/03/19/2195518.aspx
四. check out openfire 源碼
1. 在eclipse中點擊Windows->Open Perspective->Other
2. 在彈出窗口中點擊SVN Repository Exploring 然后點OK
3. 在SVN Repositories 點右鍵,選擇 New->Repository Location...
4. 在彈出的New Repository Location頁面,將
http://svn.igniterealtime.org/svn/repos輸入URL文本框,點Finish. 你將會看到頁面出
現URL地址.
5. 展開URL地址
6. 展開openfire樹形結構
7. 在trunk上點擊右鍵,選擇Check Out
剩下的就是等待check out完成了 :)
五. 創建openfire工程
對使用過eclipse的人來說,這一步不用多說,這里僅列出幾個需要注意的地方.
1. check out完畢后,eclipse會自動創建一個openfire工程,請把它刪除(注意刪除時
不要刪除content),否則你將不得不手動配置一些開發環境。
2. 用Create project from existing source新建工程,注意工程名要用openfire。
-----------------
若自己創建工程:
五.創建Java項目,將源代碼導入此項目中。在Eclipse中將此Java文件夾當成源代碼文件夾
新建工程。庫都在Build目錄的lib目錄下,將openfire用到的庫都添加到這個新建工程的
Referenced Libraries中。
六. Build openfire
openfire是用ant構建的,所以要先設置使得eclipse中每次編譯都使用內置的ant工具,
保證編譯的正確執行。
1. eclipse中點擊Window->Show View->Ant
2. 在Ant 頁面點右鍵,選擇 Add Buildfiles...
3. 展開openfire/build文件夾,選擇build.xml, 點 OK.
4. 在Ant頁面, 展開Openfire XMPP Server,雙擊 openfire ant 任務
七. 創建項目Builder
1. 點擊Run->Open Run Dialog...
2. 選擇Java Application,點擊 New 按鈕
3. 在Run窗口的Main選項卡中, 修改Name文本框中的值,改成Openfire,其他名字亦可
4. 點Browse按鈕,選擇openfire, 點ok
5. 點Search按鈕,選擇Main class為
org.jivesoftware.openfire.starter.ServerStarter,點OK。(這是openfire的啟動類)
6. 點擊進入Arguments選項卡
7. 在VM arguments文本框中輸入 -
DopenfireHome="${workspace_loc:openfire}/target/openfire",這個是用于eclipse執行
java命令時傳遞的參數,這樣openfire程序可以通過System.getProperty(“openfireHome”)得到
openfire的本地位置。
8. 點擊進入Classpath選項卡
9. 點選User Entries,這樣Advanced...就處于可用狀態
10. 點擊Advanced...按鈕
11. 在Advanced Options頁面,選擇Add Folders, 點ok.
12. 選擇openfire\src\i18n, 點ok將這個文件夾加入到class path,同樣的方式把
openfire\src\resources\jar也加到class path中。
13. 在Common選項卡中,點選Run復選框。
設置完畢,這樣以后在run這個工程的時候就會按照正確的配置進行了。
當Maven項目很大,或者你運行諸如 mvn site 這樣的命令的時候,maven運行需要很大的內存,在默認配置下,就可能遇到java的堆溢出。如:
[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] ------------------------------------------------------------------------
解決的方法是調整java的堆大小的值。
Windows環境中
找到文件%M2_HOME%\bin\mvn.bat ,這就是啟動Maven的腳本文件,在該文件中你能看到有一行注釋為:
@REM set MAVEN_OPTS=-Xdebug -Xnoagent -Djava.compiler=NONE...
它的意思是你可以設置一些Maven參數,我們就在注釋下面加入一行:
set MAVEN_OPTS= -Xms128m -Xmx512m
之后,當你運行Maven命令如 mvn -version 的時候,你會看到如下的輸出:
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選項生效了,OutOfMemoryError也能得以相應的解決。
Linux環境中
也可以通過設置環境變量解決該問題, 如,編輯文件 /etc/profile 如下
MAVEN_OPTS=-Xmx512m
export JAVA_HOME MAVEN_HOME MAVEN_OPTS JAVA_BIN PATH CLASSPATH
如果你使用Hudson
用 Hudson + Maven做持續集成,并不幸也遇到了類似的錯誤,那么上述兩種方式都將不再起作用了,因為Hudson使用自己的maven-agent來啟動Maven,不會去調用Maven的腳本,自然相應的配置也就無效了。
好在Hudson也給為我們提供了配置點,在Hudson的項目配置頁面中,有一塊Build區域,這里我們已經設置了Root Pom和Goals。注意該區域的右下角有一個"Advanced..."按鈕,點擊會看到MAVEN_OPTS輸入框,這里輸入"-Xmx512m"就OK了。
m2eclipse中
類似以上的方法都會失效,所幸m2eclipse提供了配置點。步驟如下:
項目上右擊 -> Run As -> Run Configurations -> Maven Build 上右擊 -> New
這時會看到一個maven運行配置對話框,這里面其它的配置我不多解釋了,為了解決內存溢出的問題,我們可以選擇第二個TAB: JRE,然后在VM arguments中輸入配置如:-Xms128m -Xmx512m。
在<Script>標簽里設置一個 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>
為一個接口提供缺省實現,這樣子類可以從這個缺省實現進行擴展.而不必從原有接口進行擴展.作為適配器模式的一個特例,缺省適配模式在java語言中有著特殊的應用.(引用java模式書)
adapter是一個非常常用的設計模式.
像windows的每個窗口,事件很多個.關閉,移動,最大化,最小化,
java代碼設計如下:
interface 窗口{
public void 關閉();
public void 移動();
public ovid 最大化();
...
...
}
如果客戶點擊了關閉按鈕,java類實現如下:
Frame implements 窗口{
public void 關閉(){
System.out.println("關閉窗口");
}
public void 移動()[
}
public ovid 最大化(){
}
...
...
}
這里面我們可以看出,我們關注的只有關閉按鈕觸發的事件,其它的我們不用管.但是在java類中,我們必須把接口的所有方法都給實現.這樣我們連一些沒有用的方法也得給實現.那怕是空實現.
下面我們來建一個抽象類來實現這個接口.
public abstract Frame implements 窗口{
public void 關閉(){
}
public void 移動(){
}
public ovid 最大化(){
}
...
...
}
這里我們可以看出,抽象類給每個接口一個空的實現,那我們都可以在抽象類的基礎上進行擴展。關閉功能實現如下:
public CloseFrame extends Frame{
public void 關閉(){
System.out.println("關閉窗口");
}
}
像在java中的事件處理都是用適配器模式來實現的。接口,抽象類都是已經寫好的。我們只需要實現具體功能的類就可以了。
再舉個簡單的例子:
假如存在如下接口:
interface TestInterface{
void test1();
void test2();
void test3();
}
如果我們只關注test1接口應該怎樣寫呢。
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實現");
}
}
那么在什么情況下用相信大家已經能看得出來了吧。假如你不準備實現接口的所有方法。就可以建一個抽象類來實現這個接口的所有方法,當然這里全都是空的實現.然后再寫一個類繼承這個抽象類就可以得到你想要的結果了.
JAVA 把字符串間的若干空格保留一個
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默認可以使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,輕微時,會使系統性能急劇下降,嚴重時,將導致系統無法運行,影響系統的穩定性。當內存不夠用時,常見的問題就是報tomcat內存益處錯誤,從兒導致客戶端包500錯誤的,如下:解決方法主要是加大TOMCAT可利用內存,并在程序當中加大內存使用。因此根據應用的需求,有必要調整JVM使用內存的大小?,F在將手工修改tomcat內存的方法及注意事項列出,希望能對新人有所幫助。
tomcat提供了兩種安裝模式,即免安裝(*.zip)和安裝(*.exe)方式。針對不同的安裝方式下修改tomcat內存大小的方法幾注意問題(windows環境):
方式1:當選擇安裝方式時,可以在安裝tomcat的過程進行設置tomcat初始化內存的大小。但是假如說在安裝時沒有選擇,或者應用改變了,需要增加tomcat內存時怎么半呢?此時,我們就要手工修改tomcat的一些文件了:
看了很多網上的資料,都是說修改<CATALINA_HOME>\bin\catalina.bat文件的內容,即在里面增加一行代碼:
set JAVA_OPTS=-Xms512m -Xmx512m //表示初始化最小可用內存和最大可用內存都是512MB(修改相應值即可)
如在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虛擬機分配內存 508.0625MB的!
但是很多人修改后,發現修改并沒有起作用,即通過windows的服務啟動tomcat時,實際的內存還是默認的,修改的設置并沒有起作用;而通過<CATALINA_HOME>\bin\startup.bat 啟動卻是生效的。這是為什么呢?因為在安裝過程中,JVM的初始化參數已經寫在注冊表中了,由于沒有修改注冊表中相關參數,所以以windows服務方式啟動時,修改的并沒有生效。而通過<CATALINA_HOME>\bin\startup.bat 啟動直接是通過<CATALINA_HOME>\bin\catalina.bat文件中的配置的。你需要重新加載到系統服務中才生效,或者你手工在注冊表中查找修改啟動值,加載到服務中的時候參數已經配置好了,自己修改artup.bat不會改變注冊表中的參數設置。
解決方法:修改注冊表中的參數,加入JVM初始化內存的參數:
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:針對免安裝的用戶,也可以通過將tomcat注冊為windows的一個服務的方式來實現:‘
我們可以對service.bat文件做一些其他修改,使tomcat更加能滿足我們各種不同需求時的要求
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.要使用一個特定的JVM,就要修改jvm的參數;要使注冊的windows服務的啟動方式為自動,增加--Startup Automatic,這個是比較常用的;要用定制的server.xml配置文件并且傳遞多個參數給StartClass,要修改StartParams的值,各個值之間用分號分隔:
修改前:
"%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. 指定最大和最小的內存限制,要增加jvm的初始參數
修改前:
"%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.有時注冊windows服務成功后,但是啟動服務時顯示“發生服務特定錯誤: 0.”
就是因為jvm沒有指定,修改Jvm auto為Jvm "%JAVA_HOME%\jre\bin\server\jvm.dll"后重新注冊windows服務就可以啟動了。
具體記錄如下:
<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>
注意上面紅色部分的標識。當定義的變量為單個字符是,必須外面是單引號,字符用雙引號引起。
<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>
附:轉載OGNL表達式相關的知識點:
OGNL的全稱是Object Graph Navigation Language(對象圖導航語言),它是一種強大的表達式語言,讓你通過簡單一致的表達式語法來讀取和設置Java對象的屬性值,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉換等功能。
為什么使用OGNL
相對于其它的表達式語言,OGNL的功能更為強大,它提供了很多高級而必需的特性,例如強大的類型轉換功能、靜態或實例方法的執行、跨集合投影,以及動態lambda表達式定義等。
OGNL基礎
OGNL表達式的計算都是圍繞OGNL上下文來進行的,OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類(實現了 java.util.Map接口)來表示。OGNL上下文可以包含一個或多個JavaBean對象,在這些對象中有一個是特殊的,這個對象就是上下文的根 (root)對象。如果在寫表達式的時候,沒有指定使用上下文中的哪一個對象,那么根對象將被假定為表達式所依據的對象。
在OGNL上下文中,只能有一個根對象,如果你訪問根對象,那么在寫表達式的時候,直接寫對象的屬性就可以了;否則,你需要使用“#key”前綴,例如表達式#namager.name。
OGNL表達式
OGNL表達式的基礎單元就是導航鏈,通常簡稱為鏈(chain)。最簡單的鏈由下列部分組成:
1、屬性名:如name和manager.name;
2、方法調用:如manager.hashCode(),返回manager對象的散列碼;
3、數組索引:如emals[0],返回當前對象的郵件列表中的第一個郵件地址。
所有OGNL表達式的計算都是在當前對象的上下文中,一個鏈簡單地使用鏈中先前鏈接的結果作為下一步計算的當前對象。我們看如下所示的鏈:
name.toCharArray()[0].numericValue.toString()
這個表達式按照下列的步驟進行計算:
1、獲取根對象的name屬性;
2、在String結果上調用toCharArray()方法;
3、從char數組中提取第一個字符;
4、從提取的字符對象上行到numericValue屬性(這個字符被表示為Character對象,Character類有一個getNumericValue()方法);
5、在Integer對象結果上調用toString()方法。
這個表達式最終結果是最后返回的toString()方法調用返回的字符串。
常量
OGNL支持的所有常量類型:
1、字符串常量:
以單引號或雙引號括起來的字符串。如”hello”,’hello’。
不過要注意的是,如果是單個字符的字符串常量,必須使用雙引號。
2、字符常量:
以單引號括起來的字符。如’a'。
3、數值常量:
除了Java中的int、long、float和double外,OGNL還讓你使用“b”或“B”后綴指定BigDecimal常量,用“h”“H”后綴指定BigInteger常量。
4、布爾常量:
true和false。
5、null常量。
操作符
OGNL除了支持所有的Java操作符外,還支持以下幾種:
1、逗號,
與C語言中的逗號操作符類似。
2、花括號{}
用于創建列表,元素之間用逗號分隔。
3、in和not in
用于判斷一個值是否在集合中。
訪問JavaBean的屬性
假如有一個employee對象作為OGNL上下文的根對象,那對于下面的表達式:
1、name
對應的java代碼是employee.getName();
2、address.country
對應的java代碼是employee.getAddress().getCountry();
訪問靜態方法和靜態字段
@class@method(args) //調用靜態方法
@class@field //調用靜態字段
其中class必須給出完整的類名(包括包名),如果省略class,那么默認使用的類是java.util.Math,如:
@@min(5,3)
@@max(5,3)
@@PI
索引訪問
OGNL支持多種索引方式的訪問。
1、數組和列表索引
在OGNL中,數組和列表可以大致看成是一樣的。
如:array[0]、list[0]。表達式:{’zhangsan’,'lisi’,'wangwu’}[1]等。
2、JavaBean的索引屬性
要使用索引屬性,需要提供兩對setter和getter方法,一對用于數組,一對用于數組中的元素。
如:有一個索引屬性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;}
對于表達式interest[2],OGNL可以正確解釋這個表達式,調用getInterest(2)方法。如果是設置的情況下,會調用setInterest(2,value)方法。
3、OGNL對象的索引屬性
JavaBean的索引屬性只能使用整型作為索引,OGNL擴展了索引屬性的概念,可以使用任意的對象來作為索引。
對集合進行操作
1、創建集合:
創建列表
使用花括號將元素包含起來,元素之間使用逗號分隔。如{’zhangsan’,'lisi’,'wangwu’}
創建數組
OGNL中創建數組與Java語言中創建數組類似。
創建Map
Map使用特殊的語法來創建 #{”key”:value, ……}
如果想指定創建的Map類型,可以在左花括號前指定Map實現類的類名。如:
#@java.util.LinkedHashMap@{”key”:”value”,….}
Map通過key來訪問,如map["key"]或map.key。
2、投影
OGNL提供了一種簡單的方式在一個集合中對每一個元素聞調用相同的方法,或者抽取相同的屬性,并將結果保存為一個新的集合,稱之為投影。
假如employees是一個包含了employee對象的列表,那么
#employees.{name}將返回所有雇員的名字的列表。
在投影期間,使用#this變量來引用迭代中的當前元素。
如:objects.{#this instanceof String? #this: #this.toString()}
3、選擇
OGNL提供了一種簡單的方式來使用表達式從集合中選擇某些元素,并將結果保存到新的集合中,稱為選擇。
如#employees.{?#this.salary>3000}
將返回薪水大于3000的所有雇員的列表。
#employees.{^#this.salary>3000}
將返回第一個薪水大于3000的雇員的列表。
#employees.{$#this.salary>3000}
將返回最后一個薪水大于3000的雇員的列表。
lambda表達式
lambda表達式的語法是: :[...]。OGNL中的lambda表達式只能使用一個參數,這個參數通過#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(對象圖導航語言),它是一種強大的表達式語言,讓你通過簡單一致的表達式語法來讀取和設置Java對象的屬性值,調用對象的方法,遍歷整個對象的結構圖,實現字段類型轉換等功能。
為什么使用OGNL
相對于其它的表達式語言,OGNL的功能更為強大,它提供了很多高級而必需的特性,例如強大的類型轉換功能、靜態或實例方法的執行、跨集合投影,以及動態lambda表達式定義等。
OGNL基礎
OGNL表達式的計算都是圍繞OGNL上下文來進行的,OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類(實現了 java.util.Map接口)來表示。OGNL上下文可以包含一個或多個JavaBean對象,在這些對象中有一個是特殊的,這個對象就是上下文的根 (root)對象。如果在寫表達式的時候,沒有指定使用上下文中的哪一個對象,那么根對象將被假定為表達式所依據的對象。
在OGNL上下文中,只能有一個根對象,如果你訪問根對象,那么在寫表達式的時候,直接寫對象的屬性就可以了;否則,你需要使用“#key”前綴,例如表達式#namager.name。
OGNL表達式
OGNL表達式的基礎單元就是導航鏈,通常簡稱為鏈(chain)。最簡單的鏈由下列部分組成:
1、屬性名:如name和manager.name;
2、方法調用:如manager.hashCode(),返回manager對象的散列碼;
3、數組索引:如emals[0],返回當前對象的郵件列表中的第一個郵件地址。
所有OGNL表達式的計算都是在當前對象的上下文中,一個鏈簡單地使用鏈中先前鏈接的結果作為下一步計算的當前對象。我們看如下所示的鏈:
name.toCharArray()[0].numericValue.toString()
這個表達式按照下列的步驟進行計算:
1、獲取根對象的name屬性;
2、在String結果上調用toCharArray()方法;
3、從char數組中提取第一個字符;
4、從提取的字符對象上行到numericValue屬性(這個字符被表示為Character對象,Character類有一個getNumericValue()方法);
5、在Integer對象結果上調用toString()方法。
這個表達式最終結果是最后返回的toString()方法調用返回的字符串。
常量
OGNL支持的所有常量類型:
1、字符串常量:
以單引號或雙引號括起來的字符串。如”hello”,’hello’。
不過要注意的是,如果是單個字符的字符串常量,必須使用雙引號。
2、字符常量:
以單引號括起來的字符。如’a'。
3、數值常量:
除了Java中的int、long、float和double外,OGNL還讓你使用“b”或“B”后綴指定BigDecimal常量,用“h”“H”后綴指定BigInteger常量。
4、布爾常量:
true和false。
5、null常量。
操作符
OGNL除了支持所有的Java操作符外,還支持以下幾種:
1、逗號,
與C語言中的逗號操作符類似。
2、花括號{}
用于創建列表,元素之間用逗號分隔。
3、in和not in
用于判斷一個值是否在集合中。
訪問JavaBean的屬性
假如有一個employee對象作為OGNL上下文的根對象,那對于下面的表達式:
1、name
對應的java代碼是employee.getName();
2、address.country
對應的java代碼是employee.getAddress().getCountry();
訪問靜態方法和靜態字段
@class@method(args) //調用靜態方法
@class@field //調用靜態字段
其中class必須給出完整的類名(包括包名),如果省略class,那么默認使用的類是java.util.Math,如:
@@min(5,3)
@@max(5,3)
@@PI
索引訪問
OGNL支持多種索引方式的訪問。
1、數組和列表索引
在OGNL中,數組和列表可以大致看成是一樣的。
如:array[0]、list[0]。表達式:{’zhangsan’,'lisi’,'wangwu’}[1]等。
2、JavaBean的索引屬性
要使用索引屬性,需要提供兩對setter和getter方法,一對用于數組,一對用于數組中的元素。
如:有一個索引屬性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;}
對于表達式interest[2],OGNL可以正確解釋這個表達式,調用getInterest(2)方法。如果是設置的情況下,會調用setInterest(2,value)方法。
3、OGNL對象的索引屬性
JavaBean的索引屬性只能使用整型作為索引,OGNL擴展了索引屬性的概念,可以使用任意的對象來作為索引。
對集合進行操作
1、創建集合:
創建列表
使用花括號將元素包含起來,元素之間使用逗號分隔。如{’zhangsan’,'lisi’,'wangwu’}
創建數組
OGNL中創建數組與Java語言中創建數組類似。
創建Map
Map使用特殊的語法來創建 #{”key”:value, ……}
如果想指定創建的Map類型,可以在左花括號前指定Map實現類的類名。如:
#@java.util.LinkedHashMap@{”key”:”value”,….}
Map通過key來訪問,如map["key"]或map.key。
2、投影
OGNL提供了一種簡單的方式在一個集合中對每一個元素聞調用相同的方法,或者抽取相同的屬性,并將結果保存為一個新的集合,稱之為投影。
假如employees是一個包含了employee對象的列表,那么
#employees.{name}將返回所有雇員的名字的列表。
在投影期間,使用#this變量來引用迭代中的當前元素。
如:objects.{#this instanceof String? #this: #this.toString()}
3、選擇
OGNL提供了一種簡單的方式來使用表達式從集合中選擇某些元素,并將結果保存到新的集合中,稱為選擇。
如#employees.{?#this.salary>3000}
將返回薪水大于3000的所有雇員的列表。
#employees.{^#this.salary>3000}
將返回第一個薪水大于3000的雇員的列表。
#employees.{$#this.salary>3000}
將返回最后一個薪水大于3000的雇員的列表。
lambda表達式
lambda表達式的語法是: :[...]。OGNL中的lambda表達式只能使用一個參數,這個參數通過#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)
<s:set name="hello" value="'Hello Miky as Miky'"></s:set> ----定義源字符串
<s:property value="#hello.substring(#hello.indexOf('as')+2)"/> ---輸出字符串。結果為 Miky
Struts2的值是保存在ValueStack中的,假設有一個字符串str,我們一般是這么取值的:
<s:property value="str"/> 或者 ${str}
如果想在jsp中使用的話,可以這么?。?/p>
<%@ page import="com.opensymphony.xwork2.util.ValueStack" %>
……
<%= ((ValueStack)request.getAttribute("struts.valueStack")).findString("str") %>
也可以把ValueStack中的值先放到attribute中,然后直接取attribute的值:
<s:set name="str" value="%{str}" />
<%=request.getAttribute("str") %>
方法一:
<s:set name="str" value="'Hello World'"></s:set>
<s:property value="%{@com.common.Constant@func(#str)}"/>
func是類com.common.Constant里面的一個靜態方法
str是動態的參數
方法二:
<s:bean name="com.common.StrutsHelper" id="helper" />
<s:set name="str" value="'Hello World'"></s:set>
<s:property value="#helper.func(#str)" />
func是類com.common.StrutsHelper里面的一個普通方法
str是動態方法
s:bean其實是對類StrutsHelper的實例化,跟方法一有些區別,方法一里的函數必須是靜態的