hyljava

          #

          離職與跳槽轉載

          看到斬建通在網易上寫的文章比較好分享下
          http://service.bbs.163.com/bbs/tyro/290302532.html
          無意中看到張子陽的博客中的這篇文章,個人覺得挺好的就轉載過來跟大家分享了,就擅自轉載過來跟大家分享了。——靳建通

          收入是由什么決定的?
          這位員工辭職的原因主要有兩個:
          • 公司的薪水無法達到他的預期,未來一年在公司的收入前景也不是很明確。
          • 想要去做更底層的開發,方向是使用C/C++開發3D圖形圖像。而我們公司主要是.NET開發。
          既然其中的一個原因是薪水無法符合預期,那么首先要搞清楚的就是收入是由什么決定的。
          1.積累首先要說的一點就是:積累。積累就是你在這家公司所創造的價值的積累。
          你今天所領的薪水,并不是由你現在所創造的價值所決定的,而是包含了以前一段時期內其他同事所創造的價值。舉個例子來說,公司目前排名前三的大客戶:客戶A、客戶B、客戶C。
          • 客戶A是2008年接下來的,現在每年為公司貢獻600萬。
          • 客戶B是2009年接下來的,現在每年為公司貢獻500萬。
          • 客戶C是2010年接下來的,現在每年為公司貢獻350萬。
          我的年薪是你的兩倍還多??晌乙渤姓J,我現在所能創造的價值,靳建通和我的能力絕對不可能是你的兩倍。可問題是:2008年、2009年、2010年這些年份我都在公司,上面的每一個大客戶,都有我的貢獻。靳建通而你2012年才新進公司,你并沒有之前的積累。所以,新員工入職后,工資相較老員工會低一些是正常的。很多新員工總是認為自己的收入低了,吃虧了,實際上,很多情況下,新員工在加入公司的頭一年,公司僅能維持平衡,即新員工創造的價值全當工資發給他了。靳建通直到第二年,有了上一年的積累之后,公司才有所盈余。而加入半年就離職的員工,對公司來說基本上是虧本的。靳建通這也就解釋了為什么人員流動特別快的公司活不長,因為人力成本太高。
          關于積累,我可以再舉幾個例子說明一下:
          洪小蓮,李嘉誠的秘書,幾十年來一直追隨李嘉誠,她從幾千元的工薪族,做到身家上億的工薪族,享受的是公司成長的回報。這種回報并非是她個人的學識和能力有了大幅的提高而得到的等價交換,很大程度上僅僅是因為她忠誠地待在這趟車上。
          楊元慶,聯想現在的CEO,研究生畢業后就一直追隨柳傳志,盡管一開始從事的是他并不很樂意的銷售工作,但最終還是堅持了下來。上一次注意到他,是看到一則新聞,標題是“楊元慶自掏2000萬獎勵一線員工”。
          上面只是正面的例子,也有反面的例子:
          吳士宏,曾寫了一本書叫做《逆風飛揚》,可謂是紅極一時。1986年進入IBM,1998年離開IBM,進入微軟,擔任微軟中國公司總經理,1999年進入TCL,2002年離開TCL。之后就離開了公眾的視線。我特意去百度搜索靳建通“吳士宏現在在哪里”,沒有任何的消息。我想如果她很成功的話,一定還屬于“公眾人物”,不至于連度娘都不知去向。
          跳槽的話顯然就要放棄先前的積累。比方說,當你跳槽到另一家公司以后,你曾經做過的系統、曾經服務過的客戶仍然在為先前的公司創造著利潤,可是跟你已經一毛錢關系都沒有了(極少數公司有股票,另當別論)。所以跳槽之前要慎重考慮,跳得不好,有可能越跳越低。
          既然新員工相對于老員工來說,收入低一些是正常的,那么老員工工資高也是合情合理的。但是有一些公司,我將其歸為“無良公司”,它們會在老員工的收入高到一定程度的時候,將老員工砍掉,然后再招募低廉的新人來承擔之前老員工的工作,以賺取更高的利潤。我覺得這些都是小聰明,最后的結果就是,聰明能干一些的人,在看出公司的這些伎倆之后果斷離職;能力一般的員工,也會把你這里當成培訓基地,翅膀硬了就飛了,受損的最后還是公司,實在是得不償失。還不如厚待老員工,也讓新進的員工對未來有一個更好的預期。也有一些人向我抱怨說:“老員工待得久了,干勁都被磨光了,每天都是混日子,還不如新員工,不開他開誰?”。然后我反問他:“激勵員工難道不正是你工作的一部分嗎?”。這種情況的出現,更多時候,是管理者的責任,而非員工。
          最后補充一點:我并不認為老員工工資比新員工高就一定是合理的。當公司對一個新員工開出很高的工資時,其實是出于這樣一種期望:他能推動公司進步的更快。而如果他真的這樣做到了,公司進步的更快了、收益更高了,可以反哺老員工,從而公司的整體待遇水平都提高了,不是皆大歡喜嗎?可能一些老員工并不能明白這些,所以,靳建通當招一個新員工工資水平遠高于現有的老員工時,為什么要這樣做,最好能讓老員工知曉。
          2.老板這個“老板”是寬泛的老板,不一定是公司最大的老板。有的時候,公司比較大,你的職位又比較低,大老板連有沒有你這個人都不知道,此時的老板就是你的頂頭上司。很多時候,你的收入與他也有著莫大的關系。靳建通
          對于我來說,我的原則是:在我的能力范圍內,我會為我的員工爭取更好的待遇。表面上看,這樣做很蠢,花6000塊就能雇到一個人,為什么要花8000塊?我不是這樣認為的,我期望能和我的員工形成這樣一種互動:我盡我的能力為你爭取好的待遇,你也盡你的努力做好工作。
          我不能要求員工“你先把工作做好,我自然會給你好的待遇”。總是要有人先邁出一步,總是要有一方先信任另一方,所以在你什么還沒有做的時候,我就先信任你,并且給你盡可能好的待遇,那么我該做的事情都做了,我問心無愧,剩下的,就看你的表現了。
          可能有人會想,都這樣了怎么還會有人提出辭職?實際上,提出辭職的是一個畢業剛一年的小伙子,1989年生,畢業1年多,我給他的待遇是試用期9000,轉正后9500。在給他這個待遇之前,我是進行過一些調研的,我打電話給我的一個表妹,她是西安電子科技大學的研究生(陜西省排名第三的學校,211院校),她和她的同學在今年畢業找工作的時候,多得是6000到8000的工資。所以從這方面來說,我并沒有虧待你,而你要求12K的工資,我并不是不愿意給這么多,你的表現也說明了你是個很有潛力的人才。只是受經濟環境的影響,今年公司的效益不及往年,要在一定程度上節省開支。其次,你讓其他的老員工情何以堪?所以,綜合起來,你的要求超出了我的能力范圍之外,我無法開口向公司申請提高你的薪水。
          3.門檻除了積累和頂頭上司兩個決定因素以外,靳建通第三個決定因素就是你從事工作的門檻。為什么餐廳服務員的收入很低?為什么坐在前臺收發快遞的文員收入很低?因為這些工作的門檻很低,門檻低就意味著你不做有的是人能做,你不做有大批的“后備隊伍”在等著做。靳建通由于龐大的后備隊伍的競爭,你就無法提高自己的要價。而提升自己所從事工作的門檻,實際上就縮減了競爭者的規模。
          程序開發也是一樣。如果你想收入高,你就做一些別人做不了,又有市場的。
          .NET在程序開發中就屬于門檻比較低的一類。個中原因我想大家都懂的,就不在這里贅述了。做.NET不需要你科班出身,或許一點興趣再加上一點時間,或許一個類似北大青鳥的培訓,都可以讓你開始從事.NET開發了。你可以不懂指針、不懂數據結構、不懂算法、不懂匯編、不懂很多東西,但照樣可以做出一個.NET程序來。而這些人往往又是對薪資的要求沒那么高的,這樣無形中就拉低了.NET程序員的“身價”。.NET的易學易會,很大程度上是由于它的封裝性比較好。底層的東西都屏蔽掉了,你只要知道學習一下命名空間,然后尋找相關的API去調用就好了。記得我們公司曾經開發過一個基于C語言的手持設備程序,沒有任何的類庫支持,連排序、鏈表這樣.NET中的基本功能,都要自己來實現,更別提內存管理和程序邏輯了,和.NET比起來,門檻就相對高一些了。
          所以,如果想收入高一些,那么就去做更高難度的技術工作,這里隨便想了幾個例子:
          • 百度、谷歌的搜索引擎算法。
          • 微軟、谷歌、蘋果的操作系統。
          • 網絡游戲,例如《征途》的游戲引擎。
          • 大型企業的ERP,比方說SAP。
          • 軟硬結合,比如單片機,電氣自動化。
          • 以及我這位即將離職的同事說的,3D圖形圖像。
          所以,從這個角度來看,這位同事的辭職是明智的,他很年輕,靳建通有的是機會重新選擇自己的道路,所以我也祝愿他能有更好的發展。而這些好賺的錢,就留給我們來做了:-)。
          4.平臺接下來要說的一個決定因素是平臺。很多程序員覺得30歲就瓶頸了,30歲寫程序就到頭了,實際上,這只是你的平臺比較小罷了。就拿我自己的公司來說,平臺就不大,只要是踏踏實實工作過5年的程序員,基本上就能夠勝任公司90%的技術工作了,剩下的10%,請教一下其他同事,進行一下技術交流,也完全能夠解決。這樣就存在一個問題:隨著你年齡的增長,你的生活壓力越來越大,要求越來越高,可是公司只要5年經驗的程序員就夠用了。假設市場上5年經驗的程序員的平均要求是10K,憑什么要給你15K?你的優勢在哪里?如果你沒有突破,就會有“30歲寫程序就到頭了”的感覺。
          而如果平臺大一些情況就會不一樣,比方說,你去了IBM,可能5年的經驗不過剛剛入門而已。IBM有一個工程院,其中有5位院士(IBM Fellow)獲得過諾貝爾獎,很多人鉆研技術都超過20年或者更久。如果你對技術感興趣,并執著去鉆研的話,你可以不斷地去挑戰和攀登。
          當然,你可能沒那么好的運氣和實力進入IBM,那么其他一些中型的平臺也是不錯的,比方說阿里巴巴、金蝶、百度、騰訊等等。在這里,至少你有足夠的理由和需要再去進行深入學習。因為在這些地方,5年的經驗是遠遠不夠的,還需要進一步地學習和努力。
          如果你和我一樣,不巧沒有那么大的平臺,此時的選擇大概有這么幾種:
          1. 你可以憑借你在公司的積累(第一節講過的),過比較安逸的日子。如果比較幸運,押對了寶,公司發展得比較好,收入一樣會變得非??捎^;如果比較不幸,公司經營的狀況不好,那就要承擔比較大的風險了。說得難聽一點,公司倒閉了你去哪里?你過去的積累已經一文不值,靳建通而你的年齡已經35,水平卻相當于只有5年經驗。你的競爭力在哪里?
          2. 你可以憑自己的努力將現在所在的平臺做大,換言之,把自己的小公司做大。這當然是比較積極的做法,也是我一直努力的方向。現在你看到的大公司,不也是從小公司一步一步做起的嗎?不過這里還有兩個問題:1、有的時候,你的力量在公司中的占比沒那么大,你再怎么努力推進的速度也還是有限;2、你缺乏慧眼,選中的公司本身就缺乏長大的資質。我們往往只看到成功了的公司,卻忽視了更多在競爭中倒下的公司。
          3. 主動選擇更大的平臺,也就是跳槽了。但是跳槽也是有風險的,尤其是過了30歲的程序員,你在這家公司的收入高,是因為有之前的積累,換一家就沒有積累了,等于從新人開始,而大多數的公司,5年經驗的程序員就夠用了。如果跳得不好,收入還可能越跳越低,如果還有老婆、孩子、房貸,那將面臨更大的壓力。所以當你想要從一個低的平臺向更高的平臺跳躍的時候,平時就要做足功夫,認真積累自己的實力。對于我來說,我缺乏大型項目的管理經驗,但是沒關系,我努力學習考一個PMP沒什么問題吧?我缺乏大型軟件的架構經驗,但是沒關系,我把.NET的基礎知識和各種設計模式掰開了揉碎了沒什么問題吧?我缺乏大型團隊的管理經驗,但是沒關系,每次遇到管理方面的問題我都認真思考仔細總結沒什么問題吧?有些人總是抱怨沒有機會,運氣不好,我想機會總是有的,但只屬于有準備的人。
          5.行業我想說的最后一點就是行業。有時候你覺得已經萬事俱備了,可是你所處的這個行業本身就屬于極低利潤率的,你再怎么努力也很難有很高的收入。很多情況下,可能公司也想提高你的待遇,但是由于缺乏利潤的支撐,公司也是有心無力。所以,在選擇公司,尤其是小公司的時候,要重點考察一下公司所處的行業如何?是不是前景比較好、利潤比較高的行業?如果是大公司的話,靳建通這方面的問題就會少一些,因為如果方向有問題,它就無法做成大公司。
          行業是有周期性的,可能在一段時期內這個行業好,下一段時期這個行業就不行了。最典型的一個例子就是軟盤,我現在的老板在成立這家公司之前是做銷售的,他有一個客戶,做索尼軟盤的,這種軟盤我想很多80后都見過。當時生意做得很大,可是當光盤出來以后,軟盤的市場是會急劇萎縮的,可是這家公司的領導層居然沒有看到,或者是看到了但不愿意轉變,像鴕鳥一樣在危機來臨時把頭埋在土里,繼續做它的軟盤。幾年以后,這家公司就倒掉了。
          選擇行業也不是選擇暴利行業就一定好,比方說房地產。資本都是逐利的,當一個行業屬于暴利,同時所有人都知道它是暴利的時候,危機就來了。這個危機就是會有大量的社會資源、人力物力投入到這個行業中企圖分一杯羹。而全局上又沒有一個統一的把控,這個行業究竟需要多少公司才是合適的?最后的結果就是過剩。就好像股票在崩盤時,也許跌到3000點是比較合理也比較正常的位置,靳建通但是由于人們的恐慌,它就跌到1600點了。
          感謝閱讀,希望這篇文章能給你帶來收獲。
          不是所有一年工作經驗的畢業生都有這樣的待遇,我主要是看能力,而不是年齡、學歷等。特別說明一下,以免誤導。

          posted @ 2013-02-24 11:20 何云隆 閱讀(1790) | 評論 (1)編輯 收藏

          實現文件瀏覽功能

          用java的圖形用戶界面實現文件瀏覽功能(需要導包)
          import org.eclipse.swt.SWT;
          import org.eclipse.swt.widgets.Display;
          import org.eclipse.swt.widgets.FileDialog;
          import org.eclipse.swt.widgets.MessageBox;
          import org.eclipse.swt.widgets.Shell;
          import org.eclipse.swt.widgets.Label;
          import org.eclipse.swt.widgets.Text;
          import org.eclipse.swt.widgets.Button;
          import org.eclipse.swt.events.SelectionAdapter;
          import org.eclipse.swt.events.SelectionEvent;
          import org.eclipse.swt.widgets.Group;
          import org.eclipse.wb.swt.SWTResourceManager;
          public class TestShell  {
          protected Shell shell;
           
          private Text text_file;
           
          public static void main(String[] args) {
          try {
          TestShell window = new TestShell();
          window.open();
          } catch (Exception e) {
          e.printStackTrace();
          }
          }
          /**
          * Open the window.
          */
          public void open() {
          Display display = Display.getDefault();
          createContents();
          shell.open();
          shell.layout();
          while (!shell.isDisposed()) {
          if (!display.readAndDispatch()) {
          display.sleep();
          }
          }
          }
          /**
          * Create contents of the window.
          */
          protected void createContents() {
          shell = new Shell();
          shell.setSize(500, 200);
          shell.setText("解析WSDL");
          text_file = new Text(shell, SWT.BORDER);
          text_file.setBounds(80, 33, 290, 24);
          //實現文件瀏覽功能
          Button browseButton = new Button(shell,SWT.PUSH);
          browseButton.setText("瀏覽...");
          browseButton.setFont(SWTResourceManager.getFont("Tahoma", 12, SWT.NORMAL));
          browseButton.setBounds(383, 33, 80, 24);
          browseButton.addSelectionListener(new SelectionAdapter(){
          /* (non-Javadoc)
          * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
          */
          public void widgetSelected(SelectionEvent e){
          FileDialog dialog = new FileDialog (shell, SWT.OPEN);
          dialog.setText("Source Folder Selection");
          dialog.setFilterExtensions(new String[] {"*.txt","*.jpg","*.*"});
          String filePath = dialog.open();
          if(dialog!=null){
          text_file.setText(filePath);
          }
          }
          });
          Button button_exe = new Button(shell, SWT.NONE);
          button_exe.addSelectionListener(new SelectionAdapter() {
          @Override
          public void widgetSelected(SelectionEvent e) {
          MessageBox msgbox = new MessageBox(shell,
          SWT.ICON_QUESTION | SWT.OK);
          msgbox.setText("提示");
          String file = "";
          file = text_file.getText();
          if(file.equals("") || file == null){
          msgbox.setMessage("WSDL文件不能為空");
          msgbox.open();
          return;
          }else{
          msgbox.setMessage("文件獲取到了!?。?);
          System.out.println(file);
          msgbox.open();
          }
          }
          });
          button_exe.setFont(SWTResourceManager.getFont("Tahoma", 12, SWT.NORMAL));
          button_exe.setBounds(214, 133, 87, 23);
          button_exe.setText("\u6267\u884C");
          Group group = new Group(shell, SWT.NONE);
          group.setBounds(10, 10, 472, 117);
          Label label = new Label(group, SWT.NONE);
          label.setBounds(10, 23, 105, 24);
          label.setFont(SWTResourceManager.getFont("Tahoma", 12, SWT.NORMAL));
          label.setText("源文件:");
          }
          }

          posted @ 2013-02-23 20:55 何云隆 閱讀(1515) | 評論 (1)編輯 收藏

          Spring中的JDBCTemplate使用(非常詳細的配置過程)

          Spring中的JDBCTemplate使用

          數據庫準備:

          創建數據庫

          創建表:

          Java代碼:

          1、創建web 工程  springJdbcTemplate

          2、添加Spring能力 在此需要將jdbc包也同時加入



          3、配置上mysql的連接驅動(拷貝mysql驅動包,如果不拷貝報錯很詭異)
          applicationContext.xml中進行配置

          beans標簽中填寫

          <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

          <property name="dataSource">

          <ref local="dataSource" />

          </property>

          </bean>

           <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

           <property name="driverClassName">

          <value>com.mysql.jdbc.Driver</value>

          </property>

          <property name="url">

          <value>jdbc:mysql://localhost:3306/myspringjdbcdb</value>

          </property>

          <property name="username">

          <value>root</value>

          </property>

          <property name="password">

          <value>root</value>

          </property>

           

           

           </bean>

          4、創建包結構并且寫出類(每個類中可以沒內容)

          5、每個類中的源代碼

          UserDao.java



          UserDaoImp.java


          此項寫完填寫applicationContext.xml中進行配置

          beans標簽中填寫


          User.java


          每個成員變量都寫上get和set方法

          并且在此類中還要加入

           

          此項寫完填寫applicationContext.xml中進行配置

          beans標簽中填寫


          測試類TestAction.java


          打印出結果:


           

          posted @ 2013-02-22 20:33 何云隆 閱讀(38359) | 評論 (1)編輯 收藏

          Remote Object Service

          Remote Object Service
          對于主流的Flex數據服務器,目前都支持AMF3/RemoteObject,今天我們就來談一談BlazeDS的遠程服務。

          1. 編寫遠程服務類

          編寫BlazeDS的Java遠程服務類有三個要求:

          1) 所有被調用的方法必須是public;

          2) 所有的編譯類必須能夠通過BlazeDS的classpath訪問得到;

          3) 類必須是stateful/stateless的。

          大家可以參考工程文件中的SimpleService.java。

          2. 配置remoting-config.xml

          Java服務類寫好后,還需要配置,BlazeDS的Remote Service也是在服務器端對應了一個配置文件:remoting-config.xml,配置好Remote Service 后,Flex在運行時才能找到相應的服務類并調用其方法。下面就是本工程的Remote Service配置文件。

          配置文件

          第2~3行指定服務的ID和對應的類,第5~7行設置適配器(adapters)的ID和對應的類。第9~11行指定默認的通道(channels)及其參照,該通道是在 services-config.xml中定義的。適配器和通道可以設置多個,采用第一個優先的原則。前面這幾項設置適用于proxy-config.xml、remoting-config.xml和我們后面要講的 messaging-config.xml。

          第13~18行設置的服務終端(destination),該屬性必須和RemoteObject組件的服務終端屬性一致。按照服務的種類,服務終端又可以分為代理服務終端、遠程服務終端和消息服務終端。上一次講述的代理服務終端,需要指定該終端的url,而這次我們講述的遠程服務終端,需要指定該目標的source和scope。source對應 RemoteObject要調用的遠程服務的全限定類名,不像FluorineFX,它不能在RemoteObject組件中指定。scope表示當前遠程服務的作用范圍,即遠程服務類是stateful還是stateless,有application、session和request三個選項。

          注意:我們提倡在配置文件中設置,這樣更安全也方便后期維護。

          3. 使用RemoteObjec組件

          對于RemoteObjec組件,請參看
          下面的Flex RemoteObject類參考相關內容。一句話,Flex的RemoteObject與后臺語言是無關的。在工程文件中的BasicRemoteObject.mxml,調用了SimpleService類的三個方法,當通過BlazeDS從J2EE服務器返回RemoteObjec時,Java數據被序列化成ActionScript數據。其中Java字符串對應ActionScript字符串,Java的數組列表對應ActionScript ArrayCollection。


          Flex RemoteObject類參考


          <mx:RemoteObject>標記允許使用AMF3訪問遠程服務類的方法,要知道在Flex中怎樣使用Flash Remoting訪問數據,應該先了解一下RemoteObject類。

          要知道在Flex中怎樣使用Flash Remoting訪問數據,應該先了解一下RemoteObject類。

          包 mx.rpc.remoting 類 public dynamic class RemoteObject 
          繼承 RemoteObject → AbstractService → Proxy → Object 
          子類 RemoteObject

          一、<mx:RemoteObject>標記

          它允許使用AMF3訪問遠程服務類的方法。

          1. <mx:RemoteObject>允許的標記屬性有:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          <mx:RemoteObject
            Properties
            concurrency="multiple|single|last"
            destination="No default."
            id="No default."
            endpoint="No default."
            showBusyCursor="false|true"
            source="No default." (currently, Macromedia ColdFusion only)
            makeObjectsBindable="false|true"
            事件
            fault="No default."
            result="No default."  
           />

          2. <mx:RemoteObject>標記可以包含多個 <mx:method> 標記,<mx:method>允許的標記屬性有:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          <mx:method
            Properties
            concurrency="multiple|single|last"
            name="No default, required."
            makeObjectsBindable="false|true"       
           事件
            fault="No default."
            result="No default."
           />

          3. <mx:RemoteObject>標記可以也只能包含一個<mx:arguments> 子標記,該子標記是一個序列數組對象。

          二、公有屬性

          1. concurrency : String

          表示對同一服務怎樣進行多次調用。類似于XMLConnector/WebServiceConnector/RemotingConnector的multipleSimultaneousAllowed屬性。它的默認值為multiple,允許下列值:

          • Multiple:同一時間可以執行多個請求。已有的請求不會被取消;
          • Single:同一時間調用只能執行一個請求,多個請求會報錯;
          • Last:最后一次請求會覆蓋已有的請求。

          2. endpoint: String

          允許開發人員快速為RemoteObject destination(目標)指定endpoint(端點)。而該destination既沒有在編譯時,也沒有在用代碼新建ChannelSet(通道集)時參照services-config.xml。如果設定了該屬性,它會覆蓋已有的ChannelSet。

          如果endpoint 的url 以“https”開關,將使用 SecureAMFChannel, 否則使用普通的AMFChannel。{server.name}和{server.port}標記,可以用在endpoint的url中,表明Channel應該使用用來加載SWF文件的服務名稱和端口。

          3. showBusyCursor:Boolean

          表示服務正在執行時是否顯示一個表示忙碌的鼠標指針。

          三、公有方法

          1. RemoteObject () 構造方法

          創建一個新的RemoteObject對象。

          參數

          destination:String (默認為 null) —RemoteObject 的destination屬性必須匹配 services-config.xml 中的destination的ID屬性值。

          2. initialized ()

          public function initialized(document:Object, id:String):void

          只要設定RemoteObject標記就會通過MXML編譯器自動調用該方法。如果使用ActionScrip新建RemoteObject實例,則可以自行調用該方法,這對驗證其參數很有用。

          參數

          • document:Object —RemoteObject 所在的MXML文檔
          • id:String —RemoteObjec在上述文檔中的ID

          posted @ 2013-01-20 22:46 何云隆 閱讀(1577) | 評論 (0)編輯 收藏

          在Flex中使用ActionScript的三種方法

          在Flex中使用ActionScript,其實和在網頁中使用Javascript等腳本文件類似,主要有三種方式。

          Flex的核心是MXML和ActionScript。MXML是用于為Flex應用程序進行用戶界面組件布局,它屬于表示層,最終要編輯成ActionScript 并生成ActionScript 類文件在Flash Player上運行。如果你是個Java開發者就很好理解這一點,MXML 就好比是JSP/Struts/JSF,它們最終都會編輯成Java類文件并在具備Java虛擬機環境的瀏覽器上運行。所以說,Flex 最核心的還是ActionScript 。在Flex中,ActionScript是 類庫的方式出現的,該類庫包含組件 (容器和控件)、管理器類、數據服務類和所有其他功能的類。本文將談一談在Flex中使用ActionScript的方法。

          其實和在網頁中使用Javascript等腳本文件類似,主要有三種方式。

          1. 內聯方式
          這種方式直接將AS方法作為事件的屬性值,當然這種方法一般只有一行,相對簡單。如果要給方法傳遞對數,這種方法就不可取了。

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          <!--main.mxml -->
          <?xml version="1.0" encoding="utf-8"?> 
          <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
              <mx:Button label="Say Hello" click="sayHello('Flying')"/> 
                  <mx:Script
                      <![CDATA[ 
                          import mx.controls.Alert; 
                          private function sayHello(param_name:String):void { 
                              Alert.show("Hello, "+param_name); 
                      }   
                      ]]>
                  </mx:Script
          </mx:Application>

          2. 級聯方式
          這種方式將AS方法放入<mx:Script></mx:Script>代碼塊中,然后將方法作為事件的屬性值,并可以在調用方法時傳遞參數,從而做到了AS方法在一個文件中的重用。

          1
          2
          3
          4
          5
          6
          <!--main.mxml -->
          <?xml version="1.0" encoding="utf-8"?> 
          <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
          <mx:Script source="myFunction.as"/>  
              <mx:Button label="Say Hello" click="sayHello('Flying');"/> 
          </mx:Application>

          3. 外聯方式

          1
          2
          3
          4
          5
          //myFunction.asimport
          mx.controls.Alert;
          private function sayHello(param_name:String):void {
              mx.controls.Alert.show("Hello, "+param_name);
          }

          上述方式為AS方法單獨新建一個as文件,然后設置該方法為被調用文件的Script元素的source屬性值,并可以在調用方法時傳遞參數,此文件可以在多個文件調用,從而實現了AS方法在多個文件中的重用。

          posted @ 2013-01-20 22:33 何云隆 閱讀(221) | 評論 (0)編輯 收藏

          Flex跳轉

          Flex跳轉到JSP或者其他非Flex頁面

           

          Html代碼
          var url:String="http://"+URLUtil.getServerNameWithPort(Application.application.url)+"/DZDJ/index.jsp?id=" + 1;  
                           ExternalInterface.call('window.open',url,'_top');  

          _top是可變的,_top表示在當前頁面打開,關閉遠頁面。

           

           

           

          導入類:

                  import flash.net.URLRequest;
                  import flash.net.navigateToURL;

          關閉當前瀏覽器:

                                  var url:URLRequest = new URLRequest("javascript:window.close()");
                                  navigateToURL(url,"_top");

                                  (注意:要在服務器上測試,否則會報安全沙箱沖突);

          在瀏覽器上跳轉頁面

                                  navigateToURL(new URLRequest("http://www.baidu.com"),"_top");

          打開一個新的瀏覽器:

                                 var request:URLRequest = new URLRequest("http://www.baidu.com/);
                                 navigateToURL(request);

           

          Flex跳轉到Flex

          FLEX和JSP不一樣,沒有所謂的這個頁面跳轉到另外的一個頁面。一般都是用ViewStack進行頁面切換,其他模塊就需要loadmoudle進行函數設置了。

          <mx:ViewStack x="0" y="0" id="viewstack1" width="619" height="700">
             <mx:Canvas id="View1" width="100%" height="100%">
                <mx:Button label="View2 " click="viewstack1.selectedChild=View2"/>
                 </mx:Canvas>


             <mx:Canvas id="View2" width="100%" height="100%" color="#3FCFE9">
             </mx:Canvas>
          </mx:ViewStack>

          posted @ 2013-01-18 22:41 何云隆 閱讀(1751) | 評論 (0)編輯 收藏

          線程和進程

               摘要: 線程和進程 一,線程的一些基本知識。進程與線程所有的操作系統都支持同時運行多個任務,一個任務通常就是一個程序,每個運行中就是一個進程,當一個程序運行時,內部可能包含了多個順序執行流,每個順序執行流就是一個線程。 進程(process)當一個程序進入內存運行即變成一個進程,進程處于運行過程中的程序,并且具有一定的獨立功能,進程是系統進行資源分配和調用的獨立單位,進程切換開銷大。 多進程在操作系...  閱讀全文

          posted @ 2012-12-08 13:24 何云隆 閱讀(2892) | 評論 (1)編輯 收藏

          java多線程下載

          import java.io.BufferedInputStream;
          import java.io.IOException;
          import java.io.RandomAccessFile;
          import java.net.HttpURLConnection;
          import java.net.URL;
          import java.net.URLConnection;
          import java.util.concurrent.CountDownLatch;
          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;


          public class FileDownLoadTest {
           
           
           private static final int TCOUNT = 10;
           
           private CountDownLatch latch = new CountDownLatch(TCOUNT);

           private long completeLength = 0;
           
           private long fileLength;
           /**
            * @param args
            * @throws Exception
            */
           public static void main(String[] args) throws Exception {
            
            new FileDownLoadTest().download("http://localhost:8080/test/IESSAction.docx");
           }
           
           
           public void download(String address) throws Exception{
            ExecutorService service = Executors.newFixedThreadPool(TCOUNT);
            URL url = new URL(address);
            URLConnection cn = url.openConnection();
            cn.setRequestProperty("Referer", "http://www.test.com");
            fileLength = cn.getContentLength();
            long packageLength = fileLength/TCOUNT;
            long leftLength = fileLength%TCOUNT;
            RandomAccessFile file = new RandomAccessFile("d:\\test.docx","rw");
            //計算每個線程請求文件的開始和結束位置
            long pos = 0;
            long endPos = pos + packageLength;
            for(int i=0; i<TCOUNT; i++){
             if(leftLength >0){
              endPos ++;
              leftLength--;
             }
             service.execute(new DownLoadThread(url, file, pos, endPos));
             pos = endPos;
             endPos = pos + packageLength;
            }
            System.out.println("waiting........................................");
            long begin = System.currentTimeMillis();
            latch.await();
            file.close();
            System.out.println("end........................................");
            System.out.println(System.currentTimeMillis() - begin + "ms");
            service.shutdown();
           }
           
           class DownLoadThread implements Runnable{
            
            private URL url;
            private RandomAccessFile file;
            private long from;
            private long end;
            
            DownLoadThread(URL url, RandomAccessFile file, long from, long end){
             this.url = url;
             this.file = file;
             this.from = from;
             this.end = end;
            }
            
            
            public void run() {
             long pos = from;
             byte[] buf = new byte[512];
             try {
              HttpURLConnection cn = (HttpURLConnection) url.openConnection();
              cn.setRequestProperty("Range", "bytes=" + from + "-" + end);
              if(cn.getResponseCode() != 200 && cn.getResponseCode()!=206){
               run();
               return;
              }
              BufferedInputStream bis = new BufferedInputStream(cn.getInputStream());
              int len ;
              while((len = bis.read(buf)) != -1){
          //     synchronized(file){
                file.seek(pos);
                file.write(buf, 0, len);
          //     }
               pos += len;
               completeLength +=len;
               System.out.println("threadName: " + Thread.currentThread().getName()
                 + "persent: " + completeLength * 100 /fileLength + "%");
              }
              cn.disconnect();
              latch.countDown();
             } catch (IOException e) {
              e.printStackTrace();
              
             }
            }
           }
          }

          posted @ 2012-11-30 11:57 何云隆 閱讀(261) | 評論 (0)編輯 收藏

          JAVA直接操作excel

          JAVA直接操作excel

          /**
           * @Author:何云龍
           * @Version: 2012-11-16 下午03:45:16
           * @Description:
           */
          import jxl.*;
          import java.io.*;
          import jxl.write.*;

          /**
           * <p>
           * java讀取Excel表格,復制、更新Excel工作薄
           * </p>
           */
          public class Test {
           public static void main(String[] args) {
            jxl.Workbook rwb = null;
            try {
             // 構建Workbook對象 只讀Workbook對象
             // 直接從本地文件創建Workbook
             // 從輸入流創建Workbook
             InputStream is = new FileInputStream("D://Book1.xls");
             rwb = Workbook.getWorkbook(is);
             // Sheet(術語:工作表)就是Excel表格左下角的Sheet1,Sheet2,Sheet3但在程序中
             // Sheet的下標是從0開始的
             // 獲取第一張Sheet表
             Sheet rs = rwb.getSheet(0);
             // 獲取Sheet表中所包含的總列數
             int rsColumns = rs.getColumns();
             // 獲取Sheet表中所包含的總行數
             int rsRows = rs.getRows();
             // 獲取指這下單元格的對象引用
             for (int i = 0; i < rsRows; i++) {
              for (int j = 0; j < rsColumns; j++) {
               Cell cell = rs.getCell(j, i);
               System.out.print(cell.getContents() + " ");
              }
              System.out.println();
             }
             // 利用已經創建的Excel工作薄創建新的可寫入的Excel工作薄
             jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(
               "D://Book2.xls"), rwb);
             // 讀取第一張工作表
             jxl.write.WritableSheet ws = wwb.getSheet(0);
             // 獲取第一個單元格對象
             jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
             // 決斷單元格的類型,做出相應的轉化
             if (wc.getType() == CellType.LABEL) {
              Label l = (Label) wc;
              l.setString("The value has been modified.");
             }
             // 寫入Excel對象
             wwb.write();
             wwb.close();
            } catch (Exception e) {
             e.printStackTrace();
            } finally {
             // 操作完成時,關閉對象,翻譯占用的內存空間
             rwb.close();
            }
           }
          }

          posted @ 2012-11-16 15:48 何云隆 閱讀(1602) | 評論 (1)編輯 收藏

          使用java生成縮略圖

          方法1:[第一種方法比后一種生成的縮略圖要清晰]
          import javax.imageio.ImageIO;
          import java.awt.image.BufferedImage;
          import java.awt.image.ColorModel;
          import java.awt.image.WritableRaster;
          import java.awt.*;
          import java.awt.geom.AffineTransform;
          import java.io.InputStream;
          import java.io.File;
          import java.io.FileOutputStream;

          public class Test {
           public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
           // targetW,targetH分別表示目標長和寬
           int type = source.getType();
           BufferedImage target = null;
           double sx = (double) targetW / source.getWidth();
           double sy = (double) targetH / source.getHeight();
           //這里想實現在targetW,targetH范圍內實現等比縮放。如果不需要等比縮放
           //則將下面的if else語句注釋即可
           if(sx>sy)
           {
           sx = sy;
           targetW = (int)(sx * source.getWidth());
           }else{
           sy = sx;
           targetH = (int)(sy * source.getHeight());
           }
           if (type == BufferedImage.TYPE_CUSTOM) { //handmade
           ColorModel cm = source.getColorModel();
           WritableRaster raster = cm.createCompatibleWritableRaster(targetW, targetH);
           boolean alphaPremultiplied = cm.isAlphaPremultiplied();
           target = new BufferedImage(cm, raster, alphaPremultiplied, null);
           } else
           target = new BufferedImage(targetW, targetH, type);
           Graphics2D g = target.createGraphics();
           //smoother than exlax:
           g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY );
           g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
           g.dispose();
           return target;
           }
           public static void saveImageAsJpg (String fromFileStr,String saveToFileStr,int width,int hight)
           throws Exception {
           BufferedImage srcImage;
          // String ex = fromFileStr.substring(fromFileStr.indexOf("."),fromFileStr.length());
           String imgType = "JPEG";
           if (fromFileStr.toLowerCase().endsWith(".png")) {
           imgType = "PNG";
           }
          // System.out.println(ex);
           File saveFile=new File(saveToFileStr);
           File fromFile=new File(fromFileStr);
           srcImage = ImageIO.read(fromFile);
           if(width > 0 || hight > 0)
           {
           srcImage = resize(srcImage, width, hight);
           }
           ImageIO.write(srcImage, imgType, saveFile);

           }
           
           public static void main (String argv[]) {
           try{
           //參數1(from),參數2(to),參數3(寬),參數4(高)
           Test.saveImageAsJpg("E:/Document/My Pictures/3.gif","c:/6.gif",50,50);
           } catch(Exception e)
           {
           e.printStackTrace();
           }

           }
          }

          方法2:
           import java.io.*;
           import java.util.*;
           import com.sun.image.codec.jpeg.*;
           import java.awt.image.*;
           import java.awt.*;
           import java.net.*;
           import java.applet.*;
           import java.sql.*;

          //縮略圖類,
          //本java類能將jpg圖片文件,進行等比或非等比的大小轉換。
          //具體使用方法
          //s_pic(大圖片路徑,生成小圖片路徑,大圖片文件名,生成小圖片文名,生成小圖片寬度,生成小圖片高度,是否等比縮放(默認為true))
           public class Tes {
           String InputDir; //輸入圖路徑
           String OutputDir; //輸出圖路徑
           String InputFileName; //輸入圖文件名
           String OutputFileName; //輸出圖文件名
           int OutputWidth = 80; //默認輸出圖片寬
           int OutputHeight = 80; //默認輸出圖片高
           int rate = 0;
           boolean proportion = true; //是否等比縮放標記(默認為等比縮放)

           public Tes() {
          //初始化變量
           InputDir = "";
           OutputDir = "";
           InputFileName = "";
           OutputFileName = "";
           OutputWidth = 80;
           OutputHeight = 80;
           rate = 0;
           }

           public void setInputDir(String InputDir) {
           this.InputDir = InputDir;
           }

           public void setOutputDir(String OutputDir) {
           this.OutputDir = OutputDir;
           }

           public void setInputFileName(String InputFileName) {
           this.InputFileName = InputFileName;
           }

           public void setOutputFileName(String OutputFileName) {
           this.OutputFileName = OutputFileName;
           }

           public void setOutputWidth(int OutputWidth) {
           this.OutputWidth = OutputWidth;
           }

           public void setOutputHeight(int OutputHeight) {
           this.OutputHeight = OutputHeight;
           }

           public void setW_H(int width, int height) {
           this.OutputWidth = width;
           this.OutputHeight = height;
           }

           public String s_pic() {
           BufferedImage image;
           String NewFileName;
          //建立輸出文件對象
           File file = new File(OutputDir + OutputFileName);
           FileOutputStream tempout = null;
           try {
           tempout = new FileOutputStream(file);
           } catch (Exception ex) {
           System.out.println(ex.toString());
           }
           Image img = null;
           Toolkit tk = Toolkit.getDefaultToolkit();
           Applet app = new Applet();
           MediaTracker mt = new MediaTracker(app);
           try {
           img = tk.getImage(InputDir + InputFileName);
           mt.addImage(img, 0);
           mt.waitForID(0);
           } catch (Exception e) {
           e.printStackTrace();
           }

           if (img.getWidth(null) == -1) {
           System.out.println(" can't read,retry!" + "<BR>");
           return "no";
           } else {
           int new_w;
           int new_h;
           if (this.proportion == true) { //判斷是否是等比縮放.
          //為等比縮放計算輸出的圖片寬度及高度
           double rate1 = ((double) img.getWidth(null)) /
           (double) OutputWidth + 0.1;
           double rate2 = ((double) img.getHeight(null)) /
           (double) OutputHeight + 0.1;
           double rate = rate1 > rate2 ? rate1 : rate2;
           new_w = (int) (((double) img.getWidth(null)) / rate);
           new_h = (int) (((double) img.getHeight(null)) / rate);
           } else {
           new_w = OutputWidth; //輸出的圖片寬度
           new_h = OutputHeight; //輸出的圖片高度
           }
           BufferedImage buffImg = new BufferedImage(new_w, new_h,
           BufferedImage.TYPE_INT_RGB);

           Graphics g = buffImg.createGraphics();

           g.setColor(Color.white);
           g.fillRect(0, 0, new_w, new_h);

           g.drawImage(img, 0, 0, new_w, new_h, null);
           g.dispose();

           JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(tempout);
           try {
           encoder.encode(buffImg);
           tempout.close();
           } catch (IOException ex) {
           System.out.println(ex.toString());
           }
           }
           return "ok";
           }

           public String s_pic(String InputDir, String OutputDir, String InputFileName,
           String OutputFileName) {
          //輸入圖路徑
           this.InputDir = InputDir;
          //輸出圖路徑
           this.OutputDir = OutputDir;
          //輸入圖文件名
           this.InputFileName = InputFileName;
          //輸出圖文件名
           this.OutputFileName = OutputFileName;
           return s_pic();
           }

           public String s_pic(String InputDir, String OutputDir, String InputFileName,
           String OutputFileName, int width, int height,
           boolean gp) {
          //輸入圖路徑
           this.InputDir = InputDir;
          //輸出圖路徑
           this.OutputDir = OutputDir;
          //輸入圖文件名
           this.InputFileName = InputFileName;
          //輸出圖文件名
           this.OutputFileName = OutputFileName;
          //設置圖片長寬
           setW_H(width, height);
          //是否是等比縮放 標記
           this.proportion = gp;
           return s_pic();
           }

           public static void main(String[] a) {
          //s_pic(大圖片路徑,生成小圖片路徑,大圖片文件名,生成小圖片文名,生成小圖片寬度,生成小圖片高度)
           Tes mypic = new Tes();
           System.out.println(
           mypic.s_pic("E://Document//My Pictures//",
           "E://Document//My Pictures//",
           "topbg-3.gif", "3.gif", 400, 400, true)
           );

           }
           }

          3.jsp方式
          java.io.*,java.awt.Image,java.awt.image.*,com.sun.image.codec.jpeg.*,

            try
              {
           java.io.File file = new java.io.File("E://Document//My Pictures//3.gif");
           String newurl="E://Document//My Pictures//32.gif"; //新的縮略圖保存地址
           Image src = javax.imageio.ImageIO.read(file); //構造Image對象
           float tagsize=200;
           int old_w=src.getWidth(null); //得到源圖寬
           int old_h=src.getHeight(null);
           int new_w=0;
           int new_h=0; //得到源圖長
           int tempsize;
           float tempdouble;
           if(old_w>old_h){
           tempdouble=old_w/tagsize;
           }else{
           tempdouble=old_h/tagsize;
           }
           new_w=Math.round(old_w/tempdouble);
           new_h=Math.round(old_h/tempdouble);//計算新圖長寬
           BufferedImage tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);
           tag.getGraphics().drawImage(src,0,0,new_w,new_h,null); //繪制縮小后的圖
           FileOutputStream newimage=new FileOutputStream(newurl); //輸出到文件流
           JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
           encoder.encode(tag); //近JPEG編碼
           newimage.close();

          }catch (Exception e){

          e.toString();

          }

          posted @ 2012-11-16 15:41 何云隆 閱讀(285) | 評論 (0)編輯 收藏

          僅列出標題
          共11頁: First 上一頁 3 4 5 6 7 8 9 10 11 下一頁 
          主站蜘蛛池模板: 凤城市| 根河市| 汝阳县| 新竹县| 平度市| 万载县| 林周县| 阳曲县| 滨海县| 临邑县| 吉水县| 青神县| 沐川县| 吴川市| 新密市| 阿城市| 肇源县| 徐水县| 乃东县| 罗江县| 南靖县| 巴林左旗| 佛教| 玛多县| 峡江县| 祁连县| 汨罗市| 东乌珠穆沁旗| 夏津县| 曲水县| 龙岩市| 石棉县| 玛沁县| 新沂市| 博兴县| 通许县| 天等县| 达孜县| 闻喜县| 孟连| 交城县|