java socket編程

          http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
          http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/一,網(wǎng)絡編程中兩個主要的問題

          一個是如何準確的定位網(wǎng)絡上一臺或多臺主機,另一個就是找到主機后如何可靠高效的進行數(shù)據(jù)傳輸。

          在TCP/IP協(xié)議中IP層主要負責網(wǎng)絡主機的定位,數(shù)據(jù)傳輸?shù)穆酚桑蒊P地址可以唯一地確定Internet上的一臺主機。

          而TCP層則提供面向應用的可靠(tcp)的或非可靠(UDP)的數(shù)據(jù)傳輸機制,這是網(wǎng)絡編程的主要對象,一般不需要關心IP層是如何處理數(shù)據(jù)的。

          目前較為流行的網(wǎng)絡編程模型是客戶機/服務器(C/S)結構。即通信雙方一方作為服務器等待客戶提出請求并予以響應。客戶則在需要服務時向服務器提 出申請。服務器一般作為守護進程始終運行,監(jiān)聽網(wǎng)絡端口,一旦有客戶請求,就會啟動一個服務進程來響應該客戶,同時自己繼續(xù)監(jiān)聽服務端口,使后來的客戶也 能及時得到服務。

          二,兩類傳輸協(xié)議:TCP;UDP

          TCP是Tranfer Control Protocol的 簡稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議傳輸,得到的是一個順序的無差錯的數(shù)據(jù)流。發(fā)送方和接收方的成對的兩個socket之間必須建 立連接,以便在TCP協(xié)議的基礎上進行通信,當一個socket(通常都是server socket)等待建立連接時,另一個socket可以要求進行連接,一旦這兩個socket連接起來,它們就可以進行雙向數(shù)據(jù)傳輸,雙方都可以進行發(fā)送 或接收操作。

          UDP是User Datagram Protocol的簡稱,是一種無連接的協(xié)議,每個數(shù)據(jù)報都是一個獨立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。

          比較:

          UDP:1,每個數(shù)據(jù)報中都給出了完整的地址信息,因此無需要建立發(fā)送方和接收方的連接。

                      2,UDP傳輸數(shù)據(jù)時是有大小限制的,每個被傳輸?shù)臄?shù)據(jù)報必須限定在64KB之內。

                     3,UDP是一個不可靠的協(xié)議,發(fā)送方所發(fā)送的數(shù)據(jù)報并不一定以相同的次序到達接收方

          TCP:1,面向連接的協(xié)議,在socket之間進行數(shù)據(jù)傳輸之前必然要建立連接,所以在TCP中需要連接

                          時間。

                      2,TCP傳輸數(shù)據(jù)大小限制,一旦連接建立起來,雙方的socket就可以按統(tǒng)一的格式傳輸大的  

                              數(shù)據(jù)。

                       3,TCP是一個可靠的協(xié)議,它確保接收方完全正確地獲取發(fā)送方所發(fā)送的全部數(shù)據(jù)。

          應用:

          1,TCP在網(wǎng)絡通信上有極強的生命力,例如遠程連接(Telnet)和文件傳輸(FTP)都需要不定長度的數(shù)據(jù)被可靠地傳輸。但是可靠的傳輸是要付出代價的,對數(shù)據(jù)內容正確性的檢驗必然占用計算機的處理時間和網(wǎng)絡的帶寬,因此TCP傳輸?shù)男什蝗鏤DP高。

          2,UDP操作簡單,而且僅需要較少的監(jiān)護,因此通常用于局域網(wǎng)高可靠性的分散系統(tǒng)中client/server應用程序。例如視頻會議系統(tǒng),并不要求音頻視頻數(shù)據(jù)絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。

          三,基于Socket的java網(wǎng)絡編程

          1,什么是Socket

          網(wǎng)絡上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現(xiàn)客戶方和服務方的連接。Socket是TCP/IP協(xié)議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號唯一確定。

          但是,Socket所支持的協(xié)議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯(lián)系的。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡編程。

          2,Socket通訊的過程

          Server端Listen(監(jiān)聽)某個端口是否有連接請求,Client端向Server 端發(fā)出Connect(連接)請求,Server端向Client端發(fā)回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。

          對于一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:

            (1) 創(chuàng)建Socket;

            (2) 打開連接到Socket的輸入/出流;

            (3) 按照一定的協(xié)議對Socket進行讀/寫操作;

            (4) 關閉Socket.(在實際應用中,并未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因為程序本身比較簡單,要求不高,所以并未造成什么影響。)

          3,創(chuàng)建Socket

          創(chuàng)建Socket

          java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:

            Socket(InetAddress address, int port);

            Socket(InetAddress address, int port, boolean stream);

            Socket(String host, int prot);

            Socket(String host, int prot, boolean stream);

            Socket(SocketImpl impl)

            Socket(String host, int port, InetAddress localAddr, int localPort)

            Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

            ServerSocket(int port);

            ServerSocket(int port, int backlog);

            ServerSocket(int port, int backlog, InetAddress bindAddr)

            其中address、host和port分別是雙向連接中另一方的IP地址、主機名和端 口號,stream指明socket是流socket還是數(shù)據(jù)報socket,localPort表示本地主機的端口號,localAddr和 bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創(chuàng)建serverSocket又可 以用來創(chuàng)建Socket。count則表示服務端所能支持的最大連接數(shù)。例如:學習視頻網(wǎng) http://www.xxspw.com

            Socket client = new Socket("127.0.01.", 80);

            ServerSocket server = new ServerSocket(80);

            注意,在選擇端口時,必須小心。每一個端口提供一種特定的服務,只有給出正確的端口,才 能獲得相應的服務。0~1023的端口號為系統(tǒng)所保留,例如http服務的端口號為80,telnet服務的端口號為21,ftp服務的端口號為23, 所以我們在選擇端口號時,最好選擇一個大于1023的數(shù)以防止發(fā)生沖突。

            在創(chuàng)建socket時如果發(fā)生錯誤,將產(chǎn)生IOException,在程序中必須對之作出處理。所以在創(chuàng)建Socket或ServerSocket是必須捕獲或拋出例外。

          4,簡單的Client/Server程序

          1. 客戶端程序

            import java.io.*;

            import java.net.*;

            public class TalkClient {

              public static void main(String args[]) {

                try{

                  Socket socket=new Socket("127.0.0.1",4700);

                  //向本機的4700端口發(fā)出客戶請求

                  BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

                  //由系統(tǒng)標準輸入設備構造BufferedReader對象

                  PrintWriter os=new PrintWriter(socket.getOutputStream());

                  //由Socket對象得到輸出流,并構造PrintWriter對象

                  BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

                  //由Socket對象得到輸入流,并構造相應的BufferedReader對象

                  String readline;

                  readline=sin.readLine(); //從系統(tǒng)標準輸入讀入一字符串

                  while(!readline.equals("bye")){

                  //若從標準輸入讀入的字符串為 "bye"則停止循環(huán)

                    os.println(readline);

                    //將從系統(tǒng)標準輸入讀入的字符串輸出到Server

                    os.flush();

                    //刷新輸出流,使Server馬上收到該字符串

                    System.out.println("Client:"+readline);

                    //在系統(tǒng)標準輸出上打印讀入的字符串

                    System.out.println("Server:"+is.readLine());

                    //從Server讀入一字符串,并打印到標準輸出上

                    readline=sin.readLine(); //從系統(tǒng)標準輸入讀入一字符串

                  } //繼續(xù)循環(huán)

                  os.close(); //關閉Socket輸出流

                  is.close(); //關閉Socket輸入流

                  socket.close(); //關閉Socket

                }catch(Exception e) {

                  System.out.println("Error"+e); //出錯,則打印出錯信息

                }

            }

          }

           2. 服務器端程序

            import java.io.*;

            import java.net.*;

            import java.applet.Applet;

            public class TalkServer{

              public static void main(String args[]) {

                try{

                  ServerSocket server=null;

                  try{

                    server=new ServerSocket(4700);

                  //創(chuàng)建一個ServerSocket在端口4700監(jiān)聽客戶請求

                  }catch(Exception e) {

                    System.out.println("can not listen to:"+e);

                  //出錯,打印出錯信息

                  }

                  Socket socket=null;

                  try{

                    socket=server.accept();

                    //使用accept()阻塞等待客戶請求,有客戶

                    
          //請求到來則產(chǎn)生一個Socket對象,并繼續(xù)執(zhí)行

                  }catch(Exception e) {

                    System.out.println("Error."+e);

                    //出錯,打印出錯信息

                  }

                  String line;

                  BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

                   //由Socket對象得到輸入流,并構造相應的BufferedReader對象

                  PrintWriter os=newPrintWriter(socket.getOutputStream());

                   //由Socket對象得到輸出流,并構造PrintWriter對象

                  BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

                   //由系統(tǒng)標準輸入設備構造BufferedReader對象

                  System.out.println("Client:"+is.readLine());

                  //在標準輸出上打印從客戶端讀入的字符串

                  line=sin.readLine();

                  //從標準輸入讀入一字符串

                  while(!line.equals("bye")){

                  //如果該字符串為 "bye",則停止循環(huán)

                    os.println(line);

                    //向客戶端輸出該字符串

                    os.flush();

                    //刷新輸出流,使Client馬上收到該字符串

                    System.out.println("Server:"+line);

                    //在系統(tǒng)標準輸出上打印讀入的字符串

                    System.out.println("Client:"+is.readLine());

                    //從Client讀入一字符串,并打印到標準輸出上

                    line=sin.readLine();

                    //從系統(tǒng)標準輸入讀入一字符串

                  }  //繼續(xù)循環(huán)

                  os.close(); //關閉Socket輸出流

                  is.close(); //關閉Socket輸入流

                  socket.close(); //關閉Socket

                  server.close(); //關閉ServerSocket

                }catch(Exception e){

                  System.out.println("Error:"+e);

                  //出錯,打印出錯信息

                }

              }

            }

          5,支持多客戶的client/server程序

          前面的Client/Server程序只能實現(xiàn)Server和一個客戶的對話。在實際應用 中,往往是在服務器上運行一個永久的程序,它可以接收來自其他多個客戶端的請求,提供相應的服務。為了實現(xiàn)在服務器方給多個客戶提供服務的功能,需要對上 面的程序進行改造,利用多線程實現(xiàn)多客戶機制。服務器總是在指定的端口上監(jiān)聽是否有客戶請求,一旦監(jiān)聽到客戶請求,服務器就會啟動一個專門的服務線程來響 應該客戶的請求,而服務器本身在啟動完線程之后馬上又進入監(jiān)聽狀態(tài),等待下一個客戶的到來。

          posted @ 2016-06-19 22:20 youngturk 閱讀(170) | 評論 (0)編輯 收藏

          java 環(huán)境變量配置

          1. java_home C:\jdk1.6.0_30 2. Path ;%java_home%\bin 3. classpath .;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar

          posted @ 2016-06-19 22:18 youngturk 閱讀(367) | 評論 (0)編輯 收藏

          JVM介紹

          http://www.cnblogs.com/sunada2005/p/3577799.html

          posted @ 2016-06-19 22:11 youngturk 閱讀(149) | 評論 (0)編輯 收藏

          關于Tomcat 6的熱部署和熱加載 轉

          http://greemranqq.iteye.com/blog/1774258 
          http://www.cnblogs.com/-lpf/p/4317281.html
          我在項目開發(fā)過程中,經(jīng)常要改動JAVA/JSP 文件,但是又不想從新啟動服務器(服務器從新啟動花時間),想直接獲得(debug)結果.有兩種方式熱部署 和熱加載:

           

          1.熱加載:在server.xml -> context 屬性中 設置 reloadable="true"

           

          Java代碼  收藏代碼
          1. <Context docBase="xxx" path="/xxx" reloadable="true"/>  

              

           

          2. 熱部署:在server.xml -> context 屬性中 設置  autoDeploy="true"

            

          Java代碼  收藏代碼
          1. <Context docBase="xxx" path="/xxx" autoDeploy="true"/>  

           

          3.區(qū)別:

                熱加載:服務器會監(jiān)聽 class 文件改變,局部進行加載,不清空session ,不釋放內存。開發(fā)中用的多,但是要考慮內存溢出的情況。

           

                熱部署: 整個項目從新部署,包括你從新打上.war 文件。 會清空session ,釋放內存。項目打包的時候用的多。

           

          也可以通過Eclipse上設置實現(xiàn)上述配置文件的修改 

          Eclipse的工程名右鍵: properties->Tomcat->General->Make this context as reloadable(reloadable="true")不要選中 Eclipse的工程名右鍵:Tomcat project->Update Context Definition

           

          注意:source 屬性有些版本不支持,容易出錯,去掉就行 

          二。

          不重啟Tomcat有兩種方式:熱部署、熱加載 
            熱部署:容器狀況在運行時重新部署整個項目。這類環(huán)境下一般整個內存會清空,重新加載,這類方式 
            有可能會造成sessin丟失等環(huán)境。tomcat 6確實可以熱部署了,而且對話也沒丟. 
            熱加載:最好是在調試過程中使用,免患上整個項目加載,Debug標準樣式支持熱加載。容器狀況在運行時重 
            新加載轉變編譯后的類。在這類環(huán)境下內存不會清空,sessin不會丟失,但容易造成內存溢出,或者找不到方 
            法。一般轉變類的布局和模型就會有異常,在已經(jīng)有的變量和方法中轉變是不會出問題的(Eclipse、 
            MyEclipse8、JBuilder、IntelliJ IDEA…)。 
            常用的一定第二種:熱加載了,設置如下! 
            在tomcat的conf中的server.xml中的host設置中添加<Context path="/test" 
            docBase="D:/develop/test" 
            debug="0" privileged="true" reloadable="true"/> 
            reloadable="true" !最重要 
            它內里有很多屬性,意義如下: 
            1>path:指定拜候該web應用的URL進口; 
            2>docBase:指定web應用的文件路徑,可以給定絕對路徑,也可以給定相對于<Host>的appBase屬性【默認 
            指向tomcat的webapps】的相對于徑;要是Web應用是個war文件,則指定war文件的路徑。 
            3>className:指定使成為事實Context組件的Java類的名字,這個Java類必須使成為事實org.apache.catalina.Context 
            接口,該屬性的默認值為org.apache.catalina.StandardContext。 
            4>reloadable:要是這個屬性設置為true,Tomcat服務器在運行狀況下會監(jiān)視在WEB-INF/classess和WEB- 
            INF/lib目次下的class文件的改動,以及監(jiān)視web應用的WEB-INF/web.xml文件的改動。要是檢測到的class 
            文件或者web.xml文件被更新,服務器會自動加載Web應用。該屬性的默認值為false.在web應用的開發(fā)和調 
            試階段,把reloadable設為true,可以方便對web應用的調試。在web應用正式發(fā)布階段,把reloadable設為 
            false,可以減低tomcat的運行負荷,提高Tomcat的運行性能。 
            5>cachingAllowed:要是為true,標示允許啟用靜態(tài)資源的緩存。使用緩存能提高拜候靜態(tài)資源的效率。 
            tomcat把那一些時常被客戶端拜候的靜態(tài)資源(如:HTML文檔、圖片文件和聲響文件等)放在緩存中,當客戶再 
            次拜候有關靜態(tài)資源時,Tomcat只需直接從緩存中讀取相關數(shù)據(jù),無須反復讀取文件系統(tǒng)中的文件。該屬 
            性的默認值為true. 
            6>cacheMaxSize:設定靜態(tài)資源的緩存的最大容量,以K為單元。要是,要是該屬性為100,表示100K,默認 
            為10240(即10M)。 
            7>workDir:指定web應用的工作目次。Tomcat在運行時會把與這個web應用相關的臨應試文章件放在此目次下。 
            8>uppackWar:要是此項設為true,表示將把web應用的war文件睜開為開放目次布局后再運行。要是設為 
            false,則直接運行war文件。該屬性的默認值為true。 
            同志們,使用tomcat6.0的注意了啊。當你使用我的方法設置tomcat后,你的myeclipse報如下錯誤時,不要驚慌,這是正確的,且聽我解釋。 
            console報錯: 
            警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ' debug' to '0' did not find a matching property. 這是由于你使用的是tomcat6.0,由于它路程經(jīng)過過程其他途徑對debug="0"這個屬性進行了使成為事實,所以這搭不能再有此屬性。你只要將它去掉,就能夠沒事了啟動了。 也就是說去掉debug="0“,萬事OK,呵呵。 


          (轉)

          -------------------------------------------------------------

          針對需要重新啟動tomcat的服務,重新啟動方式為:

          安裝版:tomcat/bin/shotdown.bat      關閉tomcat服務

                    tomcat/bin/startup.bat         開啟tomcat服務

          或者-->我的電腦-->管理-->服務和應用程序/服務-->找到Apache Tomcat重啟

          posted @ 2016-06-19 21:03 youngturk 閱讀(282) | 評論 (0)編輯 收藏

          apache tomcat mod_js配置整合,

          http://blog.sina.com.cn/s/blog_3c9872d00102w00y.html
          Apache與Tomcat整合應用是一個老話題,不算新技能,但對非運維人員在配置過程中或許也會遇到一些問題。這里只是把自己多回配置的過程做一個摘錄,供自己翻閱并望對過路的人有用。
          Apache是當下在Windows、Unix、Linux 等操作系統(tǒng)中最流行的Web服務器軟件之一,其反應速度快、運行效率高,不僅支持HTML等靜態(tài)頁面,在加載插件后也可支持 PHP 頁面等。Tomcat是Apache軟件基金協(xié)會與Sun公司聯(lián)合開發(fā)的Web服務器,除支持HTML靜態(tài)頁面外,還是JSP、Servlet等JAVA WEB應用的服務器。在相同運行環(huán)境下,Tomcat對靜態(tài)頁面的反應速度沒有Apache靈敏,整合 Apache與Tomcat能使系統(tǒng)運行于一個良好環(huán)境下,實現(xiàn)JAVA的動態(tài)與靜態(tài)頁面分離,不僅讓系統(tǒng)更安全,同時也可提高系統(tǒng)效率。

          一、JAVA應用基礎架構

          通用的JAVA應用架構如下,包括WEB Server、APP Server和DB Server三個部分:
          Apache和Tomcat整合配置實現(xiàn)JAVA應用的“動靜”分離
          1、WEB Server
          WEB Server置于企業(yè)防火墻外,這個防火墻也可以認為是一個CISCO路由器,在CISCO路由器上開放兩個端口為:80和443,其中:
          80端口:用于正常的http訪問
          443端口:用于https訪問,即如果你在ie里打入https://xxx.xxx.xx這樣的地址,默認走的是443這個端口
          WebServer專門用于解析HTML、JS(JavaScript)、CSS、JPG/GIF等圖片格式文件、TXT、VBSCRIPT、PHP等“靜態(tài)”網(wǎng)頁內容。
          2、APP Server
          APP Server置于企業(yè)防火墻內,它和Web Server之間的連接必須且一定為內部IP連接。App Server用于解析我們的任何需要Java編譯器才能解析的“動態(tài)”網(wǎng)頁,其實App Server本身也能解析任何靜態(tài)網(wǎng)頁的。在應用中我們這樣來想一下:我們讓負責專門解析靜態(tài)網(wǎng)頁的Web Server來解析html等內容,而讓App Server專門用于解析任何需要Java編譯器才能解析的東西,讓它們各司其職。這樣作的好處:
            1)為App Server“減壓”,同時也提高了性能;
            2)不用再把8080這個端口暴露在internet上,也很安全,畢竟我們的App Server上是有我們的代碼的,就算是編譯過的代碼也容易被“反編譯”,這是很不安全的;
            3)為將來進一步的“集群擴展”打好了基礎。
          3、DB Server
           比方說我們用MySQL,它需要通過3306與App Server進行連接,那么這個1521我們稱為數(shù)據(jù)庫連接端口,如果把它暴露在Internet上就比較危險,就算密碼很復雜,但 對于高明的黑客來說,要攻破你的口令也只是時間上的問題而己。因此我們把我們的DB Server也和App Server一樣,置于內網(wǎng)的防火墻,任何的DB連接與管理只能通過內網(wǎng)來訪問。
          二、系統(tǒng)安裝與配置
          系統(tǒng)安裝包括MySQL的安裝,WEB Server即Apache的安裝,App Server即Tomcat的安裝。關于這三個系統(tǒng)安裝網(wǎng)上相關的文檔很多,此處略去。以下主要摘錄需要重點配置的內容。
          1、Apache的配置
          做技術的人應該都會Apache的基礎配置,如果不會確實需要學一學。
          Apache的配置主要集中在httpd.conf文件中,它位于Apache的安裝目錄下,比如我的是在“C:\webserver\apache\apache22\conf”目錄下。用Ultraedit或Notepad++編輯器打開文件,通常需要修改的內容包括ServerName、DocumentRoot、VirtualHost內容等。此處我修改的內容包括:
          1)DocumentRoot原目錄為C:/webserver/apache/apache22/htdocs,修改為D:/WWW/apache/htdocs,將網(wǎng)站發(fā)布路徑與Apache安裝路徑分開;
          2)找到如下紅色標示內容:
              Options FollowSymLinks
              AllowOverride None
              Order deny,allow
              deny from all
          把這個”deny from all”改成”allow fromall’。
              Options FollowSymLinks
              AllowOverride None
              Order deny,allow
              allow from all
          以免訪問Apache根目錄下的文件時出現(xiàn)以下錯誤提示:
          Apache和Tomcat整合配置實現(xiàn)JAVA應用的“動靜”分離
          3)再找到下面這樣的行
          Options FollowSymLinks indexes
          把它注掉改成下面這樣
          #Options FollowSymLinks indexes
          Options None
          以免在訪問Apache目錄時出現(xiàn)直接列表顯示子目錄或目錄下文件的不安全情況,如下圖樣子:
          Apache和Tomcat整合配置實現(xiàn)JAVA應用的“動靜”分離
          以上配置修改完成后重啟Apache服務,保證要能正常運行。
          三、Apache與Tomcat的整合配置
          Apache(Web Server)負責處理HTML靜態(tài)內容,Tomcat(App Server)負責處理動態(tài)內容;原理圖如下:
          Apache和Tomcat整合配置實現(xiàn)JAVA應用的“動靜”分離
          上述架構的原理是: 在Apache中裝載一個模塊,這個模塊叫mod_jk; Apache通過80端口負責解析任何靜態(tài)web內容; 任何不能解析的內容,用表達式告訴mod_jk,讓mod_jk派發(fā)給相關的App Server去解釋。
          因此,首先把 mod_jk-1.2.31-httpd-2.2.3(可從網(wǎng)上搜索下載該模塊,如http://download.csdn.net/detail/shangkaikuo/4494837)拷貝到 "/Apache2.2/modules" 目錄下。接下來:
          1、添加workers.properties文件
          在 “/Tomcat 8.0/conf ” 文件夾下(也可以是其它目錄下)增加 workers.properties 文件,輸入以下內容。(將其中相應目錄替換成自己本地tomcat或jre安裝目錄)
           #讓mod_jk模塊認識Tomcat
           workers.tomcat_home=d:/webserver/tomcat/tomcat8
           #讓mod_jk模塊認識JRE
           workers.java_home=C:/java/jdk1.8.0_45/jre
           #指定文件路徑分割符
           ps=/
           ##
           #工作端口,此端口應該與server.xml中Connector元素的AJP/1.3協(xié)議所使用的端口相匹配
           worker.list=AJP13
           worker.AJP13.port=8009
           #Tomcat服務器的地址
           worker.AJP13.host=localhost
           #類型
           worker.AJP13.type=ajp13
           #負載平衡因數(shù)
           worker.AJP13.lbfactor=1

          **注意:worker.list=AJP13中,AJP13為自定義名稱,但此名稱必須與下文所述的 “/Apache 2.2/conf/httpd.conf ” 文件中,JkMount指令對應的名稱相匹配。
          2、httpd.conf文件中添加配置內容
          加入workers.properties文件后,可修改 “/Apache 2.2/conf/httpd.conf ” 文件,加入以下配置,注意JkMount指令中的變量必須與worker.list所配置的名稱相同。

          # 此處mod_jk-1.2.31-httpd-2.2.3文件為你下載的文件
          LoadModule  jk_module  modules/mod_jk-1.2.31-httpd-2.2.3.so
          # 指定tomcat監(jiān)聽配置文件地址
          JkWorkersFile  "C:/webserver/tomcat/tomcat8/conf/workers.properties"
          #JkWorkersFile  "C:/webserver/apache/apache22/conf/workers.properties"
          # 指定日志存放位置
          JkLogFile  "C:/webserver/tomcat/tomcat8/logs/mod_jk2.log"
          JkLogLevel  info
          -virtualhost *-
              ServerName  localhost
              DocumentRoot  "C:/webserver/tomcat/tomcat8/webapps"
              DirectoryIndex  index.html index.htm index.jsp index.action
              ErrorLog  logs/shsc-error_log.txt
              CustomLog  logs/shsc-access_log.txt common
              JkMount  /*WEB-INF AJP13
              JkMount  /*j_spring_security_check AJP13
              JkMount  /*.action AJP13
              JkMount  /servlet/* AJP13
              JkMount  /*.jsp AJP13
              JkMount  /*.do AJP13
              JkMount  /*.action AJP13
          -/virtualhost-

          上述配置中的紅色內容是為了告訴Apache哪些交給Tomcat去處理,其它的都交由Apache自身去處理。
          其中綠色的兩句比較關鍵,分別告訴:Apache載入一個額外的插件,用于連接tomcat;  連接時的配置參數(shù)描述位于Tomcat安裝目錄的/conf目錄下的一個叫workers.properties文件中,mod_jk一般使用ajp13協(xié)議連接,使用的是tomcat的8009端口。
          完成以上配置后,重啟 Apache、Tomcat。此時Apache、Tomcat的默認目錄為 "C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps ”,Apache使用默認的80端口、Tomcat端口改成1080或其它非8080默認端口(修改是為了安全,也可以不用修改)。在Tomcat默認目錄下添加test目錄,在該目錄下加入index.jsp頁面,然后通過http://localhost/test/index.jsp試試是否可以正常訪問,如頁面可正常訪問,證明整合配置已經(jīng)成功。
          至此,似乎整個配置工作已經(jīng)完成,但是如果你想試著把靜態(tài)的HTML頁面放到Apache的htdocs發(fā)布目錄下,把JSP等動態(tài)內容放到Tomcat的webapps目錄下(該目錄下不存放*.html文件),然后通過http://localhost/index.html想訪問Apache目錄下的內容,你會發(fā)現(xiàn)404之類的不能訪問的錯誤。如何解決,這里暫時賣個關子.......如果你能看出問題,能容易解決掉,就誠摯為你點個贊!
           

          posted @ 2016-06-19 20:42 youngturk 閱讀(218) | 評論 (0)編輯 收藏

          關于Tomcat和Tomcat的面試問題

          http://www.jfox.info/guan-yu-Tomcat-he-Tomcat-de-mian-shi-wen-ti 
          http://www.jfox.info/guan-yu-Tomcat-he-Tomcat-de-mian-shi-wen-ti

          關于Tomcat和Tomcat的面試問題

          一、Tomcat的缺省是多少,怎么修改

          Tomcat的缺省端口號是8080.
          修改Tomcat端口號:
          1.找到Tomcat目錄下的conf文件夾
          2.進入conf文件夾里面找到server.xml文件
          3.打開server.xml文件
          4.在server.xml文件里面找到下列信息
          maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
          enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
          connectionTimeout=”20000″ disableUploadTimeout=”true” />
          5.把port=”8080″改成port=”8888″,并且保存
          6.啟動Tomcat,并且在IE瀏覽器里面的地址欄輸入http://127.0.0.1:8888/

          7、tomcat默認采用的BIO模型,在幾百并發(fā)下性能會有很嚴重的下降。tomcat自帶還有NIO的模型,另外也可以調用APR的庫來實現(xiàn)操作系統(tǒng)級別控制。
            NIO模型是內置的,調用很方便,只需要將上面配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。如下面的參數(shù)配置,默認的是HTTP/1.1。
              <Connector port=”8080″  
                         protocol=”org.apache.coyote.http11.Http11NioProtocol” 
                         connectionTimeout=”20000″ 
                         redirectPort=”8443″  
                         maxThreads=”500″  
                         minSpareThreads=”20″ 
                         acceptCount=”100″
                         disableUploadTimeout=”true”
                         enableLookups=”false”  
                         URIEncoding=”UTF-8″ />

          二、tomcat 如何優(yōu)化?

           1、優(yōu)化連接配置.這里以tomcat7的參數(shù)配置為例,需要修改conf/server.xml文件,修改連接數(shù),關閉客戶端dns查詢。

          參數(shù)解釋:

           URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里還有搞個mod_encoding,還要手工編譯

           maxSpareThreads : 如果空閑狀態(tài)的線程數(shù)多于設置的數(shù)目,則將這些線程中止,減少這個池中的線程總數(shù)。

           minSpareThreads : 最小備用線程數(shù),tomcat啟動時的初始化的線程數(shù)。

           enableLookups : 這個功效和Apache中的HostnameLookups一樣,設為關閉。

           connectionTimeout : connectionTimeout為網(wǎng)絡連接超時時間毫秒數(shù)。

           maxThreads : maxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創(chuàng)建的最大的線程數(shù),即最大并發(fā)數(shù)。

           acceptCount : acceptCount是當線程數(shù)達到maxThreads后,后續(xù)請求會被放入一個等待隊列,這個acceptCount是這個隊列的大小,如果這個隊列也滿了,就直接refuse connection

           maxProcessors與minProcessors : 在 Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閑時間保持最低,從而接受更多的請求。

          通常Windows是1000個左右,Linux是2000個左右。

           useURIValidationHack:

          我們來看一下tomcat中的一段源碼:

          【security】

                  if (connector.getUseURIValidationHack()) {

                      String uri = validate(request.getRequestURI());

                      if (uri == null) {

                          res.setStatus(400);

                          res.setMessage(“Invalid URI”);

                          throw new IOException(“Invalid URI”);

                      } else {

                          req.requestURI().setString(uri);

                          // Redoing the URI decoding

                          req.decodedURI().duplicate(req.requestURI());

                          req.getURLDecoder().convert(req.decodedURI(), true);

          可以看到如果把useURIValidationHack設成”false”,可以減少它對一些url的不必要的檢查從而減省開銷。

           enableLookups=”false” : 為了消除DNS查詢對性能的影響我們可以關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數(shù)值。

           disableUploadTimeout :類似于Apache中的keeyalive一樣

          給Tomcat配置gzip壓縮(HTTP壓縮)功能

          compression=”on” compressionMinSize=”2048″

          compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

          HTTP 壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶端請求網(wǎng)頁后,從服務器端將網(wǎng)頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮并瀏覽。相對于普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節(jié)省40%左右的流量。更為重要的是,它可以對動態(tài)生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁也能進行壓縮,壓縮效率驚人。

          1)compression=”on” 打開壓縮功能

          2)compressionMinSize=”2048″ 啟用壓縮的輸出內容大小,這里面默認為2KB

          3)noCompressionUserAgents=”gozilla, traviata” 對于以下的瀏覽器,不啟用壓縮

          4)compressableMimeType=”text/html,text/xml” 壓縮類型

          最后不要忘了把8443端口的地方也加上同樣的配置,因為如果我們走https協(xié)議的話,我們將會用到8443端口這個段的配置,對吧?

          <!–enable tomcat ssl–>

              <Connector port=”8443″ protocol=”HTTP/1.1″

                         URIEncoding=”UTF-8″  minSpareThreads=”25″ maxSpareThreads=”75″

                    enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″

                    acceptCount=”300″  maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″

                    useURIValidationHack=”false”

                              compression=”on” compressionMinSize=”2048″

                              compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

                          SSLEnabled=”true”

                     scheme=”https” secure=”true”

                     clientAuth=”false” sslProtocol=”TLS”

                     keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”

                />

          好了,所有的Tomcat優(yōu)化的地方都加上了。

          2、優(yōu)化JDK
          Tomcat默認可以使用的內存為128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下設置:
          JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化內存大小] -Xmx[可以使用的最大內存]

          設置環(huán)境變量:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化內存大小] -Xmx[可以使用的最大內存]”
          一般說來,你應該使用物理內存的 80% 作為堆大小。如果本機上有Apache服務器,可以先折算Apache需要的內存,然后修改堆大小。建議設置為70%;建議設置[[初始化內存大小]等于[可以使用的最大內存],這樣可以減少平凡分配堆而降低性能。
          本例使用加入環(huán)境變量的方式:
          # vi /etc/profile
          加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700
          # source /etc/profile

          【參數(shù)說明】

          -Xms 是指設定程序啟動時占用內存大小。一般來講,大點,程序會啟動的 快一點,但是也可能會導致機器暫時間變慢。

          -Xmx 是指設定程序運行期間最大可占用的內存大小。如果程序運行需要占 用更多的內存,超出了這個設置值,就會拋出OutOfMemory 異常。

          -Xss 是指設定每個線程的堆棧大小。這個就要依據(jù)你的程序,看一個線程 大約需要占用多少內存,可能會有多少線程同時運行等。

          -XX:PermSize設置非堆內存初始值,默認是物理內存的1/64 。

          -XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。

          三、tomcat 有那幾種Connector 運行模式?

          tomcat的運行模式有3種.修改他們的運行模式.3種模式的運行是否成功,可以看他的啟動控制臺,或者啟動日志.或者登錄他們的默認頁面http://localhost:8080/查看其中的服務器狀態(tài)。

          1)bio

          默認的模式,性能非常低下,沒有經(jīng)過任何優(yōu)化處理和支持.

          2)nio

          利用java的異步io護理技術,no blocking IO技術.

          想運行在該模式下,直接修改server.xml里的Connector節(jié)點,修改protocol為

           <Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol”
              connectionTimeout=”20000″
              URIEncoding=”UTF-8″
              useBodyEncodingForURI=”true”
              enableLookups=”false”
              redirectPort=”8443″ />

          啟動后,就可以生效。

          3)apr

          安裝起來最困難,但是從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能.

          必須要安裝apr和native,直接啟動就支持apr。下面的修改純屬多余,僅供大家擴充知識,但仍然需要安裝apr和native

          如nio修改模式,修改protocol為org.apache.coyote.http11.Http11AprProtocol

          posted @ 2016-06-19 10:31 youngturk 閱讀(407) | 評論 (0)編輯 收藏

          spring httpInvoke 解決遠程調用遠程的類的方法

          http://zhidao.baidu.com/link?url=6FrnwvBQEZhjM-ooNCuiAra7T6qi9FsFhFvkHBKaOjqovZR86OCsIePi-05nM-fxRrlInEGbElSxlhgO6X7JsaGNdQdNrQ2xE58wglgeQO3 http://blog.csdn.net/liaq325/article/details/8281550 摘自以上 spring httpInvoke

          spring httpInvoke 基于spring架構的服務器之間的遠程調用實現(xiàn)。通過spring httpInvoke,可以調用遠程接口,進行數(shù)據(jù)交互、業(yè)務邏輯操作

          服務器端:(被調用一方)

          [java] view plain copy
          1. public  class User implements Serializable{//必須實現(xiàn)serializable接口,遠程調用的基礎  
          2.     private String username;  
          3.     private Date birthday;  
          4.     //構造方法  
          5.     //set get 方法  
          6. }  
          7. public interface UserService{  
          8.     User getUser(String username);  
          9. }  
          10. public UserServiceImpl implements UserService{  
          11.     //實現(xiàn)userService  
          12. }  
          重要的配置文件來了。。。。
          remote-servlet.xml放在項目根目錄下面,跟web.xml相同的級別

          暴露給調用端:服務的實現(xiàn),接口

          [html] view plain copy
          1. <bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">  
          2.     <property name="service">  
          3.         <bean class="com.cd.Liaq.UserServiceImpl"/>  
          4.     </property>  
          5.     <property name="serviceInterface">  
          6.         <value>com.cd.Liaq.UserService</value>  
          7.     </property>  
          8. </bean>  
          暴露了服務的實現(xiàn)和接口,那么怎么訪問服務呢?
          spring封裝訪問url

          [html] view plain copy
          1. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
          2.     第一種:<property name="urlMap">  
          3.         <map>  
          4.             <entry key="TestUser" value-ref="userService"/>  
          5.         </map>  
          6.     </property>  
          7.     第二種:<prop key="/TestUser">userService</prop>  
          8. </bean>  
          web.xml:配置dispatcherServlet共調用一方使用

          [html] view plain copy
          1. <!-- spring遠程調用 -->  
          2. <servlet>  
          3.     <servlet-name>remote</servlet-name>  
          4.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
          5.     <load-on-startup>1</load-on-startup>  
          6. </servlet>  
          7. <servlet-mapping>  
          8.     <servlet-name>remote</servlet-name>  
          9.     <url-pattern>/remoting/*</url-pattern>  
          10. </servlet-mapping>  
          到處為止:被調用端一方完畢!!!!
          客戶端調用:

          [html] view plain copy
          1. <!-- 通過http連接遠程系統(tǒng) -->  
          2. <bean id="memberService"  
          3.     class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
          4.     <property name="serviceUrl">  
          5.         <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>  
          6.     </property>  
          7.     <property name="serviceInterface">  
          8.         <value>com.cd.Liaq.UserService</value>  
          9.     </property>  
          10. </bean>  
          通過spring容器調用UserService,用到HttpInvokerProxyFactoryBean工廠,配置serviceUrl和serviceInterface
          為了提高效率:客戶端使用Commons-HttpClient,導入改包,改寫配置

          [html] view plain copy
          1. <bean id="memberService"  
          2.     class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
          3.     <property name="serviceUrl">  
          4.         <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>  
          5.     </property>  
          6.     <property name="serviceInterface">  
          7.         <value>com.cd.Liaq.UserService</value>  
          8.     </property>  
          9.      <property name="httpInvokerRequestExecutor"> //使用指定的執(zhí)行器執(zhí)行  
          10.         <ref bean="httpInvokerRequestExecutor" />    
          11.     </property>    
          12. </bean>  
          13. <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">    
          14.     <property name="httpClient">    
          15.         <bean class="org.apache.commons.httpclient.HttpClient">    
          16.             <property name="connectionTimeout" value="2000" />    
          17.             <property name="timeout" value="5000" />    
          18.         </bean>    
          19.     </property>    
          20. </bean>    

          配置超時時間timeout和連接超時connectionTimeout兩個屬性
          優(yōu)化執(zhí)行器:多線程===被調用端響應時間縮短很多

          [html] view plain copy
          1. <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">    
          2.     <property name="httpClient">    
          3.         <bean class="org.apache.commons.httpclient.HttpClient">    
          4.             <property name="connectionTimeout" value="2000" />    
          5.             <property name="timeout" value="5000" />    
          6.             <property  name="httpConnectionManager">//控制連接  
          7.                     <ref  bean="multiThreadedHttpConnectionManager" />    
          8.             </property>    
          9.         </bean>    
          10.     </property>    
          11. </bean>    
          12. <bean id="multiThreadedHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">    
          13.     <property name="params">    
          14.         <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">    
          15.             <property name="maxTotalConnections"  value="600" />    
          16.             <property name="defaultMaxConnectionsPerHost" value="512" />    
          17.         </bean>    
          18.     </property>    
          19. </bean>    
          httpClient的3.1版本不支持這種配置

          [html] view plain copy
          1. <property  name="connectionTimeout" value="2000" />      
          2. <property  name="timeout"  value="5000" />    

          另外httpClient本身也是多線程的。。HttpClient that uses a default MultiThreadedHttpConnectionManage
          <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">  
              <property  name="maxTotalConnections"  value="600" />  
              <property  name="defaultMaxConnectionsPerHost"  value="512" />  
          </bean>  
          maxConnectionsPerHost 每個主機的最大并行鏈接數(shù),默認為2 
          public static final int DEFAULT_MAX_HOST_CONNECTIONS = 2; 
          maxTotalConnections 客戶端總并行鏈接最大數(shù),默認為20  
          public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20; 

          posted @ 2016-06-19 10:29 youngturk 閱讀(2261) | 評論 (0)編輯 收藏

          6. 分布式緩存集群環(huán)境配置 轉

               摘要: http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.htmlhttp://www.cnblogs.com/hellowood23/p/5210267.htmlhttp://blog.csdn.net/ni_hao_ya/article/details/9344779http://www.cnblogs.com/hellowood23/p/...  閱讀全文

          posted @ 2016-06-19 00:22 youngturk 閱讀(180) | 評論 (0)編輯 收藏

          手動獲取spring的ApplicationContext和bean對象

          WEB項目:

          方法1:

          1
          ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)

           方法2:

          1
          ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)

           方法3:

          1
          寫一個工具類類繼承ApplicationObjectSupport,并將這個加入到spring的容器

           方法4:

          1
          寫一個工具類類繼承WebApplicationObjectSupport,并將這個加入到spring的容器

           方法5:(推薦)

          1
          寫一個工具類實現(xiàn)ApplicationContextAware接口,并將這個加入到spring的容器

           示例:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          import java.util.Map;
          import org.springframework.beans.BeansException;
          import org.springframework.context.ApplicationContext;
          import org.springframework.context.ApplicationContextAware;
           
          /**
           * 獲取ApplicationContext和Object的工具類
           * @author yzl
           *
           */
          @SuppressWarnings({ "rawtypes", "unchecked" })
          public class SpringContextUtils implements ApplicationContextAware {
              private static ApplicationContext applicationContext;
           
              public void setApplicationContext(ApplicationContext arg0)
                      throws BeansException {
                  applicationContext = arg0;
              }
           
              /**
               * 獲取applicationContext對象
               * @return
               */
              public static ApplicationContext getApplicationContext(){
                  return applicationContext;
              }
               
              /**
               * 根據(jù)bean的id來查找對象
               * @param id
               * @return
               */
              public static Object getBeanById(String id){
                  return applicationContext.getBean(id);
              }
               
              /**
               * 根據(jù)bean的class來查找對象
               * @param c
               * @return
               */
              public static Object getBeanByClass(Class c){
                  return applicationContext.getBean(c);
              }
               
              /**
               * 根據(jù)bean的class來查找所有的對象(包括子類)
               * @param c
               * @return
               */
              public static Map getBeansByClass(Class c){
                  return applicationContext.getBeansOfType(c);
              }
          }

           

           

          非WEB項目

          1
          ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml")

          可選的操作方法有:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          一:
          String[]   path={"WebRoot/WEB-INF/applicationContext.xml","WebRoot/WEB-INF/applicationContext_task.xml"};
          ApplicationContext context = new FileSystemXmlApplicationContext(path);
           
          二:
          String path="WebRoot/WEB-INF/applicationContext*.xml";
          ApplicationContext context = new FileSystemXmlApplicationContext(path);
           
          三:
          ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:地址");
          沒有classpath的話就是從當前的工作目錄

          posted @ 2016-06-18 23:56 youngturk 閱讀(271) | 評論 (0)編輯 收藏

          Ehcache學習 轉

               摘要: http://ligf06.iteye.com/blog/17108875.    在 Spring 中運用 EHCache需要使用 Spring 來實現(xiàn)一個 Cache 簡單的解決方案,具體需求如下:使用任意一個現(xiàn)有開源 Cache Framework,要求使用 Cache 系統(tǒng)中 Service 或則 DAO 層的...  閱讀全文

          posted @ 2016-06-18 15:45 youngturk 閱讀(150) | 評論 (0)編輯 收藏

          僅列出標題
          共33頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統(tǒng)計

          公告

          this year :
          1 jQuery
          2 freemarker
          3 框架結構
          4 口語英語

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          EJB學習

          Flex學習

          learn English

          oracle

          spring MVC web service

          SQL

          Struts

          生活保健

          解析文件

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 临颍县| 永善县| 伊宁县| 石柱| 德阳市| 阳原县| 郁南县| 抚顺县| 龙井市| 吴江市| 托克逊县| 周口市| 独山县| 育儿| 汨罗市| 象山县| 靖宇县| 白山市| 环江| 同心县| 马公市| 崇左市| 玉环县| 迁安市| 江门市| 从化市| 浦东新区| 龙胜| 出国| 舞钢市| 柘荣县| 桓仁| 东方市| 河津市| 桐梓县| 和田县| 寿阳县| 大城县| 清苑县| 伊川县| 高要市|